Computer Science%/System

Classic하지 않은 함수의 프롤로그와 에필로그

ch4rli3kop 2019. 4. 25. 14:59
반응형

Classic하지 않은 함수의 프롤로그와 에필로그


가끔 바이너리를 분석하다보면 main()의 프롤로그와 에필로그 부분이 보편적으로 많이 보이는 아주 전형적인 함수의 프롤로그, 에필로그와 조금 다른 경우가 있다. (아마 x86에서만 관찰되는 듯)


전형적인 함수의 프롤로그와 에필로그

push    ebp
mov     ebp, esp
...
pop     ebp
ret


전형적이지 않은 함수의 프롤로그와 에필로그

lea     ecx, [esp+0x4]
and     esp, 0xfffffff0
push    DWORD PTR [ecx-0x4]
push    ebp
mov     ebp, esp
...
pop     ebp
lea     esp, [ecx-0x4]
ret

위와 같은 차이가 발생하는 이유는 스택 상에서 main() 함수의 시작을 16 bytes의 배수로 맞춰주기 위함이다.

스택 변수에 대해 SSE(Streaming SIMD Extensions) instructions을 사용하는 경우 의무적으로 사용한다고 한다.

또, 이런 경우는 메인 함수에서만 관찰할 수 있는데, 서브 함수의 경우 caller에서 sub esp, 0xc와 같이 esp를 조정해주기 때문이다.


gcc 옵션

컴파일 시 -mpreferred-stack-boundary=2 옵션을 추가로 주면 Classic한 코드를 사용할 수 있다.


반응형

'Computer Science% > System' 카테고리의 다른 글

라우터 취약점 분석  (0) 2020.06.14
LibFuzzer w\ OpenJpeg 코드 작성 후 퍼징 결과 제출  (0) 2020.06.14
어쩌다보니 시작한 checksec 분석글  (0) 2019.03.17
입출력 버퍼 사용하기  (0) 2018.11.08
Shellcode  (0) 2018.02.08