생김새가 함수 포인터로 점프하나봅니다.
Dump of assembler code for function main:
0x08048438 <main+0>: push ebp
0x08048439 <main+1>: mov ebp,esp
0x0804843b <main+3>: and esp,0xfffffff0
0x0804843e <main+6>: sub esp,0x60 //60byte 할당
0x08048441 <main+9>: mov DWORD PTR [esp+0x5c],0x0 //modified = 0
0x08048449 <main+17>: lea eax,[esp+0x1c] //eax = *buffer
0x0804844d <main+21>: mov DWORD PTR [esp],eax
0x08048450 <main+24>: call 0x8048330 <gets@plt> //유저 인풋
0x08048455 <main+29>: cmp DWORD PTR [esp+0x5c],0x0
//cmp(modified == 0)
0x0804845a <main+34>: je 0x8048477 <main+63> //0이면 종료
0x0804845c <main+36>: mov eax,0x8048560
0x08048461 <main+41>: mov edx,DWORD PTR [esp+0x5c]
0x08048465 <main+45>: mov DWORD PTR [esp+0x4],edx
0x08048469 <main+49>: mov DWORD PTR [esp],eax
0x0804846c <main+52>: call 0x8048350 <printf@plt>
//printf("calling function pointer 어쩌고");
0x08048471 <main+57>: mov eax,DWORD PTR [esp+0x5c]
//eax에 modified 넣음
0x08048475 <main+61>: call eax //eax에 있는 값 호출함
0x08048477 <main+63>: leave
0x08048478 <main+64>: ret
End of assembler dump.
64byte만큼 더미를 덮어 쓰고 주소값을 4byte입력하면 그게 호출된다는 말인데..
음 그나저나 뭐호출할지 모르겠네요 그런데 gdb의 함수 리스트 기능을 사용해서 보니까 이런게 있더라구요
Dump of assembler code for function win:
0x08048424 <win+0>: push ebp
0x08048425 <win+1>: mov ebp,esp
0x08048427 <win+3>: sub esp,0x18
0x0804842a <win+6>: mov DWORD PTR [esp],0x8048540
0x08048431 <win+13>: call 0x8048360 <puts@plt>
0x08048436 <win+18>: leave
0x08048437 <win+19>: ret
End of assembler dump.
따라서 저기로 점프하면 되겠군요