#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;
}
이번에는 ret2main 기법을 사용하고 "/bin/sh" 문자열을 bss 영역에 쓰는 익스를 짜보자
bss 영역은 고정된 위치에 데이터를 넣을 필요가 있을때 bss 영역을 사용한다.
ASLR은 code, data, bss 영역을 제외한 스택, 힙, 라이브러리 주소를 램덤화한다. 따라서 bss 영역은 고정되어있다.
bss 영역은 프로그램이 시작될 때 모두 0으로 초기화 되어 깔끔하다 ㅎㅎ
위 명령어를 통해 bss 영역 시작 주소와 크기를 알 수 있다.
bss 시작 주소는 0x804a040 이고 크기는 0xc 이다.
bss 영역에 쓰기(w) 권한이 있다. 따라서 bss 시작 주소에 "/bin/sh" 입력하고 system 함수 인자값으로 bss 시작 주소 값을 넣으면 system("/bin/sh") 이 실행된다.
성공!
GOT 주소에 쓰기(w) 권한이 없을때 bss 영역을 이용하면 된다!
'Dreamhack - pwnable' 카테고리의 다른 글
PIE (Position-Independent Executable) (0) | 2023.01.16 |
---|---|
RELRO (RELocation Read-Only) (0) | 2023.01.16 |
basic_rop_x86 (GOT Overwrite) (0) | 2023.01.15 |
basic_rop_x64 (ret2main) (0) | 2023.01.15 |
basic_rop_x64 (GOT Overwrite) (0) | 2023.01.14 |