워게임

Dreamhack - basic_rop_x86 (Write up)

HackHiJack 2021. 7. 25. 23:02
728x90
반응형

오늘은 드림핵의 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를 짜고 실행을 한다면 쉘 획득에 성공을 하는 것을 알수 있다.(하지만 따로 익스 코드 공개는 하지 않겠다.)

728x90
반응형