[풀이] elf

해킹대회 문제 풀이 연습장소

Moderator: amesianx

Post Reply
hackhack
Posts: 14
Joined: Mon Sep 26, 2016 1:12 am

[풀이] elf

Post by hackhack » Thu Oct 06, 2016 9:46 am

libflag.so 를 로드하고, 주소를 입력으로 받아서, 그 주소에서 32바이트를 읽어 출력해줍니다. (총 25번) 문제는 25번의 시도 내에, libflag.so 에서 yes_ur_flag 함수의 주소를 찾아서 해당 함수 내용을 읽어야 플래그를 가져올 수 있습니다. 어떻게 할까요? 우선, libflag.so 를 로드해주는 바이너리는, 파이썬(/usr/bin/python2.7) 입니다. 파이썬 바이너리를 보시면 알겠지만, 파이썬 바이너리는 고정주소 0x4000...로 로드된다는걸 알 수 있습니다. 여기서부터 출발하여, libflag.so 의 주소를 찾고, 더 나아가, yes_ur_flag 함수의 주소를 찾을 수 있습니다.
리눅스에서는, 라이브러리를 로드할 때, 로드하는 바이너리의 .DYNAMIC 섹션을 통해 얻을 수 있는 link_map 이라는 것을 가집니다. 이건 링크드 리스트로 되어있는 구조인데, 현재 로드되어 있는 라이브러리의 이름, 주소 등의 정보를 가지고 있습니다. 이것을 따라가서, libflag.so 의 베이스 어드레스를 얻을 수 있습니다. 물론, 25횟수의 제한이 있으므로, 이름비교까지 하면 안되고, 미리 gdb python 으로 실행해서 libflag.so 가 몇번째에 로드되는지 미리 확인한 후, 그 번째를 고정으로 해서 해야겠죠.
그럼 libflag.so 의 베이스 어드레스를 얻었다고 합시다. yes_ur_flag 의 주소는 어떻게 얻을 수 있을까요? 답은 .gnu.hash 섹션과 .dynsym 섹션에 있습니다. 함수 이름을 통해 함수정보를 빨리 찾을 수 있도록, .gnu.hash 라는 섹션에 함수이름의 해쉬 번째에 정보를 저장하는 방식입니다. 이 정보를 이용해서 .dynsym 에서 해당 번째의 구조체를 찾으면 해당 함수에 대한 정보를 얻을 수 있습니다.

이 문제는, 리눅스 내부 구조체들을 많이 참조하기 때문에, 직접 설명하기 어려운 점이 있으므로, 아래 레퍼런스를 참조하세요.
https://docs.pwntools.com/en/stable/dynelf.html
https://github.com/Gallopsled/pwntools/ ... /dynelf.py
http://stackoverflow.com/questions/1762 ... -a-library
http://reverseengineering.stackexchange ... d-as-relro
https://blogs.oracle.com/ali/entry/insi ... bol_tables
https://docs.oracle.com/cd/E36784_01/ht ... 48031.html
http://stackoverflow.com/questions/7103 ... executable
https://blogs.oracle.com/ali/entry/gnu_ ... f_sections
http://www.skyfree.org/linux/references/ELF_Format.pdf

Post Reply

Who is online

Users browsing this forum: No registered users and 20 guests