systemhacking/practice

lob assassin->zombie_assassin (fake ebp)

qkqhxla1 2015. 1. 28. 16:42

fake ebp라는 기법을 이용하라고 한다.


관련 자료 : http://s2kiess.blog.me/220035160416http://1tchy.tistory.com/entry/fake-ebphttp://zer0day.tistory.com/172


헷갈려서 문서를 여러개를 보면서 이해를 했다. 버퍼 뒤에 ebp, ret가 있는데, ebp를 변조해서 내가 원하는 곳을 ebp로 만들수 있다는게 요지이다. 원본 소스를 아무 코드도 추가하지 않고 zombie_assassi1.c로 복사후 zombie_assassi1로 컴파일한다.(dumpcode를 넣었을시 공격에 필요한 주소가 바뀌어서 그냥 원본 소스코드로 분석하고 진행.)


일단 원리를 설명하자면 ret에 leave주소를 넣어서 한번 더 참조하도록 하는게 목적이다. 일단 한번 해보자.

leave,ret에 브레이크포인트를 걸고 r `python -c 'print "a"*48'` , x/40x $esp로 버퍼의 주소를 알아낸다. ( 0xbffffaa0 ) disas main등으로 leave의 주소를 알아낸다. (0x80484df) ret만 leave로 초기화하고 ebp는 버퍼주소-4(0xbffffa9c)로 실행해보자. leave, ret에 브레이크 포인트를 걸어놓는다. 

( r `python -c 'print "a"*40+"\x9c\xfa\xff\xbf"+"\xdf\x84\x04\x08"'` )


첫번째 브레이크포인트에서 레지스터 정보를 보면 ebp = 0xbffffac8, esp = 0xbffffaa0이다. leave실행 전이므로

브레이트포인트 2로 가게되면 leave가 실행된다. leave는 at&t문법으로 mov ebp, esp   pop ebp이다.

ebp값을 esp로 옮기고, pop ebp로 인해 esp가 4가 증가되면서 esp=0xbffffacc가 된다.

pop ebp로 인해 ebp는 0xbffffac8자리에 있던 0xbffffa9c가 된다. 


여기서 한번 더 실행시키면 ret가 leave주소로 설정되어있으므로 다시 브레이크포인트 1로 돌아오게되는데, 다시 돌아온 후 레지스터를 살펴보면 ebp는 아까 설정됬던 0xbffffa9c가 그대로 남아있고, esp는 이전 esp에서 4 증가한 0xbffffad0 이 들어가게 된다.(ret는 pop eip, jmp eip인데 pop으로 인해 esp 4 증가) 여기서 한번 더 실행시키면 leave의 mov ebp, esp   pop ebp가 실행되는데, ebp를 아까 버퍼주소-4인 0xbffffa9c로 덮어씌웠었다. esp에는 leave명령어 실행후 버퍼의 주소값인 0xbffffaa0이 들어가게 된다.(leave : mov ebp,esp   pop ebp) 여기서 다시 한번 더 진행하게 되면 버퍼주소에 우리가 버퍼에 집어넣었던 aaaa라는 주소값을 참조하려고 할것이고 위처럼 0x61616161 in ?? 이라는 에러가 뜨게 된다.


이제 원리를 알았으니 버퍼에 system함수주소+아무거나4개+/bin/sh주소를 넣고, ebp를 버퍼-4의 주소로, ret를 leave의 주소로 덮어씌우면 위와 같은 과정을 거쳐 마지막으로 system함수를 참조하게 되어 쉘이 나올것이다. 

system함수주소 = 0x40058ae0 

bin/sh주소 = 0x400fbff9

ebp = 0xbffffa9c (버퍼-4의 주소)

ret = 0x80484df (leave의 주소)


./zombie_assassi1 `python -c 'print "\xe0\x8a\x05\x40"+"aaaa"+"\xf9\xbf\x0f\x40"+"a"*28+"\x9c\xfa\xff\xbf"+"\xdf\x84\x04\x08"'`


처럼 공격하니 성공을 확인했다. zombie_assassi1의 소스코드는 원본과 다를게 없으므로 원본과 이름만 바꿔서 공격하면 원본도 쉘을 얻어낼수 있다.

'systemhacking > practice' 카테고리의 다른 글

lob succubus->nightmare  (0) 2015.01.30
lob zombie_assassin->succubus  (0) 2015.01.29
lob giant->assassin  (0) 2015.01.27
lob bugbear->giant (rtl2)  (0) 2015.01.26
lob darkknight->bugbear  (0) 2015.01.22