offset을 찾는 것은 아래 링크 참조.
문제에서 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
쉬운 방법은 여기로.
더불어 ld 파일은 아래 사이트에서 다운로드 가능하다.
http://old-releases.ubuntu.com/ubuntu/pool/main/g/glibc/
동일 버전을 하나하나 찾아서 폴더를 뒤지다보면 찾을 수 있음;;;
'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 |