Assasin.c의 코드이다.
betrayed를 retbayed로 적은 오타가 있지만 무시하자.
우선 스택을 사용 못하게 하고, buffer과 sfp도 초기화한다.
또 \x40을 막음으로서 시스템함수로의 RTL도 막았다.
그럼 어떻게 해야할까..
코드 영역에 RET 명령을 다시 한번 호출 하게 되면 내부 동작에 의하여 esp에 저장된 복귀 주소를 pop하고 그 주소를 eip에 대입 하게 된다.
복귀 주소를 pop 하였기 때문에 esp+4가 됨으로써 다시 한번 리턴 할 수 있다.
함수를 종료할때 LEAVE와 RET를 실행한다.
LEAVE
mov ebp,esp
pop ebp
RET
pop eip
LEAVE는 ebp를 esp에 옮긴다.
즉 프로그램을 실행하기 전의 스택주소로 옮겨간다는 뜻이다.
RET은 POP EIP를 실행한다.
POP은 Stack에서 값을 빼오고 ESP에 +4를 해 그 밑 값을 가리키게 한다.
결과적으로 RET을 실행하면 되므로 ESP+4를 가리키게 된다.
나중에 다시 RET을 호출하게 되면 해당주소를 호출한다.
그러므로 ESP+4에 system함수로 RTL해놓으면 될 것이다.
RET의 주소는 0x804851e이다.
즉 페이로드는 다음과 같다.
./assasing `python -c 'print "A"*44 + "\x1e\x85\x04\x08" + "\xe0\x8a\x05\x40" + "AAAA" + "\xf9\xbf\x0f\x40"'`
RET주소를 AAAA로 넣었으므로 exit할때 Segmentation Fault가 뜬다.
'LOB' 카테고리의 다른 글
LOB:Zombie_assassin→Succubus (0) | 2018.05.12 |
---|---|
LOB:Assasin→Zombie-assassin (0) | 2018.05.03 |
LOB:Bugbear→Giant (0) | 2018.04.30 |
LOB:Darkknight→Bugbear (0) | 2018.04.11 |
LOB:Golem→Darkknight (0) | 2018.04.11 |