#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;
}

위는 문제의 소스코드다.

Untitled

보호기법으로 NX, Partial RelR0가 걸려있다.

NX가 걸려잇기에 스택에 실행 권한이 없다.

Partial RelR0로 인해 .init_array와 .fini_array에 대한 쓰기 권한이 제거되어 있어 공격을 수행하기 어렵다.

하지만 got.plt 은 쓰기 권한이 있으므로 GOT_OverWrite 공격을 수행할 수 있다.

Untitled

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