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 등 섹션 정보 확인 |