(gdb) disas main
Dump of assembler code for function main:
0x08048408 <main+0>: push ebp
0x08048409 <main+1>: mov ebp,esp
0x0804840b <main+3>: and esp,0xfffffff0
0x0804840e <main+6>: sub esp,0x50
0x08048411 <main+9>: lea eax,[esp+0x10] //입력받은 값을 저장할 버퍼
0x08048415 <main+13>: mov DWORD PTR [esp],eax
0x08048418 <main+16>: call 0x804830c <gets@plt>
0x0804841d <main+21>: leave
0x0804841e <main+22>: ret
End of assembler dump.
(gdb) disas win
Dump of assembler code for function win:
0x080483f4 <win+0>: push ebp
0x080483f5 <win+1>: mov ebp,esp
0x080483f7 <win+3>: sub esp,0x18
0x080483fa <win+6>: mov DWORD PTR [esp],0x80484e0
0x08048401 <win+13>: call 0x804832c <puts@plt>
0x08048406 <win+18>: leave
0x08048407 <win+19>: ret
End of assembler dump.
이번에도 코드 흐름을 바꿔야하는데 아마 RTL이 아닐까 싶네요.
일단 제 기억엔 버퍼 다음에 오는 공간이 SFP 4바이트, 그다음이 RET인걸로 기억해요.
일단 0x50byte 할당했고 esp+0x10부터 입력된 버퍼가 저장되니까 0x40byte 즉 64byte를 더미로 입력하고 4byte SFP 추가 + 4byte의 리턴 주소를 넣으면 되겠군요..
근데 안됨.. 보니까 버퍼랑 sfp 사이에 더미가 있었어요
[BUFFER][DUMMY][SFP][RET]
64byte 8byte 4byte4byte
음 이렇게 더미까지 계산해서 76byte넣어주고 win() 주소 입력해주면 통과할것같네요
코드는 그냥 void main(){ printf(“code flow ~”); } int main(){ buffer[64]; gets(buffer); } 일듯한..