(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도 그렇고..