먼저 파일을 실행해 보았다
보호기법을 확인해보았다.
NX Bit 가 걸려있다.
IDA로 파일을 까봤다.
read를 통해 buf를 입력을 받고 출력을 한다.
오버플로우를 확인해보자
breakpoint를 main함수의 첫번째와 read함수 전으로 지정해주었다.
dummy값을 72로 설정하면 될것 같다.
libc leak을 해야한다.
libc leak을 하기 위해 read의 plt와 got영역의 주소가 필요하다. 또한, IDA를 볼때 옆에 메뉴(?)에서 puts함수가 있었다. 따라서 puts함수의 plt를 이용한다. 그리고 gadget을 구해야한다.
코드는 dummy값을 72개 채운다음 gadget + read_got + puts_plt순으로 전달을 한다. 그러면 read함수의 주소를 구할 수 있다. 그런다음 다시 main의 주소값을 더해서 main함수로 다시 되돌아오도록 한다.
그다음 read함수의 주소를 unpack한다.
그다음 ELF를 이용하여 read함수의 offset을 구한다음 libc base 주소를 구한다.
이 주소는 read함수의 주소 - read함수의 offset으로 구할 수 있다.
그리고 poprdi를 구해서 payload에 더미값 다음에 넣어주면 system함수와 '/bin/sh'의 문자열 주소를 구할 필요 없이 쉽게 return address에 system함수와 '/bin/sh'를 넣어줄 수 있다.
poprdi는 libc_base + one_gadget을 통해 구한 값을 통해 구할 수 있다.
one_gadget을 다음과 같이 이용하였다.
payload에 dummy를 72 채워주고 poprdi를 전달하여 ret에 system함수와 "/bin/sh"가 들어갈 수 있게 해주었다
전체 코드
실행결과
쉘 획득