오늘은 드림핵의 basic_rop_x86 문제를 풀어볼 것이다.
일단 아래는 문제 코드이다.
#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;
}
문제 파일에는 바이너리, C, libc.so.6 이렇게 3개가 있다.
rop에는 read, write 함수를 이용할 것이다.
우리가 구해야 할 것은 아래와 같다.
1. .bss 주소
2. pppr gadget address
3. read, system offset
4. ret까지 채워야하는 바이트 수
1. .bss address
objdump -h basic_rop_x86
위 명령어를 이용해서 .bss를 구한다.
22 .got 00000004 08049ffc 08049ffc 00000ffc 2**2
CONTENTS, ALLOC, LOAD, DATA
23 .got.plt 0000002c 0804a000 0804a000 00001000 2**2
CONTENTS, ALLOC, LOAD, DATA
24 .data 00000008 0804a02c 0804a02c 0000102c 2**2
CONTENTS, ALLOC, LOAD, DATA
25 .bss 0000000c 0804a040 0804a040 00001034 2**5
ALLOC
위처럼 .bss의 주소가 0x0804a040인걸 알수있다.
2. pppr gadget address
gdb-peda의 ropgadget함수를 이용해서 구한다.
pop pop pop ret 가젯의 위치가 0x08048689인걸 알아냈다.
3. read, system offset
일단 libc.so.6에 실행권한을 주고 gdb로 실행시킨다.
그 다음 run을 하고 read-system을 출력하면 된다.
read,system 함수의 offset은 0x99a10인걸 알수 있다.
4. ret까지 채워야 바이트 수
stack을 확인하면 아래와같다.
buf[64]
sfp[4]
ret[4]
그러면 총 72바이트를 채우면 된다.
이제 위 4개를 모두 구했으니 본격적으로 /bin/sh를 실행 시킬코드를 짜야한다.
1. write를 이용해서 read함수 주소를 leak
2. read를 이용해서 bss에 /bin/sh 문자열 저장
3. read를 이용해서 system함수 주소를 write_got에 저장
4. write_got을 이용해서 .bss 실행
system = read - read, system offset 을 이용하여 system 주소를 구한다.
위의 내용으로 짠 코드
1. write(1,read_got,4)
2. read(0,.bss,8). #input "/bin/sh\x00"
3. read(0,write_got,4) #input system address
4. system(.bss) # "/bin/sh" in .bss
이런식으로 payload 를 짠다.
그리고 payload 를 전송하고, read 함수 주소를 받는다.
그리고 2. read에 "/bin/sh\x00"을 보내고, 3. read에 system address를 넣는다.
위 처럼 하면 쉘 획득이 가능하다.
위를 토대로 exploit code를 짜고 실행을 한다면 쉘 획득에 성공을 하는 것을 알수 있다.(하지만 따로 익스 코드 공개는 하지 않겠다.)
'워게임' 카테고리의 다른 글
HackCTF - 내 버퍼가 흘러넘친다!!!!(writeup) (0) | 2021.07.26 |
---|---|
Dreamhack - basic_exploitation_000 (writeup) (0) | 2021.07.26 |
Webhacking.kr - 26번 문제 (0) | 2021.02.06 |
Webhacking.kr - 17번 문제 (0) | 2021.01.30 |
Webhacking.kr - 14번 문제 (0) | 2021.01.24 |