먼저 파일을 실행해보았다
do you know return to library라고 되어있는걸 봐서 rtl 문제인거 같다
NX bit 가 걸려있다. RTL로 풀면 NX bit는 우회할 수 있으므로 RTL로 풀자
코드를 IDA를 이용해서 까보자
알고 싶은 주소값을 던져주면 See_something()을 통해서 해당 주소에 어떤 값이 저장되어 있는지를 출력을 해준다.
남길 말을 입력하라고 하는데 이때 Print_message에서 buffer overflow가 발생할 수 있다.
Print_message함수의 인자로 256바이트가 전달 될 수 있는데 함수 내에서는 56바이트 버퍼에 카피를 하고 있다.
이때 오버플로우가 발생한다.
Print_message함수를 디버깅을 해보자
+13을 보면 ebp-0x38로 크기가 56바이트인것을 확인할 수 있다.
메모리 구조는 다음과 같을 것이다.
ret[4] |
sfp[4] |
buf[56] |
dummy를 60byte만큼 채우고 ret에 system함수의 주소를 넣어주면 이 문제는 풀릴 것이다.
그러면 system 함수의 주소와 "/bin/sh"문자열의 주소가 필요하다
printf function address in libc - libc Start Address = libc Base Address offset
system function address in libc - libc Start Address = system function Address offset
printf함수의 주소는 위와 같다.
libc Base Address offset = 0x49670
system함수의 주소는 위와 같다.
system function Address offset = 0x3ada0
"/bin/sh"과 libc Start Address사이의 offset = 0x15ba0b
+)추가
pwndbg> info proc map == vmmap
libc = elf.libc (바이너리 내 사용하는 libc 라이브러리 불러오기)
system_offset = libc.symbols['system']
binsh_offset = list(libc.search('/bin/sh'))[0]