level 3
2020. 9. 4. 01:43
보통 C언어에서 인자를 받지 않겠다는 의미로 함수의 괄호 안에 void를 쓰게 되는데요, 이 부분을 확실하게 처리를 안해서 야기된 문제같습니다. (물론 제 생각..)
인자로 쉘코드를 던져준 다음 argv[1]의 주소를 알아내고, gets 함수를 통해 RET 주소를 argv[1]의 주소로 덮으면 문제는 해결될 것 같습니다.
먼저 현재 권한으로 디버깅을 하기 위해 goblin 파일을 복사해줍니다.
그리고 거리를 계산하기 위해 디스어셈블해줍니다.
buffer~RET 까지 24바이트네요.
이제 argv[1]의 주소를 찾아보겠습니다.
찾았습니다.
주소는 0xbffffbf8이네요.
payload를 작성해보겠습니다.
(인자) "\x90"*100 + "~~"(ShellCode)
(gets) "A"*20 + "\xf8\xfb\xff\xbf"
성공!