offset을 찾는 것은 아래 링크 참조.
libc에서 offset 찾기.
pwnable 문제를 풀다보면 libc 파일을 제공해주는 경우가 다수 있다. 하지만 offset을 구할때 자꾸 헷갈리는 부분이 있어 다시 정리한다. pwntools로 찾기 해당 파일의 libc 버전 또는 경로를 확인해서 ┌
wyv3rn.tistory.com
문제에서 libc 파일을 제공할 때, 프로그램 실행 시 해당 libc 파일을 로드해주지 않으면 본인 컴퓨터의 libc를 사용하기 때문에 공격 대상 환경과 달라 offset이 차이가 난다.
예를 들면 아래와 같이 libc-2.27.so 파일이 제공되었지만 실제로는 다른 파일을 사용하는 것을 볼 수 있다.
┌──(kali㉿kali)-[~/Downloads/1]
└─$ ls
fho fho.c libc-2.27.so
┌──(kali㉿kali)-[~/Downloads/1]
└─$ ldd fho
linux-vdso.so.1 (0x00007ffeaeea0000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f81dbc65000)
/lib64/ld-linux-x86-64.so.2 (0x00007f81dc056000)
샘플로 /bin/sh 문자열의 offset 주소를 확인해보면 다른 것을 볼 수 있다.
┌──(kali㉿kali)-[~/Downloads/1]
└─$ ldd fho
linux-vdso.so.1 (0x00007fff1c5c3000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8b6b6f9000)
/lib64/ld-linux-x86-64.so.2 (0x00007f8b6baea000)
┌──(kali㉿kali)-[~/Downloads/1]
└─$ strings -tx /lib/x86_64-linux-gnu/libc.so.6 | grep /bin/sh
198882 /bin/sh
┌──(kali㉿kali)-[~/Downloads/1]
└─$ strings -tx ./libc-2.27.so | grep /bin/sh
1b3e1a /bin/sh
그러므로 이를 위해서 문제 파일을 실행할 때 제공된 libc 파일을 사용할 수 있도록 설정해주어야 한다.
물론, 로컬 환경에서 사용되는 libc로 exploit을 테스트해본 후 제공된 libc의 offset을 확인해서 값만 변경해줘도 되지만, 가능하면 제공된 libc를 사용해서 두 번 시도하는 일을 줄일 필요가 있다.
다만, libc만 사용하면 되는 것이 아닌 ld 파일도 함께 필요하다.
간단히 설명하면 libc 버전마다 loader가 다른데, 이에 맞게 ld 파일을 사용해줘야 한다는 것이다.
가장 간단한 방법이 patchelf 프로그램을 사용하는 것이며, 아래와 같다.
GitHub - NixOS/patchelf: A small utility to modify the dynamic linker and RPATH of ELF executables
GitHub - NixOS/patchelf: A small utility to modify the dynamic linker and RPATH of ELF executables
A small utility to modify the dynamic linker and RPATH of ELF executables - GitHub - NixOS/patchelf: A small utility to modify the dynamic linker and RPATH of ELF executables
github.com
쉬운 방법은 여기로.
patchelf 사용법.
딱 두개 명령어만 기억하자 ┌──(kali㉿kali)-[~/Downloads] └─$ patchelf --set-interpreter ./ld-50390b2ae8aaa73c47745040f54e602f.so.2 tcache_dup ┌──(kali㉿kali)-[~/Downloads] └─$ ldd tcache_du..
wyv3rn.tistory.com
더불어 ld 파일은 아래 사이트에서 다운로드 가능하다.
http://old-releases.ubuntu.com/ubuntu/pool/main/g/glibc/
Index of /ubuntu/pool/main/g/glibc
old-releases.ubuntu.com
동일 버전을 하나하나 찾아서 폴더를 뒤지다보면 찾을 수 있음;;;
'Tips & theory' 카테고리의 다른 글
입/출력 함수의 입력, 출력 방식. (0) | 2022.07.29 |
---|---|
libc에서 offset 찾기. (0) | 2022.07.29 |
GDB run 실행 후 입력 값 넘기기 (0) | 2022.07.15 |
/bin/sh 문자열 주소 찾는 방법. (0) | 2022.07.14 |
Python 3 + pwntools 자주 하는 실수 (0) | 2022.07.09 |