본문 바로가기

WarGame/HackerSchool_LOB

HackerSchool LOB Level16


소스를 본다.


15번과 비슷하게

스택과 공유라이브러리를 사용하지 못한다.

그리고 새로운 문제는, strncpy로 48바이트만 버퍼로 복사를 한다.

ret주소까지는 덮어씌울수 있지만, 그 뒤에 system주소나 /bin/sh 주소를 넣던 방법은 이제 되지 않는다.


일단 방법만 검색해봤다..ㅜㅜ

Fake EBP 를 쓰란다.


Fake EBP가 무엇이냐하니, EBP값을 변조하는 것이다.


우리 문제에서 이 기법을 적용하려면,

일단 strncpy로 버퍼에 48바이트만큼만 복사한다.

buffer[40] + sfp[4] + ret[4]  스택에는 이렇게 들어 있을 것이고,

우리는 leave에서 mov esp ebp, pop ebp 가 실행되므로,  ebp에는 sfp[4]가 들어가고,

ret이 실행되면서 pop eip, jmp eip로 eip에는 ret[4]가 들어가게 되고, 점프를 하게 된다.


우리는 이 ret에 leave+ret의 주소를 넣는 것이다.

그러면 여기서 다시 한 번 mov esp ebp, pop ebp 가 실행이 된다.

mov %ebp %esp 가 실행도면서, 결국 ebp에는 앞에서 sfp[4]가 들어 있었으므로, 내가 넣은 값이 esp가 되는 것이다.

그리고 마지막으로 ret이 실행되면서, pop eip, jmp eip를 통해 실행흐름이 바뀌게 된다.






좋다 이제 한번 해보자

gdb로 분석해보았다.

마지막 leave 와 ret에 브레이크를 걸고 레지스터와 스택을 확인해보았다.


-> leave  실행전의 레지스터와 스택

`python -c 'print "A"*40+"BBBB"+"CCCC"'`


-> leave를 실행하고 나서의 레지스터와 스택

ebp가 0x42424242로 바뀌었다.

0xbffffae8 을 가리키던 ebp가 leave를 실행하면서 mov esp ebp와 pop ebp를 하였기 때문이다.


아래는 ret까지 실행하고 나서의 레지스이다.

eip가 0x43434343로 바뀐것을 볼 수 있다.

결국, buf+48 위치에 fake ebp를 사용하여, leave를 한 번 더 넣으면, 스택이 4바이트만큼 더 밀린다는 것이다.


그럼 이제 이 0x43434343을 [버퍼의 시작주소-4]로 바꾸면 될 것이다.

-4를 하는 이유는 leave에서 pop을 한 번 하기 때문이다.

뭐 물론 NOP을 앞에 조금 넣는다면 그냥 버퍼의 주소를 넣어도 된다.


RTL로 공격을 한다.



system : 0x40058ae0
exit : 0x400391e0
&/bin/sh : 0x400fbff9


페이로드는

&system[4] + &exit[4] + &/bin/sh[4] + NOP*28 + &buffer-4[4] + &leave+ret[4]


`python -c 'print "\xe0\x8a\x05\x40"+"\xe0\x91\x03\x40"+"\xf9\xbf\x0f\x40"+"\x90"*28+"\x9c\xfa\xff\xbf"+"\xdf\x84\x04\x08"'`









'WarGame > HackerSchool_LOB' 카테고리의 다른 글

HackerSchool LOB Lovel18  (0) 2014.08.25
HackerSchool LOB Level17  (0) 2014.08.24
HackerSchool LOB Level15  (0) 2014.08.23
HackerSchool LOB Level14  (0) 2014.08.20
HackerSchool LOB Level13  (0) 2014.08.15