알쓸전컴(알아두면 쓸모있는 전자 컴퓨터)

[reversing] stack frame 예제 본문

리버싱

[reversing] stack frame 예제

백곳 2018. 4. 22. 13:45

stack frame 예제


스택 프레임을 알기 위해서 


간단한 예제를 만들고 이것에 대해서 분석을 해보겠습니다. 


//

#include <stdio.h>

#include "stdafx.h"

long add(long a, long b) {

long x = a, y = b;

return (x + y);

}


int main()

{

long a = 1, b = 2;

printf("%d\n", add(a, b));


    return 0;

}


저는 visual stdio 2017 로 최적화 옵션을 없음으로 하고 Relese 모드로 컴파일 하였습니다. 


그리고 나서 


olly debug 로 디버깅을 해 보겠습니다. 


예전에 했던 asm 코드 시작 부분 찾는 부분이 조금 달라 졌습니다. 


열어서 바로 실행 하면 나오는 코드가 실행 구간이 아닙니다. 


주소도 0x401000 이 아니구요 




저 같은 경우 처음 시작할때 0xC30001  이군요 


F9로 전진 해 보겠습니다. 

주소 번지가 75  로 시작 하는 군요 제가 작성 한 코드의 시작 부분과 전혀 연관성이 없어 보이므로 

F9 전진 하겠습니다. 


계속  F9 를 누르다 보면 


뭔가 관련이 있어 보입니다 main 함수 와 말이죠 


그래서 이번에는 F8로 JMP를 타고 옮겨 가보겠습니다. 



먼가 init  초기화 한드는 부분이 있으니 매우 의심 스러우니 F8로 조심히 진행해 보겠습니다. 


그러다 보면 



진짜 메인 함수 같은 부분이 나옵니다. 


이번에는 저 main cALL 부분에서 F7 로 함수 진입을 해보겠습니다. 



드디어 제가 작성한 코드의 시작 부분이 나오네요 . 



보면 


EBP 와 ESP 개념이 나오는데요 이것은 문맥 교환 이라는 asm 프로그램 기술 입니다. 


함수를 CALL 했던 부분에서 원래 호출 했던 부분이 끝나고 돌아 가기 위해서 하는 방법 입니다. 


자세 한것은 이전에 올렸던 자료중 asm 강의 자료를 보면 이해 하기가 좋습니다. 


여기서 스텍에 쌓은데 왜 ? EBP -4 -8 의 값에 move 하는지는 


우선 sub ESP,8 현재 스텍 포인트에서 8을 뺍니다. 


저희 코드에서 long a ,b 가 있었습니다. 


해당 변수의 저장 자리를 마련해 둔것이죠 . 




또한 함수를 call 하기 전에  


EBP -4 와 -8 에다가 저장을 합니다. long a,b 의 값을 말이죠. 


EBP -4 와 -8 에서 값을 가져와 함수 들어가기 전에 stack 에 push 하기 위함입니다. 


물론 asm 으로 직접 짠다면  바로 eax에 1 ecx에 2 를 집어 넣고 push 를 해도 되지만 


저희는 컴파일러를 이용했으니 


정해진 컴파일러가 규칙에 따른 컴파일 했기 때문입니다. 


더군다나 최적화도 안했구요 .


다음과 같이 push 하고 나서 함수 호출후에 EAX 에는 결과값을 리턴해서 던져 줍니다. 3 을 말이죠 


그래서 push EAX 를 하고 난뒤에 printf 함수를 호줄해 줍니다. 







Comments