-
[Pwnable] libc 주어졌을 때 바이너리에 링킹 & 디버깅 (when LD_PRELOAD making segmenation fault)pwnable 2020. 8. 2. 10:58
- 보통 문제에서 elf, libc 가 주어짐
- 익스하는 os 의 libc 버전과 문제에서 준 libc 버전이 안맞아서 LD_PRELOAD 걸어도 segmentation fault 뜨는 경우 있음
1. 주어진 libc 에 대응되는 custom loader 가 추가로 필요
- 문제에서 ld 도 주는 경우 있음
- 안주면?... 주어진 libc 에 대응되는 os version 에서 로더만 추출해서 같이 사용하면 되지 않을까..
- https://github.com/matrix1001/welpwn/tree/master/PwnContext/libs/ld.so
- 각 libc 버전에 따른 로더 파일들을 위의 링크에서 발견할 수 있었다. ld-"md5 of libc".so.2 형식으로 로더 파일들의 리스트가 존재한다. 문제에서 로더가 주어지지 않는 경우 libc의 md5 를 확인하고 알맞는 로더를 해당 링크에서 다운로드 하자 (테스트는 안해봄)
2. custom libc, loader 를 바이너리가 사용하게끔 패치
patchelf 라는 툴을 이용해 바이너리자체를 수정 --> 링킹을 새로걸어버리면 됨
--> 이제 실행 가능
3. 디버깅
- 그냥 실행시 libc 에 디버깅 심볼이 없어 메인아레나 주소 못 가져오고 peda의 parseheap, heapinfo 등이 안먹힘
- gdb 에서 set verbose on 치고 실행시키면 심볼 로딩 안됐다는 것을 볼 수 있음
- 우리에게 필요한건 libc6-dbg 패키지라 각 버전에 맞는 패키지를 인터넷에 검색해서 다운받으면 됨.
- 그러나 가끔씩 안나오는 버전들이 있음 (obsolete)
- http://old-releases.ubuntu.com/ubuntu/pool/main/g/glibc/ 여기서 찾아주면 됨.
ex) libc6-dbg_2.29-0ubuntu2_amd64.deb
- dpkg -x ./libc6-dbg_2.29-0ubuntu2_amd64.deb ./<output_folder> 명령어로 적당한 곳에 압축풀기
- 압축풀면 폴더가 겁나 많은데 <output dir>/usr/lib/debug/lib/x86_64-linux-gnu 에 가면 디버깅 심볼 파일들이 있음
- 다른 폴더들 쓸 때 없고 x86_64-linux-gnu 이것만 있으면 됨
- gdb 상에서 set debug-file-directory <output dir>/usr/lib/debug/lib/x86_64-linux-gnu 로 하고 run 하면 심볼로딩되고 디버깅시 main_arena 주소 불러옴
--> 힙분석 하면 됨