LOB:Giant→Assasin

LOB 2018. 5. 1. 16:17

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
블로그 이미지

천재보다는 범재

,