<대회땐 아무문제도못풀었는데 아이다를 써서 분석을하니까 보이더라구요.. 대회떈 사회공학
바이너리문제 한문제..
내 컴퓨터는 Vista 환경이라그런지 실행시키면 에러가뜨길래 관리자 권한으로 실행시켜주었습니다.
일단 기본적인것을 알아보기 위해 분석도구인PEID 로 보았습니다.
그래서 UPX를 언패킹해주었습니다.
하지만 실행해보면 언팩하기전과 언팩한후는 차이가있습니다.
라고 뜹니다.
이말은 곧 언팩을 하면 파일이 깨진다는것을 알수있습니다.
하지만 언팩을해야 분석을 할 수 있을것같으므로 언팩한파일을 분석해서 언팩을 안한파일에서 작동시키는 방법으로 해야겠습니다..
이제 OllyDBG로 분석하겠습니다는 아니고요 대회때 이랬다가 망한케이스..
뭐 정답같은 말은없었구요 그럼이제 본론으로가서.
이런 함수가 존재합니다. 근데 보면.. do~while문이 끝나주질않는 코드입니다 ;;;
코드들이 실행되게 해줘야합니다.
일단 저 함수 주소가 0041~ ##1D20## 으로 끝나주는걸 봐주신뒤 Ollydbg로 여십니다.
열렸습니다.
003D1D20 55 push ebp
003D1D21 8BEC mov ebp, esp
003D1D23 81EC D8000000 sub esp, 0D8
003D1D29 53 push ebx
003D1D2A 56 push esi
003D1D2B 57 push edi
003D1D2C 8DBD 28FFFFFF lea edi, dword ptr ss:[ebp-D8]
003D1D32 B9 36000000 mov ecx, 36
003D1D37 B8 CCCCCCCC mov eax, CCCCCCCC
003D1D3C F3:AB rep stos dword ptr es:[edi]
003D1D3E C745 EC 7800000>mov dword ptr ss:[ebp-14], 78
003D1D45 B8 01000000 mov eax, 1
003D1D4A 85C0 test eax, eax
003D1D4C 0F84 D8000000 je BluePC.003D1E2A
003D1D52 837D EC 78 cmp dword ptr ss:[ebp-14], 78
003D1D56 75 4E jnz short BluePC.003D1DA6
003D1D58 C645 FB 08 mov byte ptr ss:[ebp-5], 8
003D1D5C EB 08 jmp short BluePC.003D1D66
003D1D5E 8A45 FB mov al, byte ptr ss:[ebp-5]
003D1D61 04 01 add al, 1
003D1D63 8845 FB mov byte ptr ss:[ebp-5], al
003D1D66 0FBE45 FB movsx eax, byte ptr ss:[ebp-5]
003D1D6A 3D BE000000 cmp eax, 0BE
003D1D6F 7F 33 jg short BluePC.003D1DA4
003D1D71 0FBE45 FB movsx eax, byte ptr ss:[ebp-5]
003D1D75 8BF4 mov esi, esp
003D1D77 50 push eax
003D1D78 FF15 04A43D00 call near dword ptr ds:[3DA404] ; USER32.GetAsyncKeyState
003D1D7E 3BF4 cmp esi, esp
003D1D80 E8 01F4FFFF call BluePC.003D1186
003D1D85 0FBFC8 movsx ecx, ax
003D1D88 81F9 0180FFFF cmp ecx, FFFF8001
003D1D8E 75 12 jnz short BluePC.003D1DA2
003D1D90 68 C46A3D00 push BluePC.003D6AC4 ; ASCII "C:\Program Files\LOG.txt"
003D1D95 0FBE45 FB movsx eax, byte ptr ss:[ebp-5]
003D1D99 50 push eax
003D1D9A E8 3DF3FFFF call BluePC.003D10DC
003D1D9F 83C4 08 add esp, 8
003D1DA2 ^ EB BA jmp short BluePC.003D1D5E
003D1DA4 EB 7F jmp short BluePC.003D1E25
003D1DA6 837D EC 79 cmp dword ptr ss:[ebp-14], 79
003D1DAA 75 79 jnz short BluePC.003D1E25
003D1DAC E8 81F2FFFF call BluePC.003D1032
003D1DB1 68 68913D00 push BluePC.003D9168
003D1DB6 68 58953D00 push BluePC.003D9558
003D1DBB 68 08903D00 push BluePC.003D9008 ; ASCII "BLUEPC"
003D1DC0 E8 EAF2FFFF call BluePC.003D10AF
003D1DC5 83C4 0C add esp, 0C
003D1DC8 0FB605 6B913D00 movzx eax, byte ptr ds:[3D916B]
003D1DCF 8BF4 mov esi, esp
003D1DD1 50 push eax
003D1DD2 0FB60D 6A913D00 movzx ecx, byte ptr ds:[3D916A]
003D1DD9 51 push ecx
003D1DDA 0FB615 69913D00 movzx edx, byte ptr ds:[3D9169]
003D1DE1 52 push edx
003D1DE2 0FB605 68913D00 movzx eax, byte ptr ds:[3D9168]
003D1DE9 50 push eax
003D1DEA 68 B06A3D00 push BluePC.003D6AB0 ; ASCII "%02x%02x%02x%02x"
003D1DEF 68 18903D00 push BluePC.003D9018
003D1DF4 FF15 08A43D00 call near dword ptr ds:[3DA408] ; USER32.wsprintfA
003D1DFA 83C4 18 add esp, 18
003D1DFD 3BF4 cmp esi, esp
003D1DFF E8 82F3FFFF call BluePC.003D1186
003D1E04 8BF4 mov esi, esp
003D1E06 6A 00 push 0
003D1E08 68 A06A3D00 push BluePC.003D6AA0 ; ASCII "Turn it off"
003D1E0D 68 18903D00 push BluePC.003D9018
003D1E12 6A 00 push 0
003D1E14 FF15 0CA43D00 call near dword ptr ds:[3DA40C] ; USER32.MessageBoxA
003D1E1A 3BF4 cmp esi, esp
003D1E1C E8 65F3FFFF call BluePC.003D1186
003D1E21 33C0 xor eax, eax
003D1E23 EB 1E jmp short BluePC.003D1E43
003D1E25 ^ E9 1BFFFFFF jmp BluePC.003D1D45
003D1E2A 8BF4 mov esi, esp
003D1E2C 68 986A3D00 push BluePC.003D6A98 ; ASCII "PAUSE"
003D1E31 FF15 9CA33D00 call near dword ptr ds:[3DA39C] ; MSVCR100.system
003D1E37 83C4 04 add esp, 4
003D1E3A 3BF4 cmp esi, esp
003D1E3C E8 45F3FFFF call BluePC.003D1186
003D1E41 33C0 xor eax, eax
003D1E43 5F pop edi
003D1E44 5E pop esi
003D1E45 5B pop ebx
003D1E46 81C4 D8000000 add esp, 0D8
003D1E4C 3BEC cmp ebp, esp
003D1E4E E8 33F3FFFF call BluePC.003D1186
003D1E53 8BE5 mov esp, ebp
003D1E55 5D pop ebp
003D1E56 C3 retn
이것은 현재계속 실행되고있을 코드입니다.
반복문을 끝낼지 안끝낼지를 정하는 부분이기에 그러므로 003D1D6F 이것에 BP를 걸어줍니다.
그러면 바로 그 번지에걸리게됩니다.
이제 jg 이것을 무조건 190이넘은것처럼 속이기위해 jmp로 바꿔줍니다.
그럼 이렇게 보이게 되는데요. 우리가간곳은 "003D1DA4" 입니다.
##003D1DA6## ##003D1DAA## 가 더눈에 띕니다.
저것은 while ( v2 != 121); 이코드와 동일합니다.
변경하여보았습니다.
이제는 dowhile 연산이 깨졌을테니 F9(RUN)을 해보면..
P.S 제가 오랜만에써서 더 못썻었습니다. 이해가안가시면 댓글로 남겨주세요 금방 담변해드릴게요.. ㅜㅜ
댓글