7/26일 두번째로 발표한 주제입니다 발표자료 : Upload:CrackingProgram.ppt == 간단한 프로그램 == {{{~cpp #include using namespace std; int add(int a, int b); int main() { int a, b, c; a = 1; b = 2; c = add(a, b); return 0; } int add(int a, int b) { int c; c = a + b; return c; } }}} {{{~cpp 1: #include 2: using namespace std; 3: 4: int add(int a, int b); 5: 6: int main() 7: { 00401030 push ebp 00401031 mov ebp,esp 00401033 sub esp,4Ch 00401036 push ebx 00401037 push esi 00401038 push edi 00401039 lea edi,[ebp-4Ch] 0040103C mov ecx,13h 00401041 mov eax,0CCCCCCCCh 00401046 rep stos dword ptr [edi] 8: int a, b, c; 9: a = 1; 00401048 mov dword ptr [ebp-4],1 10: b = 2; 0040104F mov dword ptr [ebp-8],2 11: c = add(a, b); 00401056 mov eax,dword ptr [ebp-8] 00401059 push eax 0040105A mov ecx,dword ptr [ebp-4] 0040105D push ecx 0040105E call @ILT+0(add) (00401005) 00401063 add esp,8 00401066 mov dword ptr [ebp-0Ch],eax 12: 13: return 0; 00401069 xor eax,eax 14: } 0040106B pop edi 0040106C pop esi 0040106D pop ebx 0040106E add esp,4Ch 00401071 cmp ebp,esp 00401073 call __chkesp (004081a0) 00401078 mov esp,ebp 0040107A pop ebp 0040107B ret ---------------------------------------------------------------------------------- 15: 16: int add(int a, int b) 17: { 00401090 push ebp 00401091 mov ebp,esp 00401093 sub esp,44h 00401096 push ebx 00401097 push esi 00401098 push edi 00401099 lea edi,[ebp-44h] 0040109C mov ecx,11h 004010A1 mov eax,0CCCCCCCCh 004010A6 rep stos dword ptr [edi] 18: int c; 19: c = a + b; 004010A8 mov eax,dword ptr [ebp+8] 004010AB add eax,dword ptr [ebp+0Ch] 004010AE mov dword ptr [ebp-4],eax 20: return c; 004010B1 mov eax,dword ptr [ebp-4] 21: } 004010B4 pop edi 004010B5 pop esi 004010B6 pop ebx 004010B7 mov esp,ebp 004010B9 pop ebp 004010BA ret }}} == 간단한 암호입력 프로그램 == {{{~cpp #include using namespace std; void main() { char pass[8]; cout << "input password : "; cin >> pass; if (!strcmp(pass, "12345")) cout << "correct passwd" << endl; else cout << "wrong passwd" << endl; } }}} {{{~cpp 1: #include 2: using namespace std; 3: 4: void main() 5: { 00401340 push ebp 00401341 mov ebp,esp 00401343 sub esp,48h 00401346 push ebx 00401347 push esi 00401348 push edi 00401349 lea edi,[ebp-48h] 0040134C mov ecx,12h 00401351 mov eax,0CCCCCCCCh 00401356 rep stos dword ptr [edi] 6: char pass[8]; 7: cout << "input password : "; 00401358 push offset string "input password : " (0046c048) 0040135D push offset std::cout (00479e88) 00401362 call @ILT+370(std::operator<<) (00401177) 00401367 add esp,8 8: cin >> pass; 0040136A lea eax,[ebp-8] 0040136D push eax 0040136E push offset std::cin (00479f18) 00401373 call @ILT+55(std::operator>>) (0040103c) 00401378 add esp,8 9: if (!strcmp(pass, "12345")) 0040137B push offset string "12345" (0046c040) 00401380 lea ecx,[ebp-8] 00401383 push ecx 00401384 call strcmp (0041f9e0) 00401389 add esp,8 0040138C test eax,eax 0040138E jne main+70h (004013b0) 10: cout << "correct passwd" << endl; 00401390 push offset @ILT+120(std::endl) (0040107d) 00401395 push offset string "correct passwd" (0046c02c) 0040139A push offset std::cout (00479e88) 0040139F call @ILT+370(std::operator<<) (00401177) 004013A4 add esp,8 004013A7 mov ecx,eax 004013A9 call @ILT+295(std::basic_ostream >::operator<<) (0040112c) 11: else 004013AE jmp main+8Eh (004013ce) 12: cout << "wrong passwd" << endl; 004013B0 push offset @ILT+120(std::endl) (0040107d) 004013B5 push offset string "wrong passwd" (0046c01c) 004013BA push offset std::cout (00479e88) 004013BF call @ILT+370(std::operator<<) (00401177) 004013C4 add esp,8 004013C7 mov ecx,eax 004013C9 call @ILT+295(std::basic_ostream >::operator<<) (0040112c) 13: } 004013CE pop edi 004013CF pop esi 004013D0 pop ebx 004013D1 add esp,48h 004013D4 cmp ebp,esp 004013D6 call __chkesp (0041fa70) 004013DB mov esp,ebp 004013DD pop ebp 004013DE ret }}} == 관련링크 == [http://home.t-online.de/home/Ollydbg/ Ollydbg] [http://family.sogang.ac.kr/~gundal79/ codeDiver] ---- [세미나/2004]