#include <stdio.h>
int sum(int a, int b) {
return a + b;
}
int minus(int a, int b){
return a - b;
}
int main(int argc, _TCHAR* argv[])
{
int x = 9;
int y = 7;
printf("sum : %d \n", sum(x, y));
printf("minus : %d \n", minus(x, y));
}
코드블럭으로 위의 소스코드를 작성하고 컴파일하여 실행 파일로 만든다.
sum.exe 파일을 Immunity Debugger에서 실행시킨다.
가장 먼저 보이는 CALL 명령에서 F7을 사용해 함수 안으로 들어간다.
위로 스크롤하여 코드영역을 살펴보면 _cexit를 주석으로 볼 수 있다.
_cexit함수는 C프로그램의 종료를 처리하는 데 사용된다.
따라서 함수 위에 있는 CALL 명령어를 main함수라고 생각하고 BP를 걸었다.
F9키로 BP를 둔 위치로 이동한 후 F7로 함수 안에 들어갔다.
004015D8 주소로 들어가면 주석에 sum, minus가 출력되는 것으로 보아 이 주소가 main함수임을 알 수 있었다.
main함수에 들어갔을 때 가장 먼저 PUSH EBP 명령을 실행한다. 이전 함수의 스택 프레임 정보를 저장하기 위해 EBP값을 스택에 넣는다. 함수가 반환될 때 이전 스택 프레임으로 복귀하기 위해 필요하다.
PUSH EBP 명령을 실행하고 스택영역으로 보면 스택이 쌓이는 것을 볼 수 있다.
현재 함수가 "sum.004015D8"에서 이전 함수 "sum.0040138B"로 복귀하려고 할 때 출력되는 것이다.
소스코드의 x=9, y=7에 해당하는 부분이다.
[ESP+1C] = 0061FFB0 + 1C = 0061FECC
[ESP+18] = 0061FFC8
두 명령을 실행하면 0061FECC에는 9가, 0061FFC8에는 7이 저장된다.
스택 영역을 확인하면 9와 7 순서로 쌓인 것을 확인할 수 있다.
스택에 저장된 값을 EAX에 넣는다.
순서대로 실행을 해보면
EAX와 [ESP+4] 주소에 7이 저장된다.
EAX와 [ESP+1C] 주소에 9가 저장된다.
스택은 LIFO구조로, 가장 나중에 들어온 값부터 빼내는 POP 명령을 수행한다.
따라서 더 늦게 스택에 들어온 7이 먼저 EAX에 들어간다.
또한 레지스터영역에서 EIP를 보면 다음에 실행될 주소를 볼 수 있다.
서브함수도 주석을 통해 알 수 있다.
일단 F8로 실행해 보면 printf를 지날 때 cmd창에 sum과 minus 결과가 출력된다.
sum함수의 시작 주소는 004015C0이고 minus의 시작 주소는 004015CD이다.
서브함수 안으로 들어가기 위해 BP를 걸었고 먼저 sum함수에 F7로 들어갔다.
sum 서브함수
main함수와 마찬가지로 PUSH EBP명령으로 리턴 주소를 스택에 저장한다.
EDX와 EAX에 각각 9와 7을 넣는다.
ADD 명령으로 EAX = EAX + EDX 계산을 하며 EAX에 10이 저장되었다.
POP EBP 명령으로 리턴 주소를 찾아 다시 함수로 돌아간다.
아래 스택영역을 보면 0040160A 주소로 돌아감을 알 수 있다.
0040160A로 돌아왔고 EAX에 저장된 값 10을 [ESP+4]에 저장하여 스택에도 10이 저장된 것을 확인했다.
printf문까지 실행시키면 cmd창에 sum 결과가 출력된다.
minus함수도 sum함수와 같은 방법으로 진행한다.
BP를 걸어둔 위치에서 F7키로 minus함수 안으로 들어갔다.
PUSH EBP명령으로 리턴 주소를 스택에 저장한다.
SUB 명령어를 실행하여 EAX에 2가 저장되었다.
POP EBP 명령으로 리턴 주소를 확인 후 함수로 돌아간다.
[ESP+4]에 EAX값인 2를 넣는 명령을 실행하여 0061FEB4에 값이 저장된 것을 스택영역에서 확인했다.
printf문까지 실행하면 minus 결과도 cmd에 출력된다.
F8로 실행하고 exit를 만나면 종료된다.
'Study > 윈도우즈 보안과 운영 실습' 카테고리의 다른 글
쉘코드 작성 - calc (0) | 2024.03.19 |
---|---|
쉘코드 작성 - Notepad (0) | 2024.03.19 |
윈도우 실행 파일 구조 분석 (0) | 2024.03.19 |
디셈블러와 디버거 실습 (0) | 2024.03.19 |
누적 코드작성 (0) | 2024.03.19 |