먼저 파일을 실행해보자
값이 계속 바뀐다
보호기법을 확인하자
FULL RELRO와 PIE가 걸려있다.
IDA로 파일을 까보자
main에서는 echo호출을 한다.
echo함수에서는 s의 주소를 출력하고 gets함수를 통해 입력 받는다.
변수 s의 크기는 0x12a=298바이트이다.
위에서 보호기법을 확인할 때 NX가 걸려있지 않으므로 쉘코드를 이용하여 푼다.
s에 쉘코드를 넣고 ret주소에 s의 주소를 덮어쓰면 echo 실행 이후 ret가 호출될 때 쉘코드가 실행될 것이다.
echo를 disas 해주자.
echo+24부분을 보면 크기가 0x12a인것을 알 수 있고 여기서 dummy가 없다는것을 알 수 있다.
메모리의 구조는 다음과 같게 될 것이다.
ret[4] |
sfp[4] |
s[298] |
payload는 s에 먼저 쉘코드를 넣고 302-len(shellcode)만큼 더미값을 넣는다. 그리고 s의 주소를 넣으면 될것이다.
근데 위에서 s의 주소가 계속 바뀐다는 것을 실행을 통해 알게되었으므로 s의 주소를 recv를 통해 받는다.
25바이트 쉘코드를 쓴다.
"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89
\xe1\x89\xc2\xb0\x0b\xcd\x80"
https://watchout31337.tistory.com/37
여기서 쉘코드를 찾아서 썼다.