먼저 파일을 실행해보자

값이 계속 바뀐다
보호기법을 확인하자

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
여기서 쉘코드를 찾아서 썼다.


먼저 파일을 실행해보자

값이 계속 바뀐다
보호기법을 확인하자

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
여기서 쉘코드를 찾아서 썼다.

