basic_rop_x64 (ret2main)

oogu ㅣ 2023. 1. 15. 11:16

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

basic_rop_x64 문제를 ret2main 기법으로 풀어보자

ret2main 기법은 main 함수를 2번 호출하는 방법이다.

첫 번째 payload는 libc base 구하고 ret를 main으로 줘서 main이 한 번 더 돌게 한다.

두 번 째 payload에서 ret에 system 함수를 넣어 쉘을 실행한다.

 

[그림 1-1]

[1] 에서 puts 함수를 이용해 puts의 실제 주소를 가져오는 코드와 main함수를 실행하는 코드를 넣는다.

main이 다시 실행될 때 이미 system 함수 주소와 /bin/sh 주소를 알아 main에서 read를 실행시켜 대기하고 있으면 [2] payload를 send 한다. 따라서 system이 실행됨

[그림 1-2]

 

성공

 

알게 된 점

1. 라이브러리 주소를 알 때 -> ld + next(libc.search("/bin/sh")) 하면 라이브러리에 있는 /bin/sh 주소를 알 수 있다.

'Dreamhack - pwnable' 카테고리의 다른 글

basic_rop_x86 (ret2main + bss 쓰기)  (0) 2023.01.15
basic_rop_x86 (GOT Overwrite)  (0) 2023.01.15
basic_rop_x64 (GOT Overwrite)  (0) 2023.01.14
Return Oriented Programming  (0) 2023.01.13
Return to Library  (0) 2023.01.11