셀코드 호출규약

이문제 에서 셀코드를 만들때 왜 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 해보면 호출규약이 페스트 켈은 아닌거 같은데 문제에서 셀을짤대는 왜 페스트켈 호출규약을 이용하나요? ㅜㅜ

#pwnable
작성자 정보
답변 1
avatar
wyv3rn
무플 방지 위원회장

조금 혼동이 있으신 것 같은데, 실제로 함수가 작동할 때는 각 값들을 스택에서 가져와서 사용합니다.

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는 이 역할을 하도록 만들어진 것이고요.

2022.10.11. 23:03
질문에 대한 답을 알고 계신가요?
지식을 나누고 포인트를 획득해보세요.
답변하고 포인트 받기