IT공부/IT서적

[윤성우 열혈 C프로그래밍] 디버깅 빌드, 어셈블리 코드 - Chapter6, Chapter7

shine94 2025. 1. 15. 15:11
#include <stdio.h>

int main(void)
{
00941870  push        ebp  
00941871  mov         ebp,esp  
00941873  sub         esp,0C0h  
00941879  push        ebx  
0094187A  push        esi  
0094187B  push        edi  
0094187C  mov         edi,ebp  
0094187E  xor         ecx,ecx  
00941880  mov         eax,0CCCCCCCCh  
00941885  rep stos    dword ptr es:[edi]  
00941887  mov         ecx,offset _1C837AE4_StringPrintf@c (094C008h)  
0094188C  call        @__CheckForDebuggerJustMyCode@4 (094132Ah)  
00941891  nop  
	printf("I like programming\n");
00941892  push        offset string "I like programming\n" (0947B30h)  
00941897  call        _printf (09410D2h)  
0094189C  add         esp,4  
	printf("I love puppy!\n");
0094189F  push        offset string "I love puppy!\n" (0947B48h)  
009418A4  call        _printf (09410D2h)  
009418A9  add         esp,4  
	printf("I am so happy\n");
009418AC  push        offset string "I am so happy\n" (0947B5Ch)  
009418B1  call        _printf (09410D2h)  
009418B6  add         esp,4  
	return 0;
009418B9  xor         eax,eax  
}
009418BB  pop         edi  
009418BC  pop         esi  
009418BD  pop         ebx  
009418BE  add         esp,0C0h  
009418C4  cmp         ebp,esp  
009418C6  call        __RTC_CheckEsp (094124Eh)  
009418CB  mov         esp,ebp  
009418CD  pop         ebp  
009418CE  ret

 

#include <stdio.h>

int main(void)
{
00CE1870  push        ebp  
00CE1871  mov         ebp,esp  
00CE1873  sub         esp,0CCh  
00CE1879  push        ebx  
00CE187A  push        esi  
00CE187B  push        edi  
00CE187C  lea         edi,[ebp-0Ch]  
00CE187F  mov         ecx,3  
00CE1884  mov         eax,0CCCCCCCCh  
00CE1889  rep stos    dword ptr es:[edi]  
00CE188B  mov         ecx,offset _358CD169_FormPrintf@c (0CEC008h)  
00CE1890  call        @__CheckForDebuggerJustMyCode@4 (0CE132Ah)  
00CE1895  nop  
	int myAge = 12;
00CE1896  mov         dword ptr [myAge],0Ch  
	printf("제 나이는 10진수로 %d살, 16진수로 %x살입니다 8진수: %o\n", myAge, myAge, myAge);
00CE189D  mov         eax,dword ptr [myAge]  
00CE18A0  push        eax  
00CE18A1  mov         ecx,dword ptr [myAge]  
00CE18A4  push        ecx  
00CE18A5  mov         edx,dword ptr [myAge]  
00CE18A8  push        edx  
00CE18A9  push        offset string "\xc1\xa6 \xb3\xaa\xc0\xcc\xb4\xc2 10\xc1\xf8\xbc\xf6\xb7\xce %d\xbb\xec, 16\xc1\xf8\xbc\xf6@"... (0CE7B30h)  
00CE18AE  call        _printf (0CE10D2h)  
00CE18B3  add         esp,10h  
	return 0;
00CE18B6  xor         eax,eax  
}
00CE18B8  pop         edi  
00CE18B9  pop         esi  
00CE18BA  pop         ebx  
00CE18BB  add         esp,0CCh  
00CE18C1  cmp         ebp,esp  
00CE18C3  call        __RTC_CheckEsp (0CE124Eh)  
00CE18C8  mov         esp,ebp  
00CE18CA  pop         ebp  
00CE18CB  ret

 

#include <stdio.h>

int main(void)
{
00281870  push        ebp  
00281871  mov         ebp,esp  
00281873  sub         esp,0CCh  
00281879  push        ebx  
0028187A  push        esi  
0028187B  push        edi  
0028187C  lea         edi,[ebp-0Ch]  
0028187F  mov         ecx,3  
00281884  mov         eax,0CCCCCCCCh  
00281889  rep stos    dword ptr es:[edi]  
0028188B  mov         ecx,offset _1700396B_SimpleWhile@c (028C008h)  
00281890  call        @__CheckForDebuggerJustMyCode@4 (028132Ah)  
00281895  nop  
	int num = 0;
00281896  mov         dword ptr [num],0  

	while (num < 5)
0028189D  cmp         dword ptr [num],5  
002818A1  jge         __$EncStackInitStart+43h (02818BFh)  
	{
		printf("Hello world!%d\n", num);
002818A3  mov         eax,dword ptr [num]  
002818A6  push        eax  
002818A7  push        offset string "Hello world!%d\n" (0287B30h)  
002818AC  call        _printf (02810D2h)  
002818B1  add         esp,8  
		num += 1;
002818B4  mov         eax,dword ptr [num]  
002818B7  add         eax,1  
002818BA  mov         dword ptr [num],eax  
	}
002818BD  jmp         __$EncStackInitStart+21h (028189Dh)  

	return 0;
002818BF  xor         eax,eax  
}
002818C1  pop         edi  
002818C2  pop         esi  
002818C3  pop         ebx  
002818C4  add         esp,0CCh  
002818CA  cmp         ebp,esp  
002818CC  call        __RTC_CheckEsp (028124Eh)  
002818D1  mov         esp,ebp  
002818D3  pop         ebp  
002818D4  ret

 

#include <stdio.h>

int main(void)
{
00071960  push        ebp  
00071961  mov         ebp,esp  
00071963  sub         esp,0DCh  
00071969  push        ebx  
0007196A  push        esi  
0007196B  push        edi  
0007196C  lea         edi,[ebp-1Ch]  
0007196F  mov         ecx,7  
00071974  mov         eax,0CCCCCCCCh  
00071979  rep stos    dword ptr es:[edi]  
0007197B  mov         eax,dword ptr [__security_cookie (07A000h)]  
00071980  xor         eax,ebp  
00071982  mov         dword ptr [ebp-4],eax  
00071985  mov         ecx,offset _01ED43DE_NineNineDan@c (07C008h)  
0007198A  call        @__CheckForDebuggerJustMyCode@4 (071339h)  
0007198F  nop  
	int dan, num = 1;
00071990  mov         dword ptr [num],1  
	printf("몇 단? ");
00071997  push        offset string "\xb8\xee \xb4\xdc? " (077B30h)  
0007199C  call        _printf (0710DCh)  
000719A1  add         esp,4  
	scanf_s("%d", &dan);
000719A4  lea         eax,[dan]  
000719A7  push        eax  
000719A8  push        offset string "%d" (077B3Ch)  
000719AD  call        _scanf_s (071294h)  
000719B2  add         esp,8  

	while (num < 10)
000719B5  cmp         dword ptr [num],0Ah  
000719B9  jge         __$EncStackInitStart+77h (0719E3h)  
	{
		printf("%dX%d=%d\n", dan, num, dan * num);
000719BB  mov         eax,dword ptr [dan]  
000719BE  imul        eax,dword ptr [num]  
000719C2  push        eax  
000719C3  mov         ecx,dword ptr [num]  
000719C6  push        ecx  
000719C7  mov         edx,dword ptr [dan]  
000719CA  push        edx  
000719CB  push        offset string "%dX%d=%d\n" (077B40h)  
000719D0  call        _printf (0710DCh)  
000719D5  add         esp,10h  
		num++;
000719D8  mov         eax,dword ptr [num]  
000719DB  add         eax,1  
000719DE  mov         dword ptr [num],eax  
	}
000719E1  jmp         __$EncStackInitStart+49h (0719B5h)  

	return 0;
000719E3  xor         eax,eax  
}
000719E5  push        edx  
000719E6  mov         ecx,ebp  
000719E8  push        eax  
000719E9  lea         edx,ds:[71A14h]  
000719EF  call        @_RTC_CheckStackVars@8 (0711F4h)  
000719F4  pop         eax  
000719F5  pop         edx  
000719F6  pop         edi  
000719F7  pop         esi  
000719F8  pop         ebx  
000719F9  mov         ecx,dword ptr [ebp-4]  
000719FC  xor         ecx,ebp  
000719FE  call        @__security_check_cookie@4 (071159h)  
00071A03  add         esp,0DCh  
00071A09  cmp         ebp,esp  
00071A0B  call        __RTC_CheckEsp (071258h)  
00071A10  mov         esp,ebp  
00071A12  pop         ebp  
00071A13  ret

 

* _RTC_CheckStackVars

   Microsoft의 런타임 검증 도구(RTC, Runtime Checks) 중 하나로,

   디버깅 빌드에서 스택 변수의 초기화 상태와 무결성을 검사하는 함수

 

#include <stdio.h>

int main(void)
{
00FE1870  push        ebp  
00FE1871  mov         ebp,esp  
00FE1873  sub         esp,0D8h  
00FE1879  push        ebx  
00FE187A  push        esi  
00FE187B  push        edi  
00FE187C  lea         edi,[ebp-18h]  
00FE187F  mov         ecx,6  
00FE1884  mov         eax,0CCCCCCCCh  
00FE1889  rep stos    dword ptr es:[edi]  
00FE188B  mov         ecx,offset _3C2DE127_TwoToNine@c (0FEC008h)  
00FE1890  call        @__CheckForDebuggerJustMyCode@4 (0FE132Ah)  
00FE1895  nop  
	int cur = 2;
00FE1896  mov         dword ptr [cur],2  
	int is = 0;
00FE189D  mov         dword ptr [is],0  

	while (cur < 10)		// 2단부터 9단까지 반복
00FE18A4  cmp         dword ptr [cur],0Ah  
00FE18A8  jge         __$EncStackInitStart+7Bh (0FE18F7h)  
	{
		is = 1;				// 새로운 단의 시작을 위하여
00FE18AA  mov         dword ptr [is],1  
		while (is < 10)		// 각 단의 1부터 9의 곱을 표현
00FE18B1  cmp         dword ptr [is],0Ah  
00FE18B5  jge         __$EncStackInitStart+63h (0FE18DFh)  
		{
			printf("%dX%d=%d\n", cur, is, cur * is);
00FE18B7  mov         eax,dword ptr [cur]  
00FE18BA  imul        eax,dword ptr [is]  
00FE18BE  push        eax  
00FE18BF  mov         ecx,dword ptr [is]  
00FE18C2  push        ecx  
00FE18C3  mov         edx,dword ptr [cur]  
00FE18C6  push        edx  
00FE18C7  push        offset string "%dX%d=%d\n" (0FE7B30h)  
00FE18CC  call        _printf (0FE10D2h)  
00FE18D1  add         esp,10h  
			is++;
00FE18D4  mov         eax,dword ptr [is]  
00FE18D7  add         eax,1  
00FE18DA  mov         dword ptr [is],eax  
		}
00FE18DD  jmp         __$EncStackInitStart+35h (0FE18B1h)  
		cur++;				// 다음 단으로 넘어가기 위한 증가
00FE18DF  mov         eax,dword ptr [cur]  
00FE18E2  add         eax,1  
00FE18E5  mov         dword ptr [cur],eax  
		printf("\n");
00FE18E8  push        offset string "\n" (0FE7B3Ch)  
00FE18ED  call        _printf (0FE10D2h)  
00FE18F2  add         esp,4  
	}
00FE18F5  jmp         __$EncStackInitStart+28h (0FE18A4h)  
	return 0;
00FE18F7  xor         eax,eax  
}
00FE18F9  pop         edi  
00FE18FA  pop         esi  
00FE18FB  pop         ebx  
00FE18FC  add         esp,0D8h  
00FE1902  cmp         ebp,esp  
00FE1904  call        __RTC_CheckEsp (0FE124Eh)  
00FE1909  mov         esp,ebp  
00FE190B  pop         ebp  
00FE190C  ret

 

#include <stdio.h>

int main(void)
{
00281960  push        ebp  
00281961  mov         ebp,esp  
00281963  sub         esp,0DCh  
00281969  push        ebx  
0028196A  push        esi  
0028196B  push        edi  
0028196C  lea         edi,[ebp-1Ch]  
0028196F  mov         ecx,7  
00281974  mov         eax,0CCCCCCCCh  
00281979  rep stos    dword ptr es:[edi]  
0028197B  mov         eax,dword ptr [__security_cookie (028A000h)]  
00281980  xor         eax,ebp  
00281982  mov         dword ptr [ebp-4],eax  
00281985  mov         ecx,offset _0C6286EB_UsefulDoWhile@c (028C008h)  
0028198A  call        @__CheckForDebuggerJustMyCode@4 (0281339h)  
0028198F  nop  
	int total = 0, num = 0;
00281990  mov         dword ptr [total],0  
00281997  mov         dword ptr [num],0  

	do
	{
		printf("정수 입력(0 to quit): ");
0028199E  push        offset string "\xc1\xa4\xbc\xf6 \xc0\xd4\xb7\xc2(0 to quit): " (0287B30h)  
002819A3  call        _printf (02810DCh)  
002819A8  add         esp,4  
		scanf_s("%d", &num);
002819AB  lea         eax,[num]  
002819AE  push        eax  
002819AF  push        offset string "%d" (0287B4Ch)  
002819B4  call        _scanf_s (0281294h)  
002819B9  add         esp,8  
		total += num;
002819BC  mov         eax,dword ptr [total]  
002819BF  add         eax,dword ptr [num]  
002819C2  mov         dword ptr [total],eax  
	} while (num != 0);
002819C5  cmp         dword ptr [num],0  
002819C9  jne         __$EncStackInitStart+32h (028199Eh)  

	printf("합계 : %d\n", total);
002819CB  mov         eax,dword ptr [total]  
002819CE  push        eax  
002819CF  push        offset string "\xc7\xd5\xb0\xe8 : %d\n" (0287B50h)  
002819D4  call        _printf (02810DCh)  
002819D9  add         esp,8  

	return 0;
002819DC  xor         eax,eax  
}
002819DE  push        edx  
002819DF  mov         ecx,ebp  
002819E1  push        eax  
002819E2  lea         edx,ds:[281A10h]  
002819E8  call        @_RTC_CheckStackVars@8 (02811F4h)  
002819ED  pop         eax  
002819EE  pop         edx  
002819EF  pop         edi  
002819F0  pop         esi  
002819F1  pop         ebx  
002819F2  mov         ecx,dword ptr [ebp-4]  
002819F5  xor         ecx,ebp  
002819F7  call        @__security_check_cookie@4 (0281159h)  
002819FC  add         esp,0DCh  
00281A02  cmp         ebp,esp  
00281A04  call        __RTC_CheckEsp (0281258h)  
00281A09  mov         esp,ebp  
00281A0B  pop         ebp  
00281A0C  ret

 

#include <stdio.h>

int main(void)
{
00281960  push        ebp  
00281961  mov         ebp,esp  
00281963  sub         esp,0DCh  
00281969  push        ebx  
0028196A  push        esi  
0028196B  push        edi  
0028196C  lea         edi,[ebp-1Ch]  
0028196F  mov         ecx,7  
00281974  mov         eax,0CCCCCCCCh  
00281979  rep stos    dword ptr es:[edi]  
0028197B  mov         eax,dword ptr [__security_cookie (028A000h)]  
00281980  xor         eax,ebp  
00281982  mov         dword ptr [ebp-4],eax  
00281985  mov         ecx,offset _0C6286EB_UsefulDoWhile@c (028C008h)  
0028198A  call        @__CheckForDebuggerJustMyCode@4 (0281339h)  
0028198F  nop  
	int total = 0, num = 0;
00281990  mov         dword ptr [total],0  
00281997  mov         dword ptr [num],0  

	do
	{
		printf("정수 입력(0 to quit): ");
0028199E  push        offset string "\xc1\xa4\xbc\xf6 \xc0\xd4\xb7\xc2(0 to quit): " (0287B30h)  
002819A3  call        _printf (02810DCh)  
002819A8  add         esp,4  
		scanf_s("%d", &num);
002819AB  lea         eax,[num]  
002819AE  push        eax  
002819AF  push        offset string "%d" (0287B4Ch)  
002819B4  call        _scanf_s (0281294h)  
002819B9  add         esp,8  
		total += num;
002819BC  mov         eax,dword ptr [total]  
002819BF  add         eax,dword ptr [num]  
002819C2  mov         dword ptr [total],eax  
	} while (num != 0);
002819C5  cmp         dword ptr [num],0  
002819C9  jne         __$EncStackInitStart+32h (028199Eh)  

	printf("합계 : %d\n", total);
002819CB  mov         eax,dword ptr [total]  
002819CE  push        eax  
002819CF  push        offset string "\xc7\xd5\xb0\xe8 : %d\n" (0287B50h)  
002819D4  call        _printf (02810DCh)  
002819D9  add         esp,8  

	return 0;
002819DC  xor         eax,eax  
}
002819DE  push        edx  
002819DF  mov         ecx,ebp  
002819E1  push        eax  
002819E2  lea         edx,ds:[281A10h]  
002819E8  call        @_RTC_CheckStackVars@8 (02811F4h)  
002819ED  pop         eax  
002819EE  pop         edx  
002819EF  pop         edi  
002819F0  pop         esi  
002819F1  pop         ebx  
002819F2  mov         ecx,dword ptr [ebp-4]  
002819F5  xor         ecx,ebp  
002819F7  call        @__security_check_cookie@4 (0281159h)  
002819FC  add         esp,0DCh  
00281A02  cmp         ebp,esp  
00281A04  call        __RTC_CheckEsp (0281258h)  
00281A09  mov         esp,ebp  
00281A0B  pop         ebp  
00281A0C  ret

 

#include <stdio.h>

int main(void)
{
004A1960  push        ebp  
004A1961  mov         ebp,esp  
004A1963  sub         esp,0F0h  
004A1969  push        ebx  
004A196A  push        esi  
004A196B  push        edi  
004A196C  lea         edi,[ebp-30h]  
004A196F  mov         ecx,0Ch  
004A1974  mov         eax,0CCCCCCCCh  
004A1979  rep stos    dword ptr es:[edi]  
004A197B  mov         eax,dword ptr [__security_cookie (04AA000h)]  
004A1980  xor         eax,ebp  
004A1982  mov         dword ptr [ebp-4],eax  
004A1985  mov         ecx,offset _0D0A2CD4_RealMean@c (04AC008h)  
004A198A  call        @__CheckForDebuggerJustMyCode@4 (04A1339h)  
004A198F  nop  
	double total = 0.0;
004A1990  xorps       xmm0,xmm0  
004A1993  movsd       mmword ptr [total],xmm0  
	double input = 0.0;
004A1998  xorps       xmm0,xmm0  
004A199B  movsd       mmword ptr [input],xmm0  
	int num = 0;
004A19A0  mov         dword ptr [num],0  

	for (; input >= 0.0;)
004A19A7  movsd       xmm0,mmword ptr [input]  
004A19AC  comisd      xmm0,mmword ptr [__real@0000000000000000 (04A7B68h)]  
004A19B4  jb          __$EncStackInitStart+82h (04A19EEh)  
	{
		total += input;
004A19B6  movsd       xmm0,mmword ptr [total]  
004A19BB  addsd       xmm0,mmword ptr [input]  
004A19C0  movsd       mmword ptr [total],xmm0  
		printf("실수 입력(minus to quit) : ");
004A19C5  push        offset string "\xbd\xc7\xbc\xf6 \xc0\xd4\xb7\xc2(minus to quit) : " (04A7B30h)  
004A19CA  call        _printf (04A10DCh)  
004A19CF  add         esp,4  
		scanf_s("%lf", &input);
004A19D2  lea         eax,[input]  
004A19D5  push        eax  
004A19D6  push        offset string "%lf" (04A7B54h)  
004A19DB  call        _scanf_s (04A1294h)  
004A19E0  add         esp,8  
		num++;
004A19E3  mov         eax,dword ptr [num]  
004A19E6  add         eax,1  
004A19E9  mov         dword ptr [num],eax  
	}
004A19EC  jmp         __$EncStackInitStart+3Bh (04A19A7h)  
	printf("평균: %f\n", total / (num - 1));
004A19EE  mov         eax,dword ptr [num]  
004A19F1  sub         eax,1  
004A19F4  cvtsi2sd    xmm0,eax  
004A19F8  movsd       xmm1,mmword ptr [total]  
004A19FD  divsd       xmm1,xmm0  
004A1A01  sub         esp,8  
004A1A04  movsd       mmword ptr [esp],xmm1  
004A1A09  push        offset string "\xc6\xf2\xb1\xd5: %f\n" (04A7B58h)  
004A1A0E  call        _printf (04A10DCh)  
004A1A13  add         esp,0Ch  

	return 0;
004A1A16  xor         eax,eax  
}
004A1A18  push        edx  
004A1A19  mov         ecx,ebp  
004A1A1B  push        eax  
004A1A1C  lea         edx,ds:[4A1A48h]  
004A1A22  call        @_RTC_CheckStackVars@8 (04A11F4h)  
004A1A27  pop         eax  
004A1A28  pop         edx  
004A1A29  pop         edi  
004A1A2A  pop         esi  
004A1A2B  pop         ebx  
004A1A2C  mov         ecx,dword ptr [ebp-4]  
004A1A2F  xor         ecx,ebp  
004A1A31  call        @__security_check_cookie@4 (04A1159h)  
004A1A36  add         esp,0F0h  
004A1A3C  cmp         ebp,esp  
004A1A3E  call        __RTC_CheckEsp (04A1258h)  
004A1A43  mov         esp,ebp  
004A1A45  pop         ebp  
004A1A46  ret

 

* cvtsi2sd(Convert Integer to Scalar Double-Precision Floating-Point Value)

   정수를 스칼라(double- precision) 부동소수점 값으로 변환하는 명령어

 

* movsd(Move Scalar Double-Precision Floating-Point Value)

   스칼라(double- precision) 부동소수점 값을 복사(이동)하는 명령어

 

* mmword

   64비트 단위 데이터를 가리키는 데이터 크기 지정자

 

#include <stdio.h>

int main(void)
{
00041870  push        ebp  
00041871  mov         ebp,esp  
00041873  sub         esp,0D8h  
00041879  push        ebx  
0004187A  push        esi  
0004187B  push        edi  
0004187C  lea         edi,[ebp-18h]  
0004187F  mov         ecx,6  
00041884  mov         eax,0CCCCCCCCh  
00041889  rep stos    dword ptr es:[edi]  
0004188B  mov         ecx,offset _C11275EC_TwoToNineForVer@c (04C008h)  
00041890  call        @__CheckForDebuggerJustMyCode@4 (04132Ah)  
00041895  nop  
	int cur, is;

	for (cur = 2; cur < 10; cur++)
00041896  mov         dword ptr [cur],2  
0004189D  jmp         __$EncStackInitStart+2Ch (0418A8h)  
0004189F  mov         eax,dword ptr [cur]  
000418A2  add         eax,1  
000418A5  mov         dword ptr [cur],eax  
000418A8  cmp         dword ptr [cur],0Ah  
000418AC  jge         __$EncStackInitStart+78h (0418F4h)  
	{
		for (is = 1; is < 10; is++)
000418AE  mov         dword ptr [is],1  
000418B5  jmp         __$EncStackInitStart+44h (0418C0h)  
000418B7  mov         eax,dword ptr [is]  
000418BA  add         eax,1  
000418BD  mov         dword ptr [is],eax  
000418C0  cmp         dword ptr [is],0Ah  
000418C4  jge         __$EncStackInitStart+69h (0418E5h)  
			printf("%dX%d=%d\n", cur, is, cur * is);
000418C6  mov         eax,dword ptr [cur]  
000418C9  imul        eax,dword ptr [is]  
000418CD  push        eax  
000418CE  mov         ecx,dword ptr [is]  
000418D1  push        ecx  
000418D2  mov         edx,dword ptr [cur]  
000418D5  push        edx  
000418D6  push        offset string "%dX%d=%d\n" (047B30h)  
000418DB  call        _printf (0410D2h)  
000418E0  add         esp,10h  
000418E3  jmp         __$EncStackInitStart+3Bh (0418B7h)  
		printf("\n");
000418E5  push        offset string "\n" (047B3Ch)  
000418EA  call        _printf (0410D2h)  
000418EF  add         esp,4  
	}
000418F2  jmp         __$EncStackInitStart+23h (04189Fh)  
}
000418F4  xor         eax,eax  
000418F6  pop         edi  
000418F7  pop         esi  
000418F8  pop         ebx  
000418F9  add         esp,0D8h  
000418FF  cmp         ebp,esp  
00041901  call        __RTC_CheckEsp (04124Eh)  
00041906  mov         esp,ebp  
00041908  pop         ebp  
00041909  ret