[dreamhack] basic_exploitation_001 writeup

1. 문제

thumbnail
basic_exploitation_001

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

https://dreamhack.io/wargame/challenges/3

2. 풀이

간단하게 read_flag함수를 실행시키면 flag의 내용을 출력해줄 수 있다.

main함수에서는 bufgets함수로 입력을 제한없이 받기 때문에, 리턴주소를 read_flag함수의 주소로 덮으면 될 것이다.

일단 buf에서 리턴 주소까지 얼마나 떨어져있는지 보자.

0x80 bytes + 4bytes (sfp)만큼 떨어져있는 것을 알 수 있다.

그리고 read_flag 주소를 찾아보자.

0x80485b9에 위치하고 있음을 확인할 수 있다.

그러면 exploit을 작성해보자.

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

해결~

3. 새로 배운 것

pwntoolsELF("[./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 등 섹션 정보 확인