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

간단하게 read_flag함수를 실행시키면 flag의 내용을 출력해줄 수 있다.
main함수에서는 buf에 gets함수로 입력을 제한없이 받기 때문에, 리턴주소를 read_flag함수의 주소로 덮으면 될 것이다.
일단 buf에서 리턴 주소까지 얼마나 떨어져있는지 보자.

딱 0x80 bytes + 4bytes (sfp)만큼 떨어져있는 것을 알 수 있다.
그리고 read_flag 주소를 찾아보자.

0x80485b9에 위치하고 있음을 확인할 수 있다.
그러면 exploit을 작성해보자.

buf부터 dummy (0x80) + sfp (0x4) + read_flag (0x4)를 입력해주면 된다.

해결~
3. 새로 배운 것
pwntools의 ELF("[./binary]")를 통해서 바이너리의 여러 정보에 접근을 매우 쉽게 할 수 있다. gdb를 매번 찾지 않아도 된다!
ELF: Executable and Linkable Format
구체적으로는 아래 정보에 접근할 수 있다.
| 속성 / 메서드 | 설명 |
|---|---|
elf.symbols |
심볼 테이블 (main, puts, printf, win 등) 딕셔너리 |
elf.got |
GOT (Global Offset Table) 주소 |
elf.plt |
PLT (Procedure Linkage Table) 주소 |
elf.address |
ELF가 로드될 기본 주소 (PIE 여부에 따라 달라짐) |
elf.entry |
프로그램의 entry point 주소 |
elf.search(b'string') |
문자열을 바이너리에서 찾아 주소 반환 |
elf.read(addr, size) |
특정 주소의 바이너리 내용을 읽음 |
elf.write(addr, data) |
바이너리 내용 수정 (파일에 적용되진 않음) |
elf.sections |
.text, .data, .bss 등 섹션 정보 확인 |