본문 바로가기

워게임/protostar

stack6,7

(gdb) disas main

Dump of assembler code for function main:

0x080484fa <main+0>: push   ebp

0x080484fb <main+1>: mov    ebp,esp

0x080484fd <main+3>: and    esp,0xfffffff0

0x08048500 <main+6>: call   0x8048484 <getpath> //바로 점프

0x08048505 <main+11>: mov    esp,ebp

0x08048507 <main+13>: pop    ebp

0x08048508 <main+14>: ret    

End of assembler dump.

(gdb) disas getpath

Dump of assembler code for function getpath:

0x08048484 <getpath+0>: push   ebp

0x08048485 <getpath+1>: mov    ebp,esp

0x08048487 <getpath+3>: sub    esp,0x68 //0x68byte 할당

0x0804848a <getpath+6>: mov    eax,0x80485d0 //"input path please: "

0x0804848f <getpath+11>: mov    DWORD PTR [esp],eax

0x08048492 <getpath+14>: call   0x80483c0 <printf@plt>


0x08048497 <getpath+19>: mov    eax,ds:0x8049720

0x0804849c <getpath+24>: mov    DWORD PTR [esp],eax

0x0804849f <getpath+27>: call   0x80483b0 <fflush@plt> //fflush(stdout);


0x080484a4 <getpath+32>: lea    eax,[ebp-0x4c]

0x080484a7 <getpath+35>: mov    DWORD PTR [esp],eax

0x080484aa <getpath+38>: call   0x8048380 <gets@plt> //[ebp-0x4c]에 gets받음


0x080484af <getpath+43>: mov    eax,DWORD PTR [ebp+0x4]

0x080484b2 <getpath+46>: mov    DWORD PTR [ebp-0xc],eax

//[ebp-0xc]에 ebp+0x4 4byte 옮기고

0x080484b5 <getpath+49>: mov    eax,DWORD PTR [ebp-0xc]

//eax에 [ebp-0xc] 4byte 옮김

0x080484b8 <getpath+52>: and    eax,0xbf000000 //eax && 0xbf000000

0x080484bd <getpath+57>: cmp    eax,0xbf000000

0x080484c2 <getpath+62>: jne    0x80484e4 <getpath+96> //비교해서 다르면 점프


0x080484c4 <getpath+64>: mov    eax,0x80485e4

0x080484c9 <getpath+69>: mov    edx,DWORD PTR [ebp-0xc]

0x080484cc <getpath+72>: mov    DWORD PTR [esp+0x4],edx

0x080484d0 <getpath+76>: mov    DWORD PTR [esp],eax

0x080484d3 <getpath+79>: call   0x80483c0 <printf@plt>

//bzzzt %p, 비교대상 값 주소

0x080484d8 <getpath+84>: mov    DWORD PTR [esp],0x1

0x080484df <getpath+91>: call   0x80483a0 <_exit@plt>


0x080484e4 <getpath+96>:  mov    eax,0x80485f0

0x080484e9 <getpath+101>: lea    edx,[ebp-0x4c] //유저가 입력한 값

0x080484ec <getpath+104>: mov    DWORD PTR [esp+0x4],edx

0x080484f0 <getpath+108>: mov    DWORD PTR [esp],eax

0x080484f3 <getpath+111>: call   0x80483c0 <printf@plt> //got path %s, userinput

0x080484f8 <getpath+116>: leave  

0x080484f9 <getpath+117>: ret    

End of assembler dump.


x와 and 연산을 해서 값이 0xbf000000가 나올 때 x를 구해서 ebp+0x4에 넣는게 목적인듯합니다.

값이 다르면 그냥 got path 어쩌고만 출력해요.

뭐 값은 생각할 필요도 없이 0xbf000000일거고 ebp+0x4에 어떻게넣느냐..

버퍼 기준을 왜 갑자기 ebp로 바꿨지 음 무튼 ebp는 버퍼가 아래로 자라니까 그 특성을 알고있어야할것같네요

0x50byte(80byte)만큼 버퍼를 입력해야하는데 마지막 4byte는 x00\x00\x00\xbf로 입력해야할듯합니다.



이게 5보다 더 쉽군요

소스는 귀찮으니 생략(...)


7도 푸는 방법은 똑같아요. 근데 마지막에


0x08048538 <getpath+116>: lea    eax,[ebp-0x4c]

0x0804853b <getpath+119>: mov    DWORD PTR [esp],eax

0x0804853e <getpath+122>: call   0x80483f4 <strdup@plt>

//입력한 메모리 포인터 반환

0x08048543 <getpath+127>: leave  

0x08048544 <getpath+128>: ret    


이런 함수가 있네요. 근데 이거 이거 왜 쉘코드 작동안하는지 모르겠네요 ㅠ 5도 그렇고..

'워게임 > protostar' 카테고리의 다른 글

heap1  (0) 2015.10.30
heap0  (0) 2015.10.30
stack5  (0) 2015.10.15
stack4  (0) 2015.10.15
stack3  (0) 2015.10.15