#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] 에서 puts 함수를 이용해 puts의 실제 주소를 가져오는 코드와 main함수를 실행하는 코드를 넣는다.
main이 다시 실행될 때 이미 system 함수 주소와 /bin/sh 주소를 알아 main에서 read를 실행시켜 대기하고 있으면 [2] payload를 send 한다. 따라서 system이 실행됨
성공
알게 된 점
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 |