#include <stdio.h>
int main(void)
{
00631870 push ebp
00631871 mov ebp,esp
00631873 sub esp,0F4h
00631879 push ebx
0063187A push esi
0063187B push edi
0063187C lea edi,[ebp-34h]
0063187F mov ecx,0Dh
00631884 mov eax,0CCCCCCCCh
00631889 rep stos dword ptr es:[edi]
0063188B mov ecx,offset _3312D6C9_ArrayAccess@c (063C008h)
00631890 call @__CheckForDebuggerJustMyCode@4 (063132Ah)
00631895 nop
int arr[5];
int sum = 0, i;
00631896 mov dword ptr [sum],0
arr[0] = 10, arr[1] = 20, arr[2] = 30, arr[3] = 40, arr[4] = 50;
0063189D mov eax,4
006318A2 imul ecx,eax,0
006318A5 mov dword ptr arr[ecx],0Ah
006318AD mov edx,4
006318B2 shl edx,0
006318B5 mov dword ptr arr[edx],14h
006318BD mov eax,4
006318C2 shl eax,1
006318C4 mov dword ptr arr[eax],1Eh
006318CC mov ecx,4
006318D1 imul edx,ecx,3
006318D4 mov dword ptr arr[edx],28h
006318DC mov eax,4
006318E1 shl eax,2
006318E4 mov dword ptr arr[eax],32h
for (i = 0; i < 5; i++)
006318EC mov dword ptr [i],0
006318F3 jmp __$EncStackInitStart+82h (06318FEh)
006318F5 mov eax,dword ptr [i]
006318F8 add eax,1
006318FB mov dword ptr [i],eax
006318FE cmp dword ptr [i],5
00631902 jge __$EncStackInitStart+97h (0631913h)
sum += arr[i];
00631904 mov eax,dword ptr [i]
00631907 mov ecx,dword ptr [sum]
0063190A add ecx,dword ptr arr[eax*4]
0063190E mov dword ptr [sum],ecx
00631911 jmp __$EncStackInitStart+79h (06318F5h)
printf("배열요소에 저장된 값의 합 : %d", sum);
00631913 mov eax,dword ptr [sum]
00631916 push eax
00631917 push offset string "\xb9\xe8\xbf\xad\xbf\xe4\xbc\xd2\xbf\xa1 \xc0\xfa\xc0\xe5\xb5\xc8 \xb0\xaa\xc0\xc7 \xc7\xd5 : %d" (0637B30h)
0063191C call _printf (06310D2h)
00631921 add esp,8
return 0;
00631924 xor eax,eax
}
00631926 push edx
00631927 mov ecx,ebp
00631929 push eax
0063192A lea edx,ds:[63194Ch]
00631930 call @_RTC_CheckStackVars@8 (06311EAh)
00631935 pop eax
00631936 pop edx
00631937 pop edi
00631938 pop esi
00631939 pop ebx
0063193A add esp,0F4h
00631940 cmp ebp,esp
00631942 call __RTC_CheckEsp (063124Eh)
00631947 mov esp,ebp
00631949 pop ebp
0063194A ret
#include <stdio.h>
int main(void)
{
00007FF61E4B1890 push rbp
00007FF61E4B1892 push rdi
00007FF61E4B1893 sub rsp,158h
00007FF61E4B189A lea rbp,[rsp+20h]
00007FF61E4B189F lea rdi,[rsp+20h]
00007FF61E4B18A4 mov ecx,1Eh
00007FF61E4B18A9 mov eax,0CCCCCCCCh
00007FF61E4B18AE rep stos dword ptr [rdi]
00007FF61E4B18B0 lea rcx,[__3312D6C9_ArrayAccess@c (07FF61E4C2008h)]
00007FF61E4B18B7 call __CheckForDebuggerJustMyCode (07FF61E4B136Bh)
00007FF61E4B18BC nop
int arr[5];
int sum = 0, i;
00007FF61E4B18BD mov dword ptr [sum],0
arr[0] = 10, arr[1] = 20, arr[2] = 30, arr[3] = 40, arr[4] = 50;
00007FF61E4B18C4 mov eax,4
00007FF61E4B18C9 imul rax,rax,0
00007FF61E4B18CD mov dword ptr arr[rax],0Ah
00007FF61E4B18D5 mov eax,4
00007FF61E4B18DA imul rax,rax,1
00007FF61E4B18DE mov dword ptr arr[rax],14h
00007FF61E4B18E6 mov eax,4
00007FF61E4B18EB imul rax,rax,2
00007FF61E4B18EF mov dword ptr arr[rax],1Eh
00007FF61E4B18F7 mov eax,4
00007FF61E4B18FC imul rax,rax,3
00007FF61E4B1900 mov dword ptr arr[rax],28h
00007FF61E4B1908 mov eax,4
00007FF61E4B190D imul rax,rax,4
00007FF61E4B1911 mov dword ptr arr[rax],32h
for (i = 0; i < 5; i++)
00007FF61E4B1919 mov dword ptr [i],0
00007FF61E4B1920 jmp __$EncStackInitStart+8Bh (07FF61E4B192Ah)
00007FF61E4B1922 mov eax,dword ptr [i]
00007FF61E4B1925 inc eax
00007FF61E4B1927 mov dword ptr [i],eax
00007FF61E4B192A cmp dword ptr [i],5
00007FF61E4B192E jge __$EncStackInitStart+0A5h (07FF61E4B1944h)
sum += arr[i];
00007FF61E4B1930 movsxd rax,dword ptr [i]
00007FF61E4B1934 mov eax,dword ptr arr[rax*4]
00007FF61E4B1938 mov ecx,dword ptr [sum]
00007FF61E4B193B add ecx,eax
00007FF61E4B193D mov eax,ecx
00007FF61E4B193F mov dword ptr [sum],eax
00007FF61E4B1942 jmp __$EncStackInitStart+83h (07FF61E4B1922h)
printf("배열요소에 저장된 값의 합 : %d", sum);
00007FF61E4B1944 mov edx,dword ptr [sum]
00007FF61E4B1947 lea rcx,[string "\xb9\xe8\xbf\xad\xbf\xe4\xbc\xd2\xbf\xa1 \xc0\xfa\xc0\xe5\xb5\xc8 \xb0\xaa\xc0\xc7 \xc7\xd5 : %d" (07FF61E4BACA8h)]
00007FF61E4B194E call printf (07FF61E4B1195h)
00007FF61E4B1953 nop
return 0;
00007FF61E4B1954 xor eax,eax
}
00007FF61E4B1956 mov edi,eax
00007FF61E4B1958 lea rcx,[rbp-20h]
00007FF61E4B195C lea rdx,[__xt_z+1E0h (07FF61E4BAC80h)]
00007FF61E4B1963 call _RTC_CheckStackVars (07FF61E4B1307h)
00007FF61E4B1968 mov eax,edi
00007FF61E4B196A lea rsp,[rbp+138h]
00007FF61E4B1971 pop rdi
00007FF61E4B1972 pop rbp
00007FF61E4B1973 ret
#include <stdio.h>
int main(void)
{
00B11870 push ebp
00B11871 mov ebp,esp
00B11873 sub esp,0DCh
00B11879 push ebx
00B1187A push esi
00B1187B push edi
00B1187C lea edi,[ebp-1Ch]
00B1187F mov ecx,7
00B11884 mov eax,0CCCCCCCCh
00B11889 rep stos dword ptr es:[edi]
00B1188B mov eax,dword ptr [__security_cookie (0B1A000h)]
00B11890 xor eax,ebp
00B11892 mov dword ptr [ebp-4],eax
00B11895 mov ecx,offset _1BD3FA0E_ArrayString@c (0B1C008h)
00B1189A call @__CheckForDebuggerJustMyCode@4 (0B1132Ah)
00B1189F nop
char str[] = "Good morning!";
00B118A0 mov eax,dword ptr [string "Good morning!" (0B17B30h)]
00B118A5 mov dword ptr [str],eax
00B118A8 mov ecx,dword ptr ds:[0B17B34h]
00B118AE mov dword ptr [ebp-14h],ecx
00B118B1 mov edx,dword ptr ds:[0B17B38h]
00B118B7 mov dword ptr [ebp-10h],edx
00B118BA mov ax,word ptr ds:[00B17B3Ch]
00B118C0 mov word ptr [ebp-0Ch],ax
printf("배열 str의 크기: %d\n", (int)sizeof(str));
00B118C4 push 0Eh
00B118C6 push offset string "\xb9\xe8\xbf\xad str\xc0\xc7 \xc5\xa9\xb1\xe2: %d\n" (0B17B40h)
00B118CB call _printf (0B110D2h)
00B118D0 add esp,8
printf("널 문자 문자형 출력: %c\n", str[13]);
00B118D3 mov eax,1
00B118D8 imul ecx,eax,0Dh
00B118DB movsx edx,byte ptr str[ecx]
00B118E0 push edx
00B118E1 push offset string "\xb3\xce \xb9\xae\xc0\xda \xb9\xae\xc0\xda\xc7\xfc \xc3\xe2\xb7\xc2: %c\n" (0B17B5Ch)
00B118E6 call _printf (0B110D2h)
00B118EB add esp,8
printf("널 문자 정수형 출력: %d\n", str[13]);
00B118EE mov eax,1
00B118F3 imul ecx,eax,0Dh
00B118F6 movsx edx,byte ptr str[ecx]
00B118FB push edx
00B118FC push offset string "\xb3\xce \xb9\xae\xc0\xda \xc1\xa4\xbc\xf6\xc7\xfc \xc3\xe2\xb7\xc2: %d\n" (0B17B7Ch)
00B11901 call _printf (0B110D2h)
00B11906 add esp,8
str[12] = '?'; // 배열 str에 저장된 문자열 데이터는 변경 가능!
00B11909 mov eax,1
00B1190E imul ecx,eax,0Ch
00B11911 mov byte ptr str[ecx],3Fh
printf("문자열 출력 : %s\n", str);
00B11916 lea eax,[str]
00B11919 push eax
00B1191A push offset string "\xb9\xae\xc0\xda\xbf\xad \xc3\xe2\xb7\xc2 : %s\n" (0B17B9Ch)
00B1191F call _printf (0B110D2h)
00B11924 add esp,8
return 0;
00B11927 xor eax,eax
}
00B11929 push edx
00B1192A mov ecx,ebp
00B1192C push eax
00B1192D lea edx,ds:[0B11958h]
00B11933 call @_RTC_CheckStackVars@8 (0B111EAh)
00B11938 pop eax
00B11939 pop edx
00B1193A pop edi
00B1193B pop esi
00B1193C pop ebx
00B1193D mov ecx,dword ptr [ebp-4]
00B11940 xor ecx,ebp
00B11942 call @__security_check_cookie@4 (0B1114Fh)
00B11947 add esp,0DCh
00B1194D cmp ebp,esp
00B1194F call __RTC_CheckEsp (0B1124Eh)
00B11954 mov esp,ebp
00B11956 pop ebp
00B11957 ret
#include <stdio.h>
int main(void)
{
00007FF6F0ED1890 push rbp
00007FF6F0ED1892 push rsi
00007FF6F0ED1893 push rdi
00007FF6F0ED1894 sub rsp,110h
00007FF6F0ED189B lea rbp,[rsp+20h]
00007FF6F0ED18A0 lea rdi,[rsp+20h]
00007FF6F0ED18A5 mov ecx,0Ch
00007FF6F0ED18AA mov eax,0CCCCCCCCh
00007FF6F0ED18AF rep stos dword ptr [rdi]
00007FF6F0ED18B1 mov rax,qword ptr [__security_cookie (07FF6F0EDD000h)]
00007FF6F0ED18B8 xor rax,rbp
00007FF6F0ED18BB mov qword ptr [rbp+0E8h],rax
00007FF6F0ED18C2 lea rcx,[__1BD3FA0E_ArrayString@c (07FF6F0EE2008h)]
00007FF6F0ED18C9 call __CheckForDebuggerJustMyCode (07FF6F0ED136Bh)
00007FF6F0ED18CE nop
char str[] = "Good morning!";
00007FF6F0ED18CF lea rax,[str]
00007FF6F0ED18D3 lea rcx,[string "Good morning!" (07FF6F0EDACA8h)]
00007FF6F0ED18DA mov rdi,rax
00007FF6F0ED18DD mov rsi,rcx
00007FF6F0ED18E0 mov ecx,0Eh
00007FF6F0ED18E5 rep movs byte ptr [rdi],byte ptr [rsi]
printf("배열 str의 크기: %d\n", (int)sizeof(str));
00007FF6F0ED18E7 mov edx,0Eh
00007FF6F0ED18EC lea rcx,[string "\xb9\xe8\xbf\xad str\xc0\xc7 \xc5\xa9\xb1\xe2: %d\n" (07FF6F0EDACB8h)]
00007FF6F0ED18F3 call printf (07FF6F0ED1195h)
00007FF6F0ED18F8 nop
printf("널 문자 문자형 출력: %c\n", str[13]);
00007FF6F0ED18F9 mov eax,1
00007FF6F0ED18FE imul rax,rax,0Dh
00007FF6F0ED1902 movsx eax,byte ptr str[rax]
00007FF6F0ED1907 mov edx,eax
00007FF6F0ED1909 lea rcx,[string "\xb3\xce \xb9\xae\xc0\xda \xb9\xae\xc0\xda\xc7\xfc \xc3\xe2\xb7\xc2: %c\n" (07FF6F0EDACD8h)]
00007FF6F0ED1910 call printf (07FF6F0ED1195h)
00007FF6F0ED1915 nop
printf("널 문자 정수형 출력: %d\n", str[13]);
00007FF6F0ED1916 mov eax,1
00007FF6F0ED191B imul rax,rax,0Dh
00007FF6F0ED191F movsx eax,byte ptr str[rax]
00007FF6F0ED1924 mov edx,eax
00007FF6F0ED1926 lea rcx,[string "\xb3\xce \xb9\xae\xc0\xda \xc1\xa4\xbc\xf6\xc7\xfc \xc3\xe2\xb7\xc2: %d\n" (07FF6F0EDACF8h)]
00007FF6F0ED192D call printf (07FF6F0ED1195h)
00007FF6F0ED1932 nop
str[12] = '?'; // 배열 str에 저장된 문자열 데이터는 변경 가능!
00007FF6F0ED1933 mov eax,1
00007FF6F0ED1938 imul rax,rax,0Ch
00007FF6F0ED193C mov byte ptr str[rax],3Fh
printf("문자열 출력 : %s\n", str);
00007FF6F0ED1941 lea rdx,[str]
00007FF6F0ED1945 lea rcx,[string "\xb9\xae\xc0\xda\xbf\xad \xc3\xe2\xb7\xc2 : %s\n" (07FF6F0EDAD18h)]
00007FF6F0ED194C call printf (07FF6F0ED1195h)
00007FF6F0ED1951 nop
return 0;
00007FF6F0ED1952 xor eax,eax
}
00007FF6F0ED1954 mov edi,eax
00007FF6F0ED1956 lea rcx,[rbp-20h]
00007FF6F0ED195A lea rdx,[__xt_z+1E0h (07FF6F0EDAC80h)]
00007FF6F0ED1961 call _RTC_CheckStackVars (07FF6F0ED1307h)
00007FF6F0ED1966 mov eax,edi
00007FF6F0ED1968 mov rcx,qword ptr [rbp+0E8h]
00007FF6F0ED196F xor rcx,rbp
00007FF6F0ED1972 call __security_check_cookie (07FF6F0ED11AEh)
00007FF6F0ED1977 lea rsp,[rbp+0F0h]
00007FF6F0ED197E pop rdi
00007FF6F0ED197F pop rsi
00007FF6F0ED1980 pop rbp
00007FF6F0ED1981 ret
#include <stdio.h>
#include <windows.h>
int main(void)
{
00661960 push ebp
00661961 mov ebp,esp
00661963 sub esp,10Ch
00661969 push ebx
0066196A push esi
0066196B push edi
0066196C lea edi,[ebp-4Ch]
0066196F mov ecx,13h
00661974 mov eax,0CCCCCCCCh
00661979 rep stos dword ptr es:[edi]
0066197B mov eax,dword ptr [__security_cookie (066A000h)]
00661980 xor eax,ebp
00661982 mov dword ptr [ebp-4],eax
00661985 mov ecx,offset _B00F1283_ReadString@c (066C0A2h)
0066198A call @__CheckForDebuggerJustMyCode@4 (0661339h)
0066198F nop
char str[50];
int idx = 0;
00661990 mov dword ptr [idx],0
printf("문자열 입력: ");
00661997 push offset string "\xb9\xae\xc0\xda\xbf\xad \xc0\xd4\xb7\xc2: " (0667B30h)
0066199C call _printf (06610DCh)
006619A1 add esp,4
scanf_s("%s", str, (unsigned int)_countof(str)); // 문자열을 입력 받아서 배열 str에 저장
006619A4 push 32h
006619A6 lea eax,[str]
006619A9 push eax
006619AA push offset string "%s" (0667B40h)
006619AF call _scanf_s (0661294h)
006619B4 add esp,0Ch
printf("문자 단위 출력: ");
006619B7 push offset string "\xb9\xae\xc0\xda \xb4\xdc\xc0\xa7 \xc3\xe2\xb7\xc2: " (0667B44h)
006619BC call _printf (06610DCh)
006619C1 add esp,4
while (str[idx] != '\0') // 문자열 끝까지 출력
006619C4 mov eax,dword ptr [idx]
006619C7 movsx ecx,byte ptr str[eax]
006619CC test ecx,ecx
006619CE je __$EncStackInitStart+85h (06619F1h)
{
printf("%c", str[idx]);
006619D0 mov eax,dword ptr [idx]
006619D3 movsx ecx,byte ptr str[eax]
006619D8 push ecx
006619D9 push offset string "%c" (0667B58h)
006619DE call _printf (06610DCh)
006619E3 add esp,8
idx++;
006619E6 mov eax,dword ptr [idx]
006619E9 add eax,1
006619EC mov dword ptr [idx],eax
}
006619EF jmp __$EncStackInitStart+58h (06619C4h)
printf("\n");
006619F1 push offset string "\n" (0667B5Ch)
006619F6 call _printf (06610DCh)
006619FB add esp,4
return 0;
006619FE xor eax,eax
}
00661A00 push edx
00661A01 mov ecx,ebp
00661A03 push eax
00661A04 lea edx,ds:[661A30h]
00661A0A call @_RTC_CheckStackVars@8 (06611F4h)
00661A0F pop eax
00661A10 pop edx
00661A11 pop edi
00661A12 pop esi
00661A13 pop ebx
00661A14 mov ecx,dword ptr [ebp-4]
00661A17 xor ecx,ebp
00661A19 call @__security_check_cookie@4 (0661159h)
00661A1E add esp,10Ch
00661A24 cmp ebp,esp
00661A26 call __RTC_CheckEsp (0661258h)
00661A2B mov esp,ebp
00661A2D pop ebp
00661A2E ret
#include <stdio.h>
#include <windows.h>
int main(void)
{
00007FF70D621980 push rbp
00007FF70D621982 push rdi
00007FF70D621983 sub rsp,158h
00007FF70D62198A lea rbp,[rsp+20h]
00007FF70D62198F lea rdi,[rsp+20h]
00007FF70D621994 mov ecx,1Eh
00007FF70D621999 mov eax,0CCCCCCCCh
00007FF70D62199E rep stos dword ptr [rdi]
00007FF70D6219A0 mov rax,qword ptr [__security_cookie (07FF70D62D000h)]
00007FF70D6219A7 xor rax,rbp
00007FF70D6219AA mov qword ptr [rbp+128h],rax
00007FF70D6219B1 lea rcx,[__B00F1283_ReadString@c (07FF70D6320A2h)]
00007FF70D6219B8 call __CheckForDebuggerJustMyCode (07FF70D62137Ah)
00007FF70D6219BD nop
char str[50];
int idx = 0;
00007FF70D6219BE mov dword ptr [idx],0
printf("문자열 입력: ");
00007FF70D6219C5 lea rcx,[string "\xb9\xae\xc0\xda\xbf\xad \xc0\xd4\xb7\xc2: " (07FF70D62AD28h)]
00007FF70D6219CC call printf (07FF70D62119Ah)
00007FF70D6219D1 nop
scanf_s("%s", str, (unsigned int)_countof(str)); // 문자열을 입력 받아서 배열 str에 저장
00007FF70D6219D2 mov r8d,32h
00007FF70D6219D8 lea rdx,[str]
00007FF70D6219DC lea rcx,[string "%s" (07FF70D62AD38h)]
00007FF70D6219E3 call scanf_s (07FF70D621203h)
00007FF70D6219E8 nop
printf("문자 단위 출력: ");
00007FF70D6219E9 lea rcx,[string "\xb9\xae\xc0\xda \xb4\xdc\xc0\xa7 \xc3\xe2\xb7\xc2: " (07FF70D62AD40h)]
00007FF70D6219F0 call printf (07FF70D62119Ah)
00007FF70D6219F5 nop
while (str[idx] != '\0') // 문자열 끝까지 출력
00007FF70D6219F6 movsxd rax,dword ptr [idx]
00007FF70D6219FA movsx eax,byte ptr str[rax]
00007FF70D6219FF test eax,eax
00007FF70D621A01 je __$EncStackInitStart+96h (07FF70D621A25h)
{
printf("%c", str[idx]);
00007FF70D621A03 movsxd rax,dword ptr [idx]
00007FF70D621A07 movsx eax,byte ptr str[rax]
00007FF70D621A0C mov edx,eax
00007FF70D621A0E lea rcx,[string "%c" (07FF70D62AD54h)]
00007FF70D621A15 call printf (07FF70D62119Ah)
00007FF70D621A1A nop
idx++;
00007FF70D621A1B mov eax,dword ptr [idx]
00007FF70D621A1E inc eax
00007FF70D621A20 mov dword ptr [idx],eax
}
00007FF70D621A23 jmp __$EncStackInitStart+67h (07FF70D6219F6h)
printf("\n");
00007FF70D621A25 lea rcx,[string "\n" (07FF70D62AD58h)]
00007FF70D621A2C call printf (07FF70D62119Ah)
00007FF70D621A31 nop
return 0;
00007FF70D621A32 xor eax,eax
}
00007FF70D621A34 mov edi,eax
00007FF70D621A36 lea rcx,[rbp-20h]
00007FF70D621A3A lea rdx,[__xt_z+260h (07FF70D62AD00h)]
00007FF70D621A41 call _RTC_CheckStackVars (07FF70D621316h)
00007FF70D621A46 mov eax,edi
00007FF70D621A48 mov rcx,qword ptr [rbp+128h]
00007FF70D621A4F xor rcx,rbp
00007FF70D621A52 call __security_check_cookie (07FF70D6211B3h)
00007FF70D621A57 lea rsp,[rbp+138h]
00007FF70D621A5E pop rdi
00007FF70D621A5F pop rbp
00007FF70D621A60 ret
* x86 64비트 rcx, rdx, r8d 레지스터를 이용해 매개변수 전달
* 널 문자의 아스키 코드 값은 0
따라서, '\0'과 0 둘 다 널 문자이다
#include <stdio.h>
int main(void)
{
00821870 push ebp
00821871 mov ebp,esp
00821873 sub esp,0E8h
00821879 push ebx
0082187A push esi
0082187B push edi
0082187C lea edi,[ebp-28h]
0082187F mov ecx,0Ah
00821884 mov eax,0CCCCCCCCh
00821889 rep stos dword ptr es:[edi]
0082188B mov eax,dword ptr [__security_cookie (082A000h)]
00821890 xor eax,ebp
00821892 mov dword ptr [ebp-4],eax
00821895 mov ecx,offset _EB6AFEA5_PointerOperation@c (082C008h)
0082189A call @__CheckForDebuggerJustMyCode@4 (082132Ah)
0082189F nop
int num1 = 100, num2 = 100;
008218A0 mov dword ptr [num1],64h
008218A7 mov dword ptr [num2],64h
int* pnum;
pnum = &num1;
008218AE lea eax,[num1]
008218B1 mov dword ptr [pnum],eax
(*pnum) += 30;
008218B4 mov eax,dword ptr [pnum]
008218B7 mov ecx,dword ptr [eax]
008218B9 add ecx,1Eh
008218BC mov edx,dword ptr [pnum]
008218BF mov dword ptr [edx],ecx
pnum = &num2;
008218C1 lea eax,[num2]
008218C4 mov dword ptr [pnum],eax
(*pnum) -= 30;
008218C7 mov eax,dword ptr [pnum]
008218CA mov ecx,dword ptr [eax]
008218CC sub ecx,1Eh
008218CF mov edx,dword ptr [pnum]
008218D2 mov dword ptr [edx],ecx
printf("num1: %d, num2: %d\n", num1, num2);
008218D4 mov eax,dword ptr [num2]
008218D7 push eax
008218D8 mov ecx,dword ptr [num1]
008218DB push ecx
008218DC push offset string "num1: %d, num2: %d\n" (0827B30h)
008218E1 call _printf (08210D2h)
008218E6 add esp,0Ch
return 0;
008218E9 xor eax,eax
}
008218EB push edx
008218EC mov ecx,ebp
008218EE push eax
008218EF lea edx,ds:[82191Ch]
008218F5 call @_RTC_CheckStackVars@8 (08211EAh)
008218FA pop eax
008218FB pop edx
008218FC pop edi
008218FD pop esi
008218FE pop ebx
008218FF mov ecx,dword ptr [ebp-4]
00821902 xor ecx,ebp
00821904 call @__security_check_cookie@4 (082114Fh)
00821909 add esp,0E8h
0082190F cmp ebp,esp
00821911 call __RTC_CheckEsp (082124Eh)
00821916 mov esp,ebp
00821918 pop ebp
00821919 ret
#include <stdio.h>
int main(void)
{
00007FF663F41890 push rbp
00007FF663F41892 push rdi
00007FF663F41893 sub rsp,148h
00007FF663F4189A lea rbp,[rsp+20h]
00007FF663F4189F lea rdi,[rsp+20h]
00007FF663F418A4 mov ecx,1Ah
00007FF663F418A9 mov eax,0CCCCCCCCh
00007FF663F418AE rep stos dword ptr [rdi]
00007FF663F418B0 mov rax,qword ptr [__security_cookie (07FF663F4D000h)]
00007FF663F418B7 xor rax,rbp
00007FF663F418BA mov qword ptr [rbp+118h],rax
00007FF663F418C1 lea rcx,[__EB6AFEA5_PointerOperation@c (07FF663F52008h)]
00007FF663F418C8 call __CheckForDebuggerJustMyCode (07FF663F4136Bh)
00007FF663F418CD nop
int num1 = 100, num2 = 100;
00007FF663F418CE mov dword ptr [num1],64h
00007FF663F418D5 mov dword ptr [num2],64h
int* pnum;
pnum = &num1;
00007FF663F418DC lea rax,[num1]
00007FF663F418E0 mov qword ptr [pnum],rax
(*pnum) += 30;
00007FF663F418E4 mov rax,qword ptr [pnum]
00007FF663F418E8 mov eax,dword ptr [rax]
00007FF663F418EA add eax,1Eh
00007FF663F418ED mov rcx,qword ptr [pnum]
00007FF663F418F1 mov dword ptr [rcx],eax
pnum = &num2;
00007FF663F418F3 lea rax,[num2]
00007FF663F418F7 mov qword ptr [pnum],rax
(*pnum) -= 30;
00007FF663F418FB mov rax,qword ptr [pnum]
00007FF663F418FF mov eax,dword ptr [rax]
00007FF663F41901 sub eax,1Eh
00007FF663F41904 mov rcx,qword ptr [pnum]
00007FF663F41908 mov dword ptr [rcx],eax
printf("num1: %d, num2: %d\n", num1, num2);
00007FF663F4190A mov r8d,dword ptr [num2]
00007FF663F4190E mov edx,dword ptr [num1]
00007FF663F41911 lea rcx,[string "num1: %d, num2: %d\n" (07FF663F4ACF0h)]
00007FF663F41918 call printf (07FF663F41195h)
00007FF663F4191D nop
return 0;
00007FF663F4191E xor eax,eax
}
00007FF663F41920 mov edi,eax
00007FF663F41922 lea rcx,[rbp-20h]
00007FF663F41926 lea rdx,[__xt_z+220h (07FF663F4ACC0h)]
00007FF663F4192D call _RTC_CheckStackVars (07FF663F41307h)
00007FF663F41932 mov eax,edi
00007FF663F41934 mov rcx,qword ptr [rbp+118h]
00007FF663F4193B xor rcx,rbp
00007FF663F4193E call __security_check_cookie (07FF663F411AEh)
00007FF663F41943 lea rsp,[rbp+128h]
00007FF663F4194A pop rdi
00007FF663F4194B pop rbp
00007FF663F4194C ret
* 배열의 이름은 포인터, 그 값을 바꿀 수 없는 상수 형태의 포인터
#include <stdio.h>
int main(void)
{
00821870 push ebp
00821871 mov ebp,esp
00821873 sub esp,0E8h
00821879 push ebx
0082187A push esi
0082187B push edi
0082187C lea edi,[ebp-28h]
0082187F mov ecx,0Ah
00821884 mov eax,0CCCCCCCCh
00821889 rep stos dword ptr es:[edi]
0082188B mov eax,dword ptr [__security_cookie (082A000h)]
00821890 xor eax,ebp
00821892 mov dword ptr [ebp-4],eax
00821895 mov ecx,offset _EB6AFEA5_PointerOperation@c (082C008h)
0082189A call @__CheckForDebuggerJustMyCode@4 (082132Ah)
0082189F nop
int num1 = 100, num2 = 100;
008218A0 mov dword ptr [num1],64h
008218A7 mov dword ptr [num2],64h
int* pnum;
pnum = &num1;
008218AE lea eax,[num1]
008218B1 mov dword ptr [pnum],eax
(*pnum) += 30;
008218B4 mov eax,dword ptr [pnum]
008218B7 mov ecx,dword ptr [eax]
008218B9 add ecx,1Eh
008218BC mov edx,dword ptr [pnum]
008218BF mov dword ptr [edx],ecx
pnum = &num2;
008218C1 lea eax,[num2]
008218C4 mov dword ptr [pnum],eax
(*pnum) -= 30;
008218C7 mov eax,dword ptr [pnum]
008218CA mov ecx,dword ptr [eax]
008218CC sub ecx,1Eh
008218CF mov edx,dword ptr [pnum]
008218D2 mov dword ptr [edx],ecx
printf("num1: %d, num2: %d\n", num1, num2);
008218D4 mov eax,dword ptr [num2]
008218D7 push eax
008218D8 mov ecx,dword ptr [num1]
008218DB push ecx
008218DC push offset string "num1: %d, num2: %d\n" (0827B30h)
008218E1 call _printf (08210D2h)
008218E6 add esp,0Ch
return 0;
008218E9 xor eax,eax
}
008218EB push edx
008218EC mov ecx,ebp
008218EE push eax
008218EF lea edx,ds:[82191Ch]
008218F5 call @_RTC_CheckStackVars@8 (08211EAh)
008218FA pop eax
008218FB pop edx
008218FC pop edi
008218FD pop esi
008218FE pop ebx
008218FF mov ecx,dword ptr [ebp-4]
00821902 xor ecx,ebp
00821904 call @__security_check_cookie@4 (082114Fh)
00821909 add esp,0E8h
0082190F cmp ebp,esp
00821911 call __RTC_CheckEsp (082124Eh)
00821916 mov esp,ebp
00821918 pop ebp
00821919 ret
#include <stdio.h>
int main(void)
{
00007FF663F41890 push rbp
00007FF663F41892 push rdi
00007FF663F41893 sub rsp,148h
00007FF663F4189A lea rbp,[rsp+20h]
00007FF663F4189F lea rdi,[rsp+20h]
00007FF663F418A4 mov ecx,1Ah
00007FF663F418A9 mov eax,0CCCCCCCCh
00007FF663F418AE rep stos dword ptr [rdi]
00007FF663F418B0 mov rax,qword ptr [__security_cookie (07FF663F4D000h)]
00007FF663F418B7 xor rax,rbp
00007FF663F418BA mov qword ptr [rbp+118h],rax
00007FF663F418C1 lea rcx,[__EB6AFEA5_PointerOperation@c (07FF663F52008h)]
00007FF663F418C8 call __CheckForDebuggerJustMyCode (07FF663F4136Bh)
00007FF663F418CD nop
int num1 = 100, num2 = 100;
00007FF663F418CE mov dword ptr [num1],64h
00007FF663F418D5 mov dword ptr [num2],64h
int* pnum;
pnum = &num1;
00007FF663F418DC lea rax,[num1]
00007FF663F418E0 mov qword ptr [pnum],rax
(*pnum) += 30;
00007FF663F418E4 mov rax,qword ptr [pnum]
00007FF663F418E8 mov eax,dword ptr [rax]
00007FF663F418EA add eax,1Eh
00007FF663F418ED mov rcx,qword ptr [pnum]
00007FF663F418F1 mov dword ptr [rcx],eax
pnum = &num2;
00007FF663F418F3 lea rax,[num2]
00007FF663F418F7 mov qword ptr [pnum],rax
(*pnum) -= 30;
00007FF663F418FB mov rax,qword ptr [pnum]
00007FF663F418FF mov eax,dword ptr [rax]
00007FF663F41901 sub eax,1Eh
00007FF663F41904 mov rcx,qword ptr [pnum]
00007FF663F41908 mov dword ptr [rcx],eax
printf("num1: %d, num2: %d\n", num1, num2);
00007FF663F4190A mov r8d,dword ptr [num2]
00007FF663F4190E mov edx,dword ptr [num1]
00007FF663F41911 lea rcx,[string "num1: %d, num2: %d\n" (07FF663F4ACF0h)]
00007FF663F41918 call printf (07FF663F41195h)
00007FF663F4191D nop
return 0;
00007FF663F4191E xor eax,eax
}
00007FF663F41920 mov edi,eax
00007FF663F41922 lea rcx,[rbp-20h]
00007FF663F41926 lea rdx,[__xt_z+220h (07FF663F4ACC0h)]
00007FF663F4192D call _RTC_CheckStackVars (07FF663F41307h)
00007FF663F41932 mov eax,edi
00007FF663F41934 mov rcx,qword ptr [rbp+118h]
00007FF663F4193B xor rcx,rbp
00007FF663F4193E call __security_check_cookie (07FF663F411AEh)
00007FF663F41943 lea rsp,[rbp+128h]
00007FF663F4194A pop rdi
00007FF663F4194B pop rbp
00007FF663F4194C ret
* qword
8바이트
#include <stdio.h>
int main(void)
{
00721870 push ebp
00721871 mov ebp,esp
00721873 sub esp,0F4h
00721879 push ebx
0072187A push esi
0072187B push edi
0072187C lea edi,[ebp-34h]
0072187F mov ecx,0Dh
00721884 mov eax,0CCCCCCCCh
00721889 rep stos dword ptr es:[edi]
0072188B mov ecx,offset _C409E4C8_ArrqyNamePointerOperation@c (072C008h)
00721890 call @__CheckForDebuggerJustMyCode@4 (072132Ah)
00721895 nop
int arr1[3] = { 1, 2, 3 };
00721896 mov dword ptr [arr1],1
0072189D mov dword ptr [ebp-0Ch],2
007218A4 mov dword ptr [ebp-8],3
double arr2[3] = { 1.1,2.2,3.3 };
007218AB movsd xmm0,mmword ptr [__real@3ff199999999999a (0727B38h)]
007218B3 movsd mmword ptr [arr2],xmm0
007218B8 movsd xmm0,mmword ptr [__real@400199999999999a (0727B48h)]
007218C0 movsd mmword ptr [ebp-28h],xmm0
007218C5 movsd xmm0,mmword ptr [__real@400a666666666666 (0727B58h)]
007218CD movsd mmword ptr [ebp-20h],xmm0
printf("%d %g\n", *arr1, *arr2);
007218D2 mov eax,8
007218D7 imul ecx,eax,0
007218DA sub esp,8
007218DD movsd xmm0,mmword ptr arr2[ecx]
007218E3 movsd mmword ptr [esp],xmm0
007218E8 mov edx,4
007218ED imul eax,edx,0
007218F0 mov ecx,dword ptr arr1[eax]
007218F4 push ecx
007218F5 push offset string "%d %g\n" (0727B30h)
007218FA call _printf (07210D2h)
007218FF add esp,10h
*arr1 += 100;
00721902 mov eax,4
00721907 imul ecx,eax,0
0072190A mov edx,dword ptr arr1[ecx]
0072190E add edx,64h
00721911 mov eax,4
00721916 imul ecx,eax,0
00721919 mov dword ptr arr1[ecx],edx
*arr2 += 120;
0072191D mov eax,8
00721922 imul ecx,eax,0
00721925 movsd xmm0,mmword ptr arr2[ecx]
0072192B addsd xmm0,mmword ptr [__real@405e000000000000 (0727B68h)]
00721933 mov edx,8
00721938 imul eax,edx,0
0072193B movsd mmword ptr arr2[eax],xmm0
printf("%d %g\n", *arr1, *arr2);
00721941 mov eax,8
00721946 imul ecx,eax,0
00721949 sub esp,8
0072194C movsd xmm0,mmword ptr arr2[ecx]
00721952 movsd mmword ptr [esp],xmm0
00721957 mov edx,4
0072195C imul eax,edx,0
0072195F mov ecx,dword ptr arr1[eax]
00721963 push ecx
00721964 push offset string "%d %g\n" (0727B30h)
00721969 call _printf (07210D2h)
0072196E add esp,10h
printf("%d %g\n", arr1[0], arr2[0]);
00721971 mov eax,8
00721976 imul ecx,eax,0
00721979 sub esp,8
0072197C movsd xmm0,mmword ptr arr2[ecx]
00721982 movsd mmword ptr [esp],xmm0
00721987 mov edx,4
0072198C imul eax,edx,0
0072198F mov ecx,dword ptr arr1[eax]
00721993 push ecx
00721994 push offset string "%d %g\n" (0727B30h)
00721999 call _printf (07210D2h)
0072199E add esp,10h
return 0;
007219A1 xor eax,eax
}
007219A3 push edx
007219A4 mov ecx,ebp
007219A6 push eax
007219A7 lea edx,ds:[7219C8h]
007219AD call @_RTC_CheckStackVars@8 (07211EAh)
007219B2 pop eax
007219B3 pop edx
007219B4 pop edi
007219B5 pop esi
007219B6 pop ebx
007219B7 add esp,0F4h
007219BD cmp ebp,esp
007219BF call __RTC_CheckEsp (072124Eh)
007219C4 mov esp,ebp
007219C6 pop ebp
007219C7 ret
#include <stdio.h>
int main(voie)
{
008F1870 push ebp
008F1871 mov ebp,esp
008F1873 sub esp,0E4h
008F1879 push ebx
008F187A push esi
008F187B push edi
008F187C lea edi,[ebp-24h]
008F187F mov ecx,9
008F1884 mov eax,0CCCCCCCCh
008F1889 rep stos dword ptr es:[edi]
008F188B mov eax,dword ptr [__security_cookie (08FA000h)]
008F1890 xor eax,ebp
008F1892 mov dword ptr [ebp-4],eax
008F1895 mov ecx,offset _2BE40005_ArrayNameIsPointer@c (08FC008h)
008F189A call @__CheckForDebuggerJustMyCode@4 (08F132Ah)
008F189F nop
int arr[3] = { 15,25,35 };
008F18A0 mov dword ptr [arr],0Fh
008F18A7 mov dword ptr [ebp-10h],19h
008F18AE mov dword ptr [ebp-0Ch],23h
int* ptr = &arr[0]; // int* ptr = arr; 동일한 문장
008F18B5 mov eax,4
008F18BA imul ecx,eax,0
008F18BD lea edx,arr[ecx]
008F18C1 mov dword ptr [ptr],edx
printf("%d %d\n", ptr[0], arr[0]);
008F18C4 mov eax,4
008F18C9 imul ecx,eax,0
008F18CC mov edx,dword ptr arr[ecx]
008F18D0 push edx
008F18D1 mov eax,4
008F18D6 imul ecx,eax,0
008F18D9 mov edx,dword ptr [ptr]
008F18DC mov eax,dword ptr [edx+ecx]
008F18DF push eax
008F18E0 push offset string "%d %d\n" (08F7B30h)
008F18E5 call _printf (08F10D2h)
008F18EA add esp,0Ch
printf("%d %d\n", ptr[1], arr[1]);
008F18ED mov eax,4
008F18F2 shl eax,0
008F18F5 mov ecx,dword ptr arr[eax]
008F18F9 push ecx
008F18FA mov edx,4
008F18FF shl edx,0
008F1902 mov eax,dword ptr [ptr]
008F1905 mov ecx,dword ptr [eax+edx]
008F1908 push ecx
008F1909 push offset string "%d %d\n" (08F7B30h)
008F190E call _printf (08F10D2h)
008F1913 add esp,0Ch
printf("%d %d\n", ptr[2], arr[2]);
008F1916 mov eax,4
008F191B shl eax,1
008F191D mov ecx,dword ptr arr[eax]
008F1921 push ecx
008F1922 mov edx,4
008F1927 shl edx,1
008F1929 mov eax,dword ptr [ptr]
008F192C mov ecx,dword ptr [eax+edx]
008F192F push ecx
008F1930 push offset string "%d %d\n" (08F7B30h)
008F1935 call _printf (08F10D2h)
008F193A add esp,0Ch
printf("%d %d\n", *ptr, *arr);
008F193D mov eax,4
008F1942 imul ecx,eax,0
008F1945 mov edx,dword ptr arr[ecx]
008F1949 push edx
008F194A mov eax,dword ptr [ptr]
008F194D mov ecx,dword ptr [eax]
008F194F push ecx
008F1950 push offset string "%d %d\n" (08F7B30h)
008F1955 call _printf (08F10D2h)
008F195A add esp,0Ch
return 0;
008F195D xor eax,eax
}
008F195F push edx
008F1960 mov ecx,ebp
008F1962 push eax
008F1963 lea edx,ds:[8F1990h]
008F1969 call @_RTC_CheckStackVars@8 (08F11EAh)
008F196E pop eax
008F196F pop edx
008F1970 pop edi
008F1971 pop esi
008F1972 pop ebx
008F1973 mov ecx,dword ptr [ebp-4]
008F1976 xor ecx,ebp
008F1978 call @__security_check_cookie@4 (08F114Fh)
008F197D add esp,0E4h
008F1983 cmp ebp,esp
008F1985 call __RTC_CheckEsp (08F124Eh)
008F198A mov esp,ebp
008F198C pop ebp
008F198D ret
#include <stdio.h>
int main(void)
{
00BD1870 push ebp
00BD1871 mov ebp,esp
00BD1873 sub esp,0D8h
00BD1879 push ebx
00BD187A push esi
00BD187B push edi
00BD187C lea edi,[ebp-18h]
00BD187F mov ecx,6
00BD1884 mov eax,0CCCCCCCCh
00BD1889 rep stos dword ptr es:[edi]
00BD188B mov ecx,offset _028D4307_PointerOperaionResult@c (0BDC008h)
00BD1890 call @__CheckForDebuggerJustMyCode@4 (0BD132Ah)
00BD1895 nop
int* ptr1 = 0x0010;
00BD1896 mov dword ptr [ptr1],10h
double* ptr2 = 0x0010;
00BD189D mov dword ptr [ptr2],10h
printf("%p %p\n", ptr1 + 1, ptr1 + 2); // 4 증가하고 8 증가한다
00BD18A4 mov eax,dword ptr [ptr1]
00BD18A7 add eax,8
00BD18AA push eax
00BD18AB mov ecx,dword ptr [ptr1]
00BD18AE add ecx,4
00BD18B1 push ecx
00BD18B2 push offset string "%p %p\n" (0BD7B30h)
00BD18B7 call _printf (0BD10D2h)
00BD18BC add esp,0Ch
printf("%p %p\n\n", ptr2 + 1, ptr2 + 2); // 8 증가하고 16 증가한다
00BD18BF mov eax,dword ptr [ptr2]
00BD18C2 add eax,10h
00BD18C5 push eax
00BD18C6 mov ecx,dword ptr [ptr2]
00BD18C9 add ecx,8
00BD18CC push ecx
00BD18CD push offset string "%p %p\n\n" (0BD7B38h)
00BD18D2 call _printf (0BD10D2h)
00BD18D7 add esp,0Ch
printf("%p %p\n", ptr1, ptr2);
00BD18DA mov eax,dword ptr [ptr2]
00BD18DD push eax
00BD18DE mov ecx,dword ptr [ptr1]
00BD18E1 push ecx
00BD18E2 push offset string "%p %p\n" (0BD7B30h)
00BD18E7 call _printf (0BD10D2h)
00BD18EC add esp,0Ch
ptr1++; // 4 증가
00BD18EF mov eax,dword ptr [ptr1]
00BD18F2 add eax,4
00BD18F5 mov dword ptr [ptr1],eax
ptr2++; // 8 증가
00BD18F8 mov eax,dword ptr [ptr2]
00BD18FB add eax,8
00BD18FE mov dword ptr [ptr2],eax
printf("%p %p\n", ptr1, ptr2);
00BD1901 mov eax,dword ptr [ptr2]
00BD1904 push eax
00BD1905 mov ecx,dword ptr [ptr1]
00BD1908 push ecx
00BD1909 push offset string "%p %p\n" (0BD7B30h)
00BD190E call _printf (0BD10D2h)
00BD1913 add esp,0Ch
return 0;
00BD1916 xor eax,eax
}
00BD1918 pop edi
00BD1919 pop esi
00BD191A pop ebx
00BD191B add esp,0D8h
00BD1921 cmp ebp,esp
00BD1923 call __RTC_CheckEsp (0BD124Eh)
00BD1928 mov esp,ebp
00BD192A pop ebp
00BD192B ret
#include <stdio.h>
int main(void)
{
00007FF6CD5C1890 push rbp
00007FF6CD5C1892 push rdi
00007FF6CD5C1893 sub rsp,128h
00007FF6CD5C189A lea rbp,[rsp+20h]
00007FF6CD5C189F lea rcx,[__028D4307_PointerOperaionResult@c (07FF6CD5D2008h)]
00007FF6CD5C18A6 call __CheckForDebuggerJustMyCode (07FF6CD5C136Bh)
00007FF6CD5C18AB nop
int* ptr1 = 0x0010;
00007FF6CD5C18AC mov qword ptr [ptr1],10h
double* ptr2 = 0x0010;
00007FF6CD5C18B4 mov qword ptr [ptr2],10h
printf("%p %p\n", ptr1 + 1, ptr1 + 2); // 4 증가하고 8 증가한다
00007FF6CD5C18BC mov rax,qword ptr [ptr1]
00007FF6CD5C18C0 add rax,8
00007FF6CD5C18C4 mov rcx,qword ptr [ptr1]
00007FF6CD5C18C8 add rcx,4
00007FF6CD5C18CC mov r8,rax
00007FF6CD5C18CF mov rdx,rcx
00007FF6CD5C18D2 lea rcx,[string "%p %p\n" (07FF6CD5CAC24h)]
00007FF6CD5C18D9 call printf (07FF6CD5C1195h)
00007FF6CD5C18DE nop
printf("%p %p\n\n", ptr2 + 1, ptr2 + 2); // 8 증가하고 16 증가한다
00007FF6CD5C18DF mov rax,qword ptr [ptr2]
00007FF6CD5C18E3 add rax,10h
00007FF6CD5C18E7 mov rcx,qword ptr [ptr2]
00007FF6CD5C18EB add rcx,8
00007FF6CD5C18EF mov r8,rax
00007FF6CD5C18F2 mov rdx,rcx
00007FF6CD5C18F5 lea rcx,[string "%p %p\n\n" (07FF6CD5CAC30h)]
00007FF6CD5C18FC call printf (07FF6CD5C1195h)
00007FF6CD5C1901 nop
printf("%p %p\n", ptr1, ptr2);
00007FF6CD5C1902 mov r8,qword ptr [ptr2]
00007FF6CD5C1906 mov rdx,qword ptr [ptr1]
00007FF6CD5C190A lea rcx,[string "%p %p\n" (07FF6CD5CAC24h)]
00007FF6CD5C1911 call printf (07FF6CD5C1195h)
00007FF6CD5C1916 nop
ptr1++; // 4 증가
00007FF6CD5C1917 mov rax,qword ptr [ptr1]
00007FF6CD5C191B add rax,4
00007FF6CD5C191F mov qword ptr [ptr1],rax
ptr2++; // 8 증가
00007FF6CD5C1923 mov rax,qword ptr [ptr2]
00007FF6CD5C1927 add rax,8
00007FF6CD5C192B mov qword ptr [ptr2],rax
printf("%p %p\n", ptr1, ptr2);
00007FF6CD5C192F mov r8,qword ptr [ptr2]
00007FF6CD5C1933 mov rdx,qword ptr [ptr1]
00007FF6CD5C1937 lea rcx,[string "%p %p\n" (07FF6CD5CAC24h)]
00007FF6CD5C193E call printf (07FF6CD5C1195h)
00007FF6CD5C1943 nop
return 0;
00007FF6CD5C1944 xor eax,eax
}
00007FF6CD5C1946 lea rsp,[rbp+108h]
00007FF6CD5C194D pop rdi
00007FF6CD5C194E pop rbp
00007FF6CD5C194F ret
* x86 64비트 rcx, rdx, r8 레지스터를 이용해 매개변수 전달
#include <stdio.h>
int main(void)
{
00291870 push ebp
00291871 mov ebp,esp
00291873 sub esp,0E4h
00291879 push ebx
0029187A push esi
0029187B push edi
0029187C lea edi,[ebp-24h]
0029187F mov ecx,9
00291884 mov eax,0CCCCCCCCh
00291889 rep stos dword ptr es:[edi]
0029188B mov eax,dword ptr [__security_cookie (029A000h)]
00291890 xor eax,ebp
00291892 mov dword ptr [ebp-4],eax
00291895 mov ecx,offset _51EBF2B1_PointerBaseArrayAccess@c (029C008h)
0029189A call @__CheckForDebuggerJustMyCode@4 (029132Ah)
0029189F nop
int arr[3] = { 11,22,33 };
002918A0 mov dword ptr [arr],0Bh
002918A7 mov dword ptr [ebp-10h],16h
002918AE mov dword ptr [ebp-0Ch],21h
int* ptr = arr;
002918B5 lea eax,[arr]
002918B8 mov dword ptr [ptr],eax
printf("%d %d %d\n", *ptr, *(ptr + 1), *(ptr + 2));
002918BB mov eax,dword ptr [ptr]
002918BE mov ecx,dword ptr [eax+8]
002918C1 push ecx
002918C2 mov edx,dword ptr [ptr]
002918C5 mov eax,dword ptr [edx+4]
002918C8 push eax
002918C9 mov ecx,dword ptr [ptr]
002918CC mov edx,dword ptr [ecx]
002918CE push edx
002918CF push offset string "%d %d %d\n" (0297B30h)
002918D4 call _printf (02910D2h)
002918D9 add esp,10h
printf("%d ", *ptr); ptr++;
002918DC mov eax,dword ptr [ptr]
002918DF mov ecx,dword ptr [eax]
002918E1 push ecx
002918E2 push offset string "%d " (0297B3Ch)
002918E7 call _printf (02910D2h)
002918EC add esp,8
002918EF mov eax,dword ptr [ptr]
002918F2 add eax,4
002918F5 mov dword ptr [ptr],eax
printf("%d ", *ptr); ptr++;
002918F8 mov eax,dword ptr [ptr]
002918FB mov ecx,dword ptr [eax]
002918FD push ecx
002918FE push offset string "%d " (0297B3Ch)
00291903 call _printf (02910D2h)
00291908 add esp,8
0029190B mov eax,dword ptr [ptr]
0029190E add eax,4
00291911 mov dword ptr [ptr],eax
printf("%d ", *ptr); ptr--;
00291914 mov eax,dword ptr [ptr]
00291917 mov ecx,dword ptr [eax]
00291919 push ecx
0029191A push offset string "%d " (0297B3Ch)
0029191F call _printf (02910D2h)
00291924 add esp,8
00291927 mov eax,dword ptr [ptr]
0029192A sub eax,4
0029192D mov dword ptr [ptr],eax
printf("%d ", *ptr); ptr--;
00291930 mov eax,dword ptr [ptr]
00291933 mov ecx,dword ptr [eax]
00291935 push ecx
00291936 push offset string "%d " (0297B3Ch)
0029193B call _printf (02910D2h)
00291940 add esp,8
00291943 mov eax,dword ptr [ptr]
00291946 sub eax,4
00291949 mov dword ptr [ptr],eax
printf("%d ", *ptr); printf("\n");
0029194C mov eax,dword ptr [ptr]
0029194F mov ecx,dword ptr [eax]
00291951 push ecx
00291952 push offset string "%d " (0297B3Ch)
00291957 call _printf (02910D2h)
0029195C add esp,8
0029195F push offset string "\n" (0297B40h)
00291964 call _printf (02910D2h)
00291969 add esp,4
return 0;
0029196C xor eax,eax
}
0029196E push edx
0029196F mov ecx,ebp
00291971 push eax
00291972 lea edx,ds:[2919A0h]
00291978 call @_RTC_CheckStackVars@8 (02911EAh)
0029197D pop eax
0029197E pop edx
0029197F pop edi
00291980 pop esi
00291981 pop ebx
00291982 mov ecx,dword ptr [ebp-4]
00291985 xor ecx,ebp
00291987 call @__security_check_cookie@4 (029114Fh)
0029198C add esp,0E4h
00291992 cmp ebp,esp
00291994 call __RTC_CheckEsp (029124Eh)
00291999 mov esp,ebp
0029199B pop ebp
0029199C ret
#include <stdio.h>
int main(void)
{
00007FF674601890 push rbp
00007FF674601892 push rdi
00007FF674601893 sub rsp,138h
00007FF67460189A lea rbp,[rsp+20h]
00007FF67460189F lea rdi,[rsp+20h]
00007FF6746018A4 mov ecx,16h
00007FF6746018A9 mov eax,0CCCCCCCCh
00007FF6746018AE rep stos dword ptr [rdi]
00007FF6746018B0 mov rax,qword ptr [__security_cookie (07FF67460D000h)]
00007FF6746018B7 xor rax,rbp
00007FF6746018BA mov qword ptr [rbp+108h],rax
00007FF6746018C1 lea rcx,[__51EBF2B1_PointerBaseArrayAccess@c (07FF674612008h)]
00007FF6746018C8 call __CheckForDebuggerJustMyCode (07FF67460136Bh)
00007FF6746018CD nop
int arr[3] = { 11,22,33 };
00007FF6746018CE mov dword ptr [arr],0Bh
00007FF6746018D5 mov dword ptr [rbp+0Ch],16h
00007FF6746018DC mov dword ptr [rbp+10h],21h
int* ptr = arr;
00007FF6746018E3 lea rax,[arr]
00007FF6746018E7 mov qword ptr [ptr],rax
printf("%d %d %d\n", *ptr, *(ptr + 1), *(ptr + 2));
00007FF6746018EB mov rax,qword ptr [ptr]
00007FF6746018EF mov r9d,dword ptr [rax+8]
00007FF6746018F3 mov rax,qword ptr [ptr]
00007FF6746018F7 mov r8d,dword ptr [rax+4]
00007FF6746018FB mov rax,qword ptr [ptr]
00007FF6746018FF mov edx,dword ptr [rax]
00007FF674601901 lea rcx,[string "%d %d %d\n" (07FF67460ACA8h)]
00007FF674601908 call printf (07FF674601195h)
00007FF67460190D nop
printf("%d ", *ptr); ptr++;
00007FF67460190E mov rax,qword ptr [ptr]
00007FF674601912 mov edx,dword ptr [rax]
00007FF674601914 lea rcx,[string "%d " (07FF67460ACB4h)]
00007FF67460191B call printf (07FF674601195h)
00007FF674601920 nop
00007FF674601921 mov rax,qword ptr [ptr]
00007FF674601925 add rax,4
00007FF674601929 mov qword ptr [ptr],rax
printf("%d ", *ptr); ptr++;
00007FF67460192D mov rax,qword ptr [ptr]
00007FF674601931 mov edx,dword ptr [rax]
00007FF674601933 lea rcx,[string "%d " (07FF67460ACB4h)]
00007FF67460193A call printf (07FF674601195h)
00007FF67460193F nop
00007FF674601940 mov rax,qword ptr [ptr]
00007FF674601944 add rax,4
00007FF674601948 mov qword ptr [ptr],rax
printf("%d ", *ptr); ptr--;
00007FF67460194C mov rax,qword ptr [ptr]
00007FF674601950 mov edx,dword ptr [rax]
00007FF674601952 lea rcx,[string "%d " (07FF67460ACB4h)]
00007FF674601959 call printf (07FF674601195h)
00007FF67460195E nop
00007FF67460195F mov rax,qword ptr [ptr]
00007FF674601963 sub rax,4
00007FF674601967 mov qword ptr [ptr],rax
printf("%d ", *ptr); ptr--;
00007FF67460196B mov rax,qword ptr [ptr]
00007FF67460196F mov edx,dword ptr [rax]
00007FF674601971 lea rcx,[string "%d " (07FF67460ACB4h)]
00007FF674601978 call printf (07FF674601195h)
00007FF67460197D nop
00007FF67460197E mov rax,qword ptr [ptr]
00007FF674601982 sub rax,4
00007FF674601986 mov qword ptr [ptr],rax
printf("%d ", *ptr); printf("\n");
00007FF67460198A mov rax,qword ptr [ptr]
00007FF67460198E mov edx,dword ptr [rax]
00007FF674601990 lea rcx,[string "%d " (07FF67460ACB4h)]
00007FF674601997 call printf (07FF674601195h)
00007FF67460199C nop
00007FF67460199D lea rcx,[string "\n" (07FF67460ACB8h)]
00007FF6746019A4 call printf (07FF674601195h)
00007FF6746019A9 nop
return 0;
00007FF6746019AA xor eax,eax
}
00007FF6746019AC mov edi,eax
00007FF6746019AE lea rcx,[rbp-20h]
00007FF6746019B2 lea rdx,[__xt_z+1E0h (07FF67460AC80h)]
00007FF6746019B9 call _RTC_CheckStackVars (07FF674601307h)
00007FF6746019BE mov eax,edi
00007FF6746019C0 mov rcx,qword ptr [rbp+108h]
00007FF6746019C7 xor rcx,rbp
00007FF6746019CA call __security_check_cookie (07FF6746011AEh)
00007FF6746019CF lea rsp,[rbp+118h]
00007FF6746019D6 pop rdi
00007FF6746019D7 pop rbp
00007FF6746019D8 ret
* arr[i] === *(arr + 1)
* 문자열 선언 두 가지 방식
① 변수 형태의 문자열
② 상수 형태의 문자열
#include <stdio.h>
int main(void)
{
007A1870 push ebp
007A1871 mov ebp,esp
007A1873 sub esp,0E4h
007A1879 push ebx
007A187A push esi
007A187B push edi
007A187C lea edi,[ebp-24h]
007A187F mov ecx,9
007A1884 mov eax,0CCCCCCCCh
007A1889 rep stos dword ptr es:[edi]
007A188B mov eax,dword ptr [__security_cookie (07AA000h)]
007A1890 xor eax,ebp
007A1892 mov dword ptr [ebp-4],eax
007A1895 mov ecx,offset _FCE9E3FA_TwoStringType@c (07AC008h)
007A189A call @__CheckForDebuggerJustMyCode@4 (07A132Ah)
007A189F nop
char str1[] = "My String-1"; // 변수 형태의 문자열
007A18A0 mov eax,dword ptr [string "My String-1" (07A7B30h)]
007A18A5 mov dword ptr [str1],eax
007A18A8 mov ecx,dword ptr ds:[7A7B34h]
007A18AE mov dword ptr [ebp-10h],ecx
007A18B1 mov edx,dword ptr ds:[7A7B38h]
007A18B7 mov dword ptr [ebp-0Ch],edx
char* str2 = "My String-2"; // 상수 형태의 문자열
007A18BA mov dword ptr [str2],offset string "My String-2" (07A7B40h)
printf("%s %s\n", str1, str2);
007A18C1 mov eax,dword ptr [str2]
007A18C4 push eax
007A18C5 lea ecx,[str1]
007A18C8 push ecx
007A18C9 push offset string "%s %s\n" (07A7B50h)
007A18CE call _printf (07A10D2h)
007A18D3 add esp,0Ch
str2 = "Our String"; // 가리키는 대상 변경
007A18D6 mov dword ptr [str2],offset string "Our String" (07A7B58h)
printf("%s %s\n", str1, str2);
007A18DD mov eax,dword ptr [str2]
007A18E0 push eax
007A18E1 lea ecx,[str1]
007A18E4 push ecx
007A18E5 push offset string "%s %s\n" (07A7B50h)
007A18EA call _printf (07A10D2h)
007A18EF add esp,0Ch
str1[0] = 'x'; // 문자열 변경 성공
007A18F2 mov eax,1
007A18F7 imul ecx,eax,0
007A18FA mov byte ptr str1[ecx],78h
//str2[0] = 'x'; // 문자열 변경 실패
printf("%s %s\n", str1, str2);
007A18FF mov eax,dword ptr [str2]
007A1902 push eax
007A1903 lea ecx,[str1]
007A1906 push ecx
007A1907 push offset string "%s %s\n" (07A7B50h)
007A190C call _printf (07A10D2h)
007A1911 add esp,0Ch
return 0;
007A1914 xor eax,eax
}
007A1916 push edx
007A1917 mov ecx,ebp
007A1919 push eax
007A191A lea edx,ds:[7A1948h]
007A1920 call @_RTC_CheckStackVars@8 (07A11EAh)
007A1925 pop eax
007A1926 pop edx
007A1927 pop edi
007A1928 pop esi
007A1929 pop ebx
007A192A mov ecx,dword ptr [ebp-4]
007A192D xor ecx,ebp
007A192F call @__security_check_cookie@4 (07A114Fh)
007A1934 add esp,0E4h
007A193A cmp ebp,esp
007A193C call __RTC_CheckEsp (07A124Eh)
007A1941 mov esp,ebp
007A1943 pop ebp
007A1944 ret
#include <stdio.h>
int main(void)
{
00007FF6570F1890 push rbp
00007FF6570F1892 push rsi
00007FF6570F1893 push rdi
00007FF6570F1894 sub rsp,130h
00007FF6570F189B lea rbp,[rsp+20h]
00007FF6570F18A0 lea rdi,[rsp+20h]
00007FF6570F18A5 mov ecx,14h
00007FF6570F18AA mov eax,0CCCCCCCCh
00007FF6570F18AF rep stos dword ptr [rdi]
00007FF6570F18B1 mov rax,qword ptr [__security_cookie (07FF6570FD000h)]
00007FF6570F18B8 xor rax,rbp
00007FF6570F18BB mov qword ptr [rbp+108h],rax
00007FF6570F18C2 lea rcx,[__FCE9E3FA_TwoStringType@c (07FF657102008h)]
00007FF6570F18C9 call __CheckForDebuggerJustMyCode (07FF6570F136Bh)
00007FF6570F18CE nop
char str1[] = "My String-1"; // 변수 형태의 문자열
00007FF6570F18CF lea rax,[str1]
00007FF6570F18D3 lea rcx,[string "My String-1" (07FF6570FACA8h)]
00007FF6570F18DA mov rdi,rax
00007FF6570F18DD mov rsi,rcx
00007FF6570F18E0 mov ecx,0Ch
00007FF6570F18E5 rep movs byte ptr [rdi],byte ptr [rsi]
char* str2 = "My String-2"; // 상수 형태의 문자열
00007FF6570F18E7 lea rax,[string "My String-2" (07FF6570FACB8h)]
00007FF6570F18EE mov qword ptr [str2],rax
printf("%s %s\n", str1, str2);
00007FF6570F18F2 mov r8,qword ptr [str2]
00007FF6570F18F6 lea rdx,[str1]
00007FF6570F18FA lea rcx,[string "%s %s\n" (07FF6570FACC8h)]
00007FF6570F1901 call printf (07FF6570F1195h)
00007FF6570F1906 nop
str2 = "Our String"; // 가리키는 대상 변경
00007FF6570F1907 lea rax,[string "Our String" (07FF6570FACD0h)]
00007FF6570F190E mov qword ptr [str2],rax
printf("%s %s\n", str1, str2);
00007FF6570F1912 mov r8,qword ptr [str2]
00007FF6570F1916 lea rdx,[str1]
00007FF6570F191A lea rcx,[string "%s %s\n" (07FF6570FACC8h)]
00007FF6570F1921 call printf (07FF6570F1195h)
00007FF6570F1926 nop
str1[0] = 'x'; // 문자열 변경 성공
00007FF6570F1927 mov eax,1
00007FF6570F192C imul rax,rax,0
00007FF6570F1930 mov byte ptr str1[rax],78h
//str2[0] = 'x'; // 문자열 변경 실패
printf("%s %s\n", str1, str2);
00007FF6570F1935 mov r8,qword ptr [str2]
00007FF6570F1939 lea rdx,[str1]
00007FF6570F193D lea rcx,[string "%s %s\n" (07FF6570FACC8h)]
00007FF6570F1944 call printf (07FF6570F1195h)
00007FF6570F1949 nop
return 0;
00007FF6570F194A xor eax,eax
}
00007FF6570F194C mov edi,eax
00007FF6570F194E lea rcx,[rbp-20h]
00007FF6570F1952 lea rdx,[__xt_z+1E0h (07FF6570FAC80h)]
00007FF6570F1959 call _RTC_CheckStackVars (07FF6570F1307h)
00007FF6570F195E mov eax,edi
00007FF6570F1960 mov rcx,qword ptr [rbp+108h]
00007FF6570F1967 xor rcx,rbp
00007FF6570F196A call __security_check_cookie (07FF6570F11AEh)
00007FF6570F196F lea rsp,[rbp+110h]
00007FF6570F1976 pop rdi
00007FF6570F1977 pop rsi
00007FF6570F1978 pop rbp
00007FF6570F1979 ret
#include <stdio.h>
int main(void)
{
00ED1870 push ebp
00ED1871 mov ebp,esp
00ED1873 sub esp,0D4h
00ED1879 push ebx
00ED187A push esi
00ED187B push edi
00ED187C lea edi,[ebp-14h]
00ED187F mov ecx,5
00ED1884 mov eax,0CCCCCCCCh
00ED1889 rep stos dword ptr es:[edi]
00ED188B mov ecx,offset _59F4CCFE_StringArray@c (0EDC008h)
00ED1890 call @__CheckForDebuggerJustMyCode@4 (0ED132Ah)
00ED1895 nop
char* strArr[3] = { "Simple", "String", "Array" };
00ED1896 mov dword ptr [strArr],offset string "Simple" (0ED7B30h)
00ED189D mov dword ptr [ebp-0Ch],offset string "String" (0ED7B38h)
00ED18A4 mov dword ptr [ebp-8],offset string "Array" (0ED7B40h)
printf("%s\n", strArr[0]);
00ED18AB mov eax,4
00ED18B0 imul ecx,eax,0
00ED18B3 mov edx,dword ptr strArr[ecx]
00ED18B7 push edx
00ED18B8 push offset string "%s\n" (0ED7B48h)
00ED18BD call _printf (0ED10D2h)
00ED18C2 add esp,8
printf("%s\n", strArr[1]);
00ED18C5 mov eax,4
00ED18CA shl eax,0
00ED18CD mov ecx,dword ptr strArr[eax]
00ED18D1 push ecx
00ED18D2 push offset string "%s\n" (0ED7B48h)
00ED18D7 call _printf (0ED10D2h)
00ED18DC add esp,8
printf("%s\n", strArr[2]);
00ED18DF mov eax,4
00ED18E4 shl eax,1
00ED18E6 mov ecx,dword ptr strArr[eax]
00ED18EA push ecx
00ED18EB push offset string "%s\n" (0ED7B48h)
00ED18F0 call _printf (0ED10D2h)
00ED18F5 add esp,8
return 0;
00ED18F8 xor eax,eax
}
00ED18FA push edx
00ED18FB mov ecx,ebp
00ED18FD push eax
00ED18FE lea edx,ds:[0ED1920h]
00ED1904 call @_RTC_CheckStackVars@8 (0ED11EAh)
00ED1909 pop eax
00ED190A pop edx
00ED190B pop edi
00ED190C pop esi
00ED190D pop ebx
00ED190E add esp,0D4h
00ED1914 cmp ebp,esp
00ED1916 call __RTC_CheckEsp (0ED124Eh)
00ED191B mov esp,ebp
00ED191D pop ebp
00ED191E ret
#include <stdio.h>
void ShowArrayElem(int* param, int len)
{
007C1830 push ebp
007C1831 mov ebp,esp
007C1833 sub esp,0CCh
007C1839 push ebx
007C183A push esi
007C183B push edi
007C183C lea edi,[ebp-0Ch]
007C183F mov ecx,3
007C1844 mov eax,0CCCCCCCCh
007C1849 rep stos dword ptr es:[edi]
007C184B mov ecx,offset _C8AFE5A2_ArrayParamAccess@c (07CC008h)
007C1850 call @__CheckForDebuggerJustMyCode@4 (07C1334h)
007C1855 nop
int i;
for (i = 0; i < len; i++)
007C1856 mov dword ptr [i],0
007C185D jmp __$EncStackInitStart+2Ch (07C1868h)
007C185F mov eax,dword ptr [i]
007C1862 add eax,1
007C1865 mov dword ptr [i],eax
007C1868 mov eax,dword ptr [i]
007C186B cmp eax,dword ptr [len]
007C186E jge __$EncStackInitStart+4Dh (07C1889h)
printf("%d ", param[i]);
007C1870 mov eax,dword ptr [i]
007C1873 mov ecx,dword ptr [param]
007C1876 mov edx,dword ptr [ecx+eax*4]
007C1879 push edx
007C187A push offset string "%d " (07C7B30h)
007C187F call _printf (07C10D2h)
007C1884 add esp,8
007C1887 jmp __$EncStackInitStart+23h (07C185Fh)
printf("\n");
007C1889 push offset string "\n" (07C7B34h)
007C188E call _printf (07C10D2h)
007C1893 add esp,4
}
007C1896 pop edi
007C1897 pop esi
007C1898 pop ebx
007C1899 add esp,0CCh
007C189F cmp ebp,esp
007C18A1 call __RTC_CheckEsp (07C1258h)
007C18A6 mov esp,ebp
007C18A8 pop ebp
007C18A9 ret
/////////////////////////////////////////////////////////////////////////////////////////////
void AddArrayElem(int* param, int len, int add)
{
007C17A0 push ebp
007C17A1 mov ebp,esp
007C17A3 sub esp,0CCh
007C17A9 push ebx
007C17AA push esi
007C17AB push edi
007C17AC lea edi,[ebp-0Ch]
007C17AF mov ecx,3
007C17B4 mov eax,0CCCCCCCCh
007C17B9 rep stos dword ptr es:[edi]
007C17BB mov ecx,offset _C8AFE5A2_ArrayParamAccess@c (07CC008h)
007C17C0 call @__CheckForDebuggerJustMyCode@4 (07C1334h)
007C17C5 nop
int i;
for (i = 0; i < len; i++)
007C17C6 mov dword ptr [i],0
007C17CD jmp __$EncStackInitStart+2Ch (07C17D8h)
007C17CF mov eax,dword ptr [i]
007C17D2 add eax,1
007C17D5 mov dword ptr [i],eax
007C17D8 mov eax,dword ptr [i]
007C17DB cmp eax,dword ptr [len]
007C17DE jge __$EncStackInitStart+4Bh (07C17F7h)
param[i] += add;
007C17E0 mov eax,dword ptr [i]
007C17E3 mov ecx,dword ptr [param]
007C17E6 mov edx,dword ptr [ecx+eax*4]
007C17E9 add edx,dword ptr [add]
007C17EC mov eax,dword ptr [i]
007C17EF mov ecx,dword ptr [param]
007C17F2 mov dword ptr [ecx+eax*4],edx
007C17F5 jmp __$EncStackInitStart+23h (07C17CFh)
}
007C17F7 pop edi
007C17F8 pop esi
007C17F9 pop ebx
007C17FA add esp,0CCh
007C1800 cmp ebp,esp
007C1802 call __RTC_CheckEsp (07C1258h)
007C1807 mov esp,ebp
007C1809 pop ebp
007C180A ret
////////////////////////////////////////////////////////////////////////////////////////////
int main(void)
{
007C19B0 push ebp
007C19B1 mov ebp,esp
007C19B3 sub esp,0D8h
007C19B9 push ebx
007C19BA push esi
007C19BB push edi
007C19BC lea edi,[ebp-18h]
007C19BF mov ecx,6
007C19C4 mov eax,0CCCCCCCCh
007C19C9 rep stos dword ptr es:[edi]
007C19CB mov eax,dword ptr [__security_cookie (07CA000h)]
007C19D0 xor eax,ebp
007C19D2 mov dword ptr [ebp-4],eax
007C19D5 mov ecx,offset _C8AFE5A2_ArrayParamAccess@c (07CC008h)
007C19DA call @__CheckForDebuggerJustMyCode@4 (07C1334h)
007C19DF nop
int arr[3] = { 1,2,3 };
007C19E0 mov dword ptr [arr],1
007C19E7 mov dword ptr [ebp-10h],2
007C19EE mov dword ptr [ebp-0Ch],3
ShowArrayElem(arr, sizeof(arr) / sizeof(int));
007C19F5 push 3
007C19F7 lea eax,[arr]
007C19FA push eax
007C19FB call _ShowArrayElem (07C1140h)
007C1A00 add esp,8
printf("\n");
007C1A03 push offset string "\n" (07C7B34h)
007C1A08 call _printf (07C10D2h)
007C1A0D add esp,4
AddArrayElem(arr, sizeof(arr) / sizeof(int), 1);
007C1A10 push 1
007C1A12 push 3
007C1A14 lea eax,[arr]
007C1A17 push eax
007C1A18 call _AddArrayElem (07C11E0h)
007C1A1D add esp,0Ch
ShowArrayElem(arr, sizeof(arr) / sizeof(int));
007C1A20 push 3
007C1A22 lea eax,[arr]
007C1A25 push eax
007C1A26 call _ShowArrayElem (07C1140h)
007C1A2B add esp,8
printf("\n");
007C1A2E push offset string "\n" (07C7B34h)
007C1A33 call _printf (07C10D2h)
007C1A38 add esp,4
AddArrayElem(arr, sizeof(arr) / sizeof(int), 2);
007C1A3B push 2
007C1A3D push 3
007C1A3F lea eax,[arr]
007C1A42 push eax
007C1A43 call _AddArrayElem (07C11E0h)
007C1A48 add esp,0Ch
ShowArrayElem(arr, sizeof(arr) / sizeof(int));
007C1A4B push 3
007C1A4D lea eax,[arr]
007C1A50 push eax
007C1A51 call _ShowArrayElem (07C1140h)
007C1A56 add esp,8
printf("\n");
007C1A59 push offset string "\n" (07C7B34h)
007C1A5E call _printf (07C10D2h)
007C1A63 add esp,4
AddArrayElem(arr, sizeof(arr) / sizeof(int), 3);
007C1A66 push 3
007C1A68 push 3
007C1A6A lea eax,[arr]
007C1A6D push eax
007C1A6E call _AddArrayElem (07C11E0h)
007C1A73 add esp,0Ch
ShowArrayElem(arr, sizeof(arr) / sizeof(int));
007C1A76 push 3
007C1A78 lea eax,[arr]
007C1A7B push eax
007C1A7C call _ShowArrayElem (07C1140h)
007C1A81 add esp,8
}
007C1A84 xor eax,eax
007C1A86 push edx
007C1A87 mov ecx,ebp
007C1A89 push eax
007C1A8A lea edx,ds:[7C1AB8h]
007C1A90 call @_RTC_CheckStackVars@8 (07C11F4h)
007C1A95 pop eax
007C1A96 pop edx
007C1A97 pop edi
007C1A98 pop esi
007C1A99 pop ebx
007C1A9A mov ecx,dword ptr [ebp-4]
007C1A9D xor ecx,ebp
007C1A9F call @__security_check_cookie@4 (07C1154h)
007C1AA4 add esp,0D8h
007C1AAA cmp ebp,esp
007C1AAC call __RTC_CheckEsp (07C1258h)
007C1AB1 mov esp,ebp
007C1AB3 pop ebp
007C1AB4 ret
* 함수 내에서는 인자로 전달받은 배열의 길이를 계산할 수 없다
배열의 주소 값을 인자로 전달받는 매개변수는 포인터 변수이기 때문
ㄴ sizeof 하면 배열의 크기가 아닌 포인터 변수의 크기가 반환
이렇듯 함수 내에서는 인자로 전달된 배열의 길이를 계산할 수가 없기 때문
ㄴ 배열의 크기나 길이 정보도 함께 인자로 전달 필요
#include <stdio.h>
void Swap(int n1, int n2)
{
001A1790 push ebp
001A1791 mov ebp,esp
001A1793 sub esp,0CCh
001A1799 push ebx
001A179A push esi
001A179B push edi
001A179C lea edi,[ebp-0Ch]
001A179F mov ecx,3
001A17A4 mov eax,0CCCCCCCCh
001A17A9 rep stos dword ptr es:[edi]
001A17AB mov ecx,1AC008h
001A17B0 call 001A132F
001A17B5 nop
int temp = n1;
001A17B6 mov eax,dword ptr [ebp+8]
001A17B9 mov dword ptr [ebp-8],eax
n1 = n2;
001A17BC mov eax,dword ptr [ebp+0Ch]
001A17BF mov dword ptr [ebp+8],eax
n2 = temp;
001A17C2 mov eax,dword ptr [ebp-8]
001A17C5 mov dword ptr [ebp+0Ch],eax
printf("n1, n2: %d %d\n", n1, n2);
001A17C8 mov eax,dword ptr [ebp+0Ch]
001A17CB push eax
001A17CC mov ecx,dword ptr [ebp+8]
001A17CF push ecx
001A17D0 push 1A7B30h
001A17D5 call 001A10D2
001A17DA add esp,0Ch
}
001A17DD pop edi
001A17DE pop esi
001A17DF pop ebx
001A17E0 add esp,0CCh
001A17E6 cmp ebp,esp
001A17E8 call 001A124E
001A17ED mov esp,ebp
001A17EF pop ebp
001A17F0 ret
///////////////////////////////////////////////////////////////////////////////////////////
int main(void)
{
001A18F0 push ebp
001A18F1 mov ebp,esp
001A18F3 sub esp,0D8h
001A18F9 push ebx
001A18FA push esi
001A18FB push edi
001A18FC lea edi,[ebp-18h]
001A18FF mov ecx,6
001A1904 mov eax,0CCCCCCCCh
001A1909 rep stos dword ptr es:[edi]
001A190B mov ecx,1AC008h
001A1910 call 001A132F
001A1915 nop
int num1 = 10;
001A1916 mov dword ptr [ebp-8],0Ah
int num2 = 20;
001A191D mov dword ptr [ebp-14h],14h
printf("num1 num2: %d %d\n", num1, num2);
001A1924 mov eax,dword ptr [ebp-14h]
001A1927 push eax
001A1928 mov ecx,dword ptr [ebp-8]
001A192B push ecx
001A192C push 1A7B44h
001A1931 call 001A10D2
001A1936 add esp,0Ch
Swap(num1, num2); // num1과 num2에 저장된 값이 바뀌길 기대
001A1939 mov eax,dword ptr [ebp-14h]
001A193C push eax
001A193D mov ecx,dword ptr [ebp-8]
001A1940 push ecx
001A1941 call 001A1267
001A1946 add esp,8
printf("num1 num2: %d %d\n", num1, num2);
001A1949 mov eax,dword ptr [ebp-14h]
001A194C push eax
001A194D mov ecx,dword ptr [ebp-8]
001A1950 push ecx
001A1951 push 1A7B44h
001A1956 call 001A10D2
001A195B add esp,0Ch
return 0;
001A195E xor eax,eax
}
001A1960 pop edi
001A1961 pop esi
001A1962 pop ebx
001A1963 add esp,0D8h
001A1969 cmp ebp,esp
001A196B call 001A124E
001A1970 mov esp,ebp
001A1972 pop ebp
001A1973 ret
#include <stdio.h>
void Swap(int n1, int n2)
{
00007FF6FE7C17B0 mov dword ptr [rsp+10h],edx
00007FF6FE7C17B4 mov dword ptr [rsp+8],ecx
00007FF6FE7C17B8 push rbp
00007FF6FE7C17B9 push rdi
00007FF6FE7C17BA sub rsp,108h
00007FF6FE7C17C1 lea rbp,[rsp+20h]
00007FF6FE7C17C6 lea rcx,[__ABC9C999_CallByValueSwap@c (07FF6FE7D2008h)]
00007FF6FE7C17CD call __CheckForDebuggerJustMyCode (07FF6FE7C1370h)
00007FF6FE7C17D2 nop
int temp = n1;
00007FF6FE7C17D3 mov eax,dword ptr [n1]
00007FF6FE7C17D9 mov dword ptr [temp],eax
n1 = n2;
00007FF6FE7C17DC mov eax,dword ptr [n2]
00007FF6FE7C17E2 mov dword ptr [n1],eax
n2 = temp;
00007FF6FE7C17E8 mov eax,dword ptr [temp]
00007FF6FE7C17EB mov dword ptr [n2],eax
printf("n1, n2: %d %d\n", n1, n2);
00007FF6FE7C17F1 mov r8d,dword ptr [n2]
00007FF6FE7C17F8 mov edx,dword ptr [n1]
00007FF6FE7C17FE lea rcx,[string "n1, n2: %d %d\n" (07FF6FE7CAC28h)]
00007FF6FE7C1805 call printf (07FF6FE7C119Ah)
00007FF6FE7C180A nop
}
00007FF6FE7C180B lea rsp,[rbp+0E8h]
00007FF6FE7C1812 pop rdi
00007FF6FE7C1813 pop rbp
00007FF6FE7C1814 ret
///////////////////////////////////////////////////////////////////////////////////////////
int main(void)
{
00007FF6FE7C1910 push rbp
00007FF6FE7C1912 push rdi
00007FF6FE7C1913 sub rsp,128h
00007FF6FE7C191A lea rbp,[rsp+20h]
00007FF6FE7C191F lea rcx,[__ABC9C999_CallByValueSwap@c (07FF6FE7D2008h)]
00007FF6FE7C1926 call __CheckForDebuggerJustMyCode (07FF6FE7C1370h)
00007FF6FE7C192B nop
int num1 = 10;
00007FF6FE7C192C mov dword ptr [num1],0Ah
int num2 = 20;
00007FF6FE7C1933 mov dword ptr [num2],14h
printf("num1 num2: %d %d\n", num1, num2);
00007FF6FE7C193A mov r8d,dword ptr [num2]
00007FF6FE7C193E mov edx,dword ptr [num1]
00007FF6FE7C1941 lea rcx,[string "num1 num2: %d %d\n" (07FF6FE7CAC40h)]
00007FF6FE7C1948 call printf (07FF6FE7C119Ah)
00007FF6FE7C194D nop
Swap(num1, num2); // num1과 num2에 저장된 값이 바뀌길 기대
00007FF6FE7C194E mov edx,dword ptr [num2]
00007FF6FE7C1951 mov ecx,dword ptr [num1]
00007FF6FE7C1954 call Swap (07FF6FE7C1186h)
00007FF6FE7C1959 nop
printf("num1 num2: %d %d\n", num1, num2);
00007FF6FE7C195A mov r8d,dword ptr [num2]
00007FF6FE7C195E mov edx,dword ptr [num1]
00007FF6FE7C1961 lea rcx,[string "num1 num2: %d %d\n" (07FF6FE7CAC40h)]
00007FF6FE7C1968 call printf (07FF6FE7C119Ah)
00007FF6FE7C196D nop
return 0;
00007FF6FE7C196E xor eax,eax
}
00007FF6FE7C1970 lea rsp,[rbp+108h]
00007FF6FE7C1977 pop rdi
00007FF6FE7C1978 pop rbp
00007FF6FE7C1979 ret
#include <stdio.h>
void Swap(int* ptr1, int* ptr2)
{
00EA1790 push ebp
00EA1791 mov ebp,esp
00EA1793 sub esp,0CCh
00EA1799 push ebx
00EA179A push esi
00EA179B push edi
00EA179C lea edi,[ebp-0Ch]
00EA179F mov ecx,3
00EA17A4 mov eax,0CCCCCCCCh
00EA17A9 rep stos dword ptr es:[edi]
00EA17AB mov ecx,0EAC008h
00EA17B0 call 00EA132F
00EA17B5 nop
int temp = *ptr1;
00EA17B6 mov eax,dword ptr [ebp+8]
00EA17B9 mov ecx,dword ptr [eax]
00EA17BB mov dword ptr [ebp-8],ecx
*ptr1 = *ptr2;
00EA17BE mov eax,dword ptr [ebp+8]
00EA17C1 mov ecx,dword ptr [ebp+0Ch]
00EA17C4 mov edx,dword ptr [ecx]
00EA17C6 mov dword ptr [eax],edx
*ptr2 = *ptr1;
00EA17C8 mov eax,dword ptr [ebp+0Ch]
00EA17CB mov ecx,dword ptr [ebp+8]
00EA17CE mov edx,dword ptr [ecx]
00EA17D0 mov dword ptr [eax],edx
}
00EA17D2 pop edi
00EA17D3 pop esi
00EA17D4 pop ebx
00EA17D5 add esp,0CCh
00EA17DB cmp ebp,esp
00EA17DD call 00EA124E
00EA17E2 mov esp,ebp
00EA17E4 pop ebp
00EA17E5 ret
////////////////////////////////////////////////////////////////////////////////////////////
int main(void)
{
00EA4720 push ebp
00EA4721 mov ebp,esp
00EA4723 sub esp,0D8h
00EA4729 push ebx
00EA472A push esi
00EA472B push edi
00EA472C lea edi,[ebp-18h]
00EA472F mov ecx,6
00EA4734 mov eax,0CCCCCCCCh
00EA4739 rep stos dword ptr es:[edi]
00EA473B mov eax,dword ptr ds:[00EAA040h]
00EA4740 xor eax,ebp
00EA4742 mov dword ptr [ebp-4],eax
00EA4745 mov ecx,0EAC008h
00EA474A call 00EA132F
00EA474F nop
int num1 = 10;
00EA4750 mov dword ptr [ebp-8],0Ah
int num2 = 20;
00EA4757 mov dword ptr [ebp-14h],14h
printf("num1 num2: %d %d\n", num1, num2);
00EA475E mov eax,dword ptr [ebp-14h]
00EA4761 push eax
00EA4762 mov ecx,dword ptr [ebp-8]
00EA4765 push ecx
00EA4766 push 0EA7B30h
00EA476B call 00EA10D2
00EA4770 add esp,0Ch
Swap(&num1, &num2); // num1과 num2에 저장된 값이 바뀌길 기대
00EA4773 lea eax,[ebp-14h]
00EA4776 push eax
00EA4777 lea ecx,[ebp-8]
00EA477A push ecx
00EA477B call 00EA1267
00EA4780 add esp,8
printf("num1 num2: %d %d\n", num1, num2);
00EA4783 mov eax,dword ptr [ebp-14h]
00EA4786 push eax
00EA4787 mov ecx,dword ptr [ebp-8]
00EA478A push ecx
00EA478B push 0EA7B30h
00EA4790 call 00EA10D2
00EA4795 add esp,0Ch
return 0;
00EA4798 xor eax,eax
}
00EA479A push edx
00EA479B mov ecx,ebp
00EA479D push eax
00EA479E lea edx,ds:[00EA47CCh]
00EA47A4 call 00EA11EA
00EA47A9 pop eax
00EA47AA pop edx
00EA47AB pop edi
00EA47AC pop esi
00EA47AD pop ebx
00EA47AE mov ecx,dword ptr [ebp-4]
00EA47B1 xor ecx,ebp
00EA47B3 call 00EA114F
00EA47B8 add esp,0D8h
00EA47BE cmp ebp,esp
00EA47C0 call 00EA124E
00EA47C5 mov esp,ebp
00EA47C7 pop ebp
00EA47C8 ret
#include <stdio.h>
void Swap(int* ptr1, int* ptr2)
{
00007FF65BEA17B0 mov qword ptr [rsp+10h],rdx
00007FF65BEA17B5 mov qword ptr [rsp+8],rcx
00007FF65BEA17BA push rbp
00007FF65BEA17BB push rdi
00007FF65BEA17BC sub rsp,108h
00007FF65BEA17C3 lea rbp,[rsp+20h]
00007FF65BEA17C8 lea rcx,[__59B62D33_CallByRefSwap@c (07FF65BEB2008h)]
00007FF65BEA17CF call __CheckForDebuggerJustMyCode (07FF65BEA1370h)
00007FF65BEA17D4 nop
int temp = *ptr1;
00007FF65BEA17D5 mov rax,qword ptr [ptr1]
00007FF65BEA17DC mov eax,dword ptr [rax]
00007FF65BEA17DE mov dword ptr [temp],eax
*ptr1 = *ptr2;
00007FF65BEA17E1 mov rax,qword ptr [ptr1]
00007FF65BEA17E8 mov rcx,qword ptr [ptr2]
00007FF65BEA17EF mov ecx,dword ptr [rcx]
00007FF65BEA17F1 mov dword ptr [rax],ecx
*ptr2 = *ptr1;
00007FF65BEA17F3 mov rax,qword ptr [ptr2]
00007FF65BEA17FA mov rcx,qword ptr [ptr1]
00007FF65BEA1801 mov ecx,dword ptr [rcx]
00007FF65BEA1803 mov dword ptr [rax],ecx
}
00007FF65BEA1805 lea rsp,[rbp+0E8h]
00007FF65BEA180C pop rdi
00007FF65BEA180D pop rbp
00007FF65BEA180E ret
////////////////////////////////////////////////////////////////////////////////////////////
int main(void)
{
00007FF65BEA1910 push rbp
00007FF65BEA1912 push rdi
00007FF65BEA1913 sub rsp,128h
00007FF65BEA191A lea rbp,[rsp+20h]
00007FF65BEA191F lea rdi,[rsp+20h]
00007FF65BEA1924 mov ecx,12h
00007FF65BEA1929 mov eax,0CCCCCCCCh
00007FF65BEA192E rep stos dword ptr [rdi]
00007FF65BEA1930 mov rax,qword ptr [__security_cookie (07FF65BEAD000h)]
00007FF65BEA1937 xor rax,rbp
00007FF65BEA193A mov qword ptr [rbp+0F8h],rax
00007FF65BEA1941 lea rcx,[__59B62D33_CallByRefSwap@c (07FF65BEB2008h)]
00007FF65BEA1948 call __CheckForDebuggerJustMyCode (07FF65BEA1370h)
00007FF65BEA194D nop
int num1 = 10;
00007FF65BEA194E mov dword ptr [num1],0Ah
int num2 = 20;
00007FF65BEA1955 mov dword ptr [num2],14h
printf("num1 num2: %d %d\n", num1, num2);
00007FF65BEA195C mov r8d,dword ptr [num2]
00007FF65BEA1960 mov edx,dword ptr [num1]
00007FF65BEA1963 lea rcx,[string "num1 num2: %d %d\n" (07FF65BEAACF0h)]
00007FF65BEA196A call printf (07FF65BEA119Ah)
00007FF65BEA196F nop
Swap(&num1, &num2); // num1과 num2에 저장된 값이 바뀌길 기대
00007FF65BEA1970 lea rdx,[num2]
00007FF65BEA1974 lea rcx,[num1]
00007FF65BEA1978 call Swap (07FF65BEA1186h)
00007FF65BEA197D nop
printf("num1 num2: %d %d\n", num1, num2);
00007FF65BEA197E mov r8d,dword ptr [num2]
00007FF65BEA1982 mov edx,dword ptr [num1]
00007FF65BEA1985 lea rcx,[string "num1 num2: %d %d\n" (07FF65BEAACF0h)]
00007FF65BEA198C call printf (07FF65BEA119Ah)
00007FF65BEA1991 nop
return 0;
00007FF65BEA1992 xor eax,eax
}
00007FF65BEA1994 mov edi,eax
00007FF65BEA1996 lea rcx,[rbp-20h]
00007FF65BEA199A lea rdx,[__xt_z+220h (07FF65BEAACC0h)]
00007FF65BEA19A1 call _RTC_CheckStackVars (07FF65BEA130Ch)
00007FF65BEA19A6 mov eax,edi
00007FF65BEA19A8 mov rcx,qword ptr [rbp+0F8h]
00007FF65BEA19AF xor rcx,rbp
00007FF65BEA19B2 call __security_check_cookie (07FF65BEA11B3h)
00007FF65BEA19B7 lea rsp,[rbp+108h]
00007FF65BEA19BE pop rdi
00007FF65BEA19BF pop rbp
00007FF65BEA19C0 ret
'IT공부 > IT서적' 카테고리의 다른 글
[윤성우 열혈 C프로그래밍] 디버깅 빌드, 어셈블리 코드 - Chapter16, Chapter17, Chapter18, Chapter19 (0) | 2025.01.29 |
---|---|
[뇌를 자극하는 윈도우즈 시스템 프로그래밍] 9장. 스케줄링 알고리즘과 우선순위 (0) | 2025.01.28 |
[뇌를 자극하는 윈도우즈 시스템 프로그래밍] 8장. 프로세스간 통신(IPC) - 2 (0) | 2025.01.21 |
[윤성우 열혈 C프로그래밍] 디버깅 빌드, 어셈블리 코드 - Chapter9 (0) | 2025.01.18 |
[윤성우 열혈 C프로그래밍] 디버깅 빌드, 어셈블리 코드 - Chapter8 (0) | 2025.01.16 |