목록보안/여름방학 (5)
Jiyong's STUDY

앞선 프로그램들과 같은 역할이지만 구조적으로 많이 다르다. sub esp, 8 mov dword ptr ss:[ebp-8], edx mov dword ptr ss:[ebp-4], ecx sub 명령어를 사용하여 스택 공간을 확보하고 확보한 공간에 edx와 ecx를 저장했다. 이후에는 마찬가지로 eax에 저장하고 더하는 과정을 통해 결국엔 ecx+edx(10+20) 연산을 한 것이다. 또한 sub 명령어로 스택 공간을 확보한 것을 보아 함수2는 _fastcall을 이용한 함수임을 알 수 있다.

앞서 본 cdecl.exe-x와 같은 역할을 하는 함수들이다. 유일한 차이점은 cdecl.exe-x의 특정 역할을 하는 함수는 _cdecl을 사용한 함수었기 때문에 add esp, 8이 있었지만 함수2에 있는 retn 8을 보아 _stdcall을 이용한 함수라는 것을 알 수 있다.

push 14 push 0a 을 보아 함수 1에서 인자로 0x14, 0x0A (10진수로 20과 10) 두 개를 받았다. 이후 call cdecl.00401000에서 mov eax, dword ptr ss:[ebp+8] add eax, dword ptr ss:[ebp+c] 에서 ebp+8과 ebp+c는 앞서 받은 인자 10과 20이다. 즉, 함수2는 10+20 연산을 하는 함수라고 볼 수 있다. 리턴 이후 함수1에서 add esp,8에서 알 수 있는 내용으로는 4byte짜리 인자를 두 개 받았다는 것이며, _cdecl을 사용한 함수다. xor eax, eax는 같으면 eax에 0을 저장한다.
#define _CRT_SECURE_NO_WARNINGS #include #include int main() { int num = 0, i = 0, j = 0, sum = 0, temp = 0; int* atm = NULL; scanf(" %d", &num); atm = (int*)malloc(sizeof(int) * num); for (i = 0; i

여기서 Hello.00501000이 main 함수라는 것을 알 수 있다. F7로 자세히 들어가보면 esi(source index)에 printf의 위치가 저장되고 edi에는 10이 저장되며 시작함. 반복문에서 jnz의 조건이 맞으면 00501010으로 돌아가게 된다. jnz의 flag는 edi이며, 루프문 안에는 dec edi로 루프를 돌 때마다 --연산이 된다. 반복하는 내용은 "Hello.."를 push한 후에 esi를 호출하여(printf 함수) 출력한다. 10번 반복 후엔 그대로 리턴 후에 main 함수를 종료하며 프로그램이 종료된다.