목록전체 글 (77)
Jiyong's STUDY
[ebp+4] 돌아갈 함수 주소 [ebp+8] arg1(파라미터==인자) // int 기준(4byte) ... byte값만큼 [ebp+4+@] [ebp-@] local 변수 byte값 만큼 내려감
순서대로 더하는 함수, 빼는 함수, 곱하는 함수, 나누는 함수(리턴은 나머지)다. int oper(int a, int b){ return a (op) b; } 로 보인다. 함수 기본구조 push ebp mov ebp, esp ... pop ebp retn (default = eax 리턴) add a, b eax에 a+b 16진수 sub a, b eax에 a-b 16진수 imul a, b eax에 a*b 16진수 idiv [a] eax에 eax에 저장된 값 / a에 저장된 값 연산 이후 16진수 몫, edx에 16진수 나머지 cdq는 idiv로 나눗셈 계산을 할 때, 피제수의 크기를 늘려주는 역할을 한다. 예를 들어 제수가 32bit이고 피제수가 32bit일 때, 계산이 정상적으로 되지 않는다. 그 때 피..
앞선 프로그램들과 같은 역할이지만 구조적으로 많이 다르다. 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을 저장한다.