이문제 에서 셀코드를 만들때 왜 fastcall 호출규약을 이용해서 짜나요? 0x080485d9 <+0>: push ebp
0x080485da <+1>: mov ebp,esp
0x080485dc <+3>: add esp,0xffffff80
0x080485df <+6>: call 0x8048592 <initialize>
0x080485e4 <+11>: lea eax,[ebp-0x80]
0x080485e7 <+14>: push eax
0x080485e8 <+15>: push 0x8048699
0x080485ed <+20>: call 0x80483f0 printf@plt
0x080485f2 <+25>: add esp,0x8
0x080485f5 <+28>: lea eax,[ebp-0x80]
0x080485f8 <+31>: push eax
0x080485f9 <+32>: push 0x80486a5
0x080485fe <+37>: call 0x8048460 __isoc99_scanf@plt
0x08048603 <+42>: add esp,0x8
0x08048606 <+45>: mov eax,0x0
0x0804860b <+50>: leave
0x0804860c <+51>: ret
문제코드 disass main 해보면 호출규약이 페스트 켈은 아닌거 같은데 문제에서 셀을짤대는 왜 페스트켈 호출규약을 이용하나요? ㅜㅜ
조금 혼동이 있으신 것 같은데, 실제로 함수가 작동할 때는 각 값들을 스택에서 가져와서 사용합니다.
execve 함수를 사용하는 코드를 작성해서 컴파일하고 execve 함수를 disas 해보시면 이해하실 것 같습니다.
이를 실제로 해서 중요부만 추려보면 아래와 같습니다.
#main 함수 부분
0x804819b <main+3>: push $0x0 #인자 3
0x804819d <main+5>: push $0x0 #인자 2
0x804819f <main+7>: push $0x8071548 #인자 1
0x80481a4 <main+12>: call 0x804d01c <__execve>
#execve 함수 부분
0x804d021 <__execve+5>: mov 0x8(%ebp),%edi #인자 1
0x804d032 <__execve+22>: mov 0xc(%ebp),%ecx #인자 2
0x804d035 <__execve+25>: mov 0x10(%ebp),%edx #인자 3
0x804d039 <__execve+29>: mov %edi,%ebx
0x804d03b <__execve+31>: mov $0xb,%eax
0x804d040 <__execve+36>: int $0x80
이와 같이 main 함수에서 필요한 값들을 push 해놓고 execve 함수에서 해당 값들을 가져와서 사용합니다.
"함수에서 스택의 값을 알아서 가져와서 사용한다" = cdecl
이 되는 것입니다.
shellcode는 이 역할을 하도록 만들어진 것이고요.