먼저 파일을 실행해본다
system함수의 주소가 계속 바뀐다
보호기법 확인
NX bit가 걸려 있음
RTL을 통해서 우회할 수 있으므로 RTL로 문제 풀이
RTL을 이용하려면 system함수의 주소와 "/bin/sh"문자열의 주소가 필요
IDA로 파일을 까봤다.
s의 크기는 68byte
gets함수에서 버퍼오버플로우 발생
일단 디버깅 한 후 main함수 disas했다
main+40을 보면 0x44로 68바이트
이는 s의 크기와 같다
따라서 dummy가 없다
메모리 구조는 다음과 같다
ret[4] |
sfp[4] |
s[68] |
72바이트를 dummy값으로 채워주고 ret에 system함수와 "/bin/sh" 문자열의 주소를 넣어주면 된다
main함수의 첫번째 명령어, gets함수 호출, ret에 breakpoint 지정
system함수의 주소는 다음과 같음
RTL을 이용하기 위해 offset 구해야 한다
system 함수의 주소는 보통 base address + system function address offset으로 구했다.
우리는 system함수의 주소를 알고 있다. (recv를 통해 받아올 수 있음)
따라서 base address = system function address - system function address offset
그러므로 우리는 system함수의 offset과 /bin/sh 문자열의 offset만 구하면 된다.
system function address in libc - libc Start Address = system function Address offset
info proc map을 통해 libc Start Address도 구할수 있지만 pwndbg를 이용하면 vmmap을 통해 libc Start Address를 구할 수 있음
system function address in libc - libc Start Address = system function Address offset
/bin/sh offset
exploit코드
잘 실행됨