ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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

     

    matrix1001/welpwn

    💖CTF pwn framework. Contribute to matrix1001/welpwn development by creating an account on GitHub.

    github.com

      - 각 libc 버전에 따른 로더 파일들을 위의 링크에서 발견할 수 있었다. ld-"md5 of libc".so.2 형식으로 로더 파일들의 리스트가 존재한다. 문제에서 로더가 주어지지 않는 경우 libc의 md5 를 확인하고 알맞는 로더를 해당 링크에서 다운로드 하자 (테스트는 안해봄)

     

    2. custom libc, loader 를 바이너리가 사용하게끔 패치

    github.com/NixOS/patchelf 

     

    NixOS/patchelf

    A small utility to modify the dynamic linker and RPATH of ELF executables - NixOS/patchelf

    github.com

    patchelf 라는 툴을 이용해 바이너리자체를 수정 --> 링킹을 새로걸어버리면 됨

     

    interpreter 설정, libc 교체

     

    --> 이제 실행 가능

     

    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 주소 불러옴

     

     

    --> 힙분석 하면 됨

    댓글

Designed by Tistory.