#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[0x40] = {};
initialize();
read(0, buf, 0x400);
write(1, buf, sizeof(buf));
return 0;
}
위는 문제의 소스코드다.
보호기법으로 NX, Partial RelR0가 걸려있다.
NX가 걸려잇기에 스택에 실행 권한이 없다.
Partial RelR0로 인해 .init_array
와 .fini_array
에 대한 쓰기 권한이 제거되어 있어 공격을 수행하기 어렵다.
하지만 got.plt 은 쓰기 권한이 있으므로 GOT_OverWrite 공격을 수행할 수 있다.
0x0804868b : pop ebp ; ret
0x08048688 : pop ebx ; pop esi ; pop edi ; pop ebp ; ret
0x080483d9 : pop ebx ; ret
0x0804868a : pop edi ; pop ebp ; ret
0x08048689 : pop esi ; pop edi ; pop ebp ; ret