PEpasswd

2017. 12. 1. 06:000x02 Reverse Engineer/0x02. Reversing.kr

728x90

시작

오전 1:02 2017-12-01

Packed.exe 실행 


오전 5:57 2017-12-01




시행착오 

0040902F    46              inc esi

00409030    803E 00         cmp byte ptr [esi],0x0

00409033   /74 24           je short Packed.00409059                 ; patch하면 eip 00000000 됨

00409035    56              push esi

00409036    FF95 9D294000   call near dword ptr [ebp+0x40299D]

0040903C    46              inc esi                                  ; dll체크

0040903D    803E 00         cmp byte ptr [esi],0x0

00409040  ^ 75 FA           jnz short Packed.0040903C

00409042    46              inc esi

00409043    803E 00         cmp byte ptr [esi],0x0                   ; dll체크 후 dll에 들어있는 함수 탐색

                           // esi레지스터는 dll 내부 함수을 불러오는 역할을 해주는 레지스터로 활용 됨

   // 해당 레지스터에 들어있는 하나의 함수를 배열로 생각하면 됨

   // 그렇다면, sangsu라는 함수가 있다면 inc esi로 

// sangsu -> angsu -> ngsu -> gsu.. -> \0 이런 로직임 



위의 짤막한 루틴에서 진행되는 놈들 

Kernel32.dll 내부

GetModuleHandleA

ExitProcess


USER32.dll 내부

MessageBoxA

GetMessageA

TranslateMessage

DispatchMessageA

CreateDialogIndirectParamA : 메모리에 있는 대화 상자 템플릿에서 모덜리스 대화 상자를 만든다

SendMessageA

EndDialog



GUI 프로그램은 사용자가 자원을 넣어주지 않으면 계속해서 실행되지 않는다.

무한루프 상태에 빠져있게 된다. 


GUI프로그램은 아무래도 피카츄배구 분석을 해본 뒤에 자신감이 붙은 것 같다. 


접근해본 단계 및 생각노트


1. Packed.exe는 실행하면 메시지박스만 하나 뜨면서 입력에 대한 검증을 하는 버튼도 존재하지 않는다.

2. 하지만, 폼으로 메시지박스를 만들어둔것은 절대 아닐 것이다.

3. 그렇다면 !! 입력한 값을 비교하는 루틴은 존재한다. 

4. 어떻게 그 비교루틴에 접근을 할 것인가. -> 피카츄배구 같은 경우 GetMenu를 이용하였다.

지금의 바이너리는 메시지박스 뿐이므로 USER32.dll에 있는 SendMessageA를 이용한다.

5. 패킹이 되어 있기 때문에 OEP도 찾지 못해서 SendMessageA를 찾을 수 없다고 판단.

(이유 : All intermoduler Call에 출력되지 않음)

6. Name in all module을 살펴보기로 함 

보통 import 되어있는 함수를 클릭하면 주소가 나오는데 주소가 나오지 않음.

7. 패킹이니까 런타임 환경으로 보면 언패킹 되지 않을까? 

(몇 주전 H4C해킹캠프에서 내가 만든 문제에 대한 조언으로 들었음)

이름을 언급하고 싶지만, 참겠음.


좀전에 언급했던 짤막한 루틴에서 bp를 적절히 걸어서 SendMessageA의 주소를 알아냄

ESI 레지스터를 참고하였을 때 4092C0에 SendMessageA가 있음.


역시 컴퓨터는 거짓말을 하지 않는 친구임

[004092C0]  53 65 6E 64 4D 65 73 73  SendMess

004092C8  61 67 65 41 00 45 6E 64  ageA.End



이쪽에서 아래와 같은 루틴을 발견함

004092C0    53              push ebx

004092C1    65:6E           outs dx,byte ptr es:[edi]                ; I/O command

004092C3    64:4D           dec ebp                                  ; Superfluous prefix

004092C5    65:73 73        jnb short Packed.0040933B                ; Superfluous prefix

004092C8    61              popad

004092C9    67:65:41        inc ecx                                  ; Superfluous prefix

004092CC    0045 6E         add byte ptr [ebp+0x6E],al

004092CF    64:44           inc esp                                  ; Superfluous prefix

004092D1    6961 6C 6F67000>imul esp,dword ptr [ecx+0x6C],0x676F

004092D8    00B0 50DF75B0   add byte ptr [eax+0xB075DF50],dh

004092DE    3C DF           cmp al,0xDF

004092E0    75 70           jnz short Packed.00409352


jnz 0x00409352가 궁금해졌음.

00409352    0000            add byte ptr [eax],al

00409354    0000            add byte ptr [eax],al

00409356    0000            add byte ptr [eax],al

00409358    0000            add byte ptr [eax],al

0040935A    0000            add byte ptr [eax],al

0040935C    0000            add byte ptr [eax],al

0040935E    0000            add byte ptr [eax],al

00409360    004B 45         add byte ptr [ebx+0x45],cl


복호화 되지 않아서 혹은 정리되지 않은 값이 노출되어 있음. 

popad가 있었다는 것은 레지스터를 쫙 묶어두었다가 다시 확 풀어헤쳤다는 것이기에 열심히 pushad를 찾아보기로 함

"단서는 가까이에 있다"


pushad를 찾았다.

--------------------------------------------------------

00409200    60              pushad

00409201    8BF8            mov edi,eax

00409203    8BF2            mov esi,edx

00409205    B8 48534148     mov eax,0x48415348

0040920A    3206            xor al,byte ptr [esi]

0040920C    E8 C9FFFFFF     call Packed.004091DA

00409211    8BD8            mov ebx,eax

00409213    3226            xor ah,byte ptr [esi]

00409215    E8 C0FFFFFF     call Packed.004091DA

--------------------------------------------------------


그럼 이제 새로운 시나리오를 진행할 수 있다.

나는 pushad에 Hardware BP를 걸어서 어떤 행위를 하는지 알아보고 싶어졌다.


Hardware BP를 걸어도 여전히 얄밉게 메시지박스만 출력되었다.


그렇다면, EIP를 조작해보기로 하였다.


409200에 접근하게 되니까 EAX값이 5DD5CE0F 이고 이 값을 mov 명령어를 통해 edi에 복사를 진행하는 것을 구경했다.


기가막히게도 00409203주소에 접근했을 때 Packed. <ModuleEntryPoint> 라는 출력문이 형성되었다.

엔트리포인트와 직접적인 연관이 있는 문구다. 왠지 잘 파악한듯하다. 

하지만, 아직은 모른다. 어떤 함정이 있을지 혹은 내가 완전히 잘못 접근했을지..


00409203    8BF2            mov esi,edx                              ; Packed.<ModuleEntryPoint>



0040920A    3206            xor al,byte ptr [esi]                    ; esi의 한 바이트를 48과 xor 하면 A0나옴


똑같은 주소를 두번 들어간다. 확인해봐야한다.

0040920C    E8 C9FFFFFF     call Packed.004091DA                     ; 똑같은 주소를 2번 들어간다면 꿍꿍이가 있는 것



004091DA    51              push ecx

004091DB    56              push esi

004091DC    52              push edx

-> 3개의 레지스터는 전부 주소 0x409000을 담고 있다.

왜 그럴까요??


004091E1    3226            xor ah,byte ptr [esi]

ah(0x53)과 [esi]을 xor 취하니 ah가 0xBB가 되었다. 


004091E3    32C2            xor al,dl

al = al ^ dl 

al = 0


EAX = 4841BBA0 


add eax, 0x434F4445 

EAX = 8B90FFE5 


..지금 내가 하고 있는 분석이 제대로 하고 있는지 아닌지는 모르겠다.

GOD 길을 틀어야 할 것 같다.


004091EC    D3C8            ror eax,cl

어제 본 명령어닷!! rol의 반대다.


004091EE    35 5A5AAA55     xor eax,0x55AA5A5A

결과 eax = 79F6DDA5


열심히 한 번 써본 INSTRUCTION들은 루프였다. 

EAX가 최종적으로 어떻게 변하는지 봐야겠다.

------------------------------------------------------------------------

004091E3    32C2            xor al,dl

004091E5    05 45444F43     add eax,0x434F4445

004091EA    8AC8            mov cl,al

004091EC    D3C8            ror eax,cl

004091EE    35 5A5AAA55     xor eax,0x55AA5A5A

004091F3    66:4A           dec dx

004091F5  ^ 75 EC           jnz short Packed.004091E3

-------------------------------------------------------------------------


강제 BP걸어서 탈출하면 

EAX는 CE023C5A 

BASE POINTER 0019FF94

STACK POINTER 0019FF50


근데 또 다시 CMP + JNZ 가 있네??

004091F7    803E 00         cmp byte ptr [esi],0x0

004091FA  ^ 75 E4           jnz short Packed.004091E0


POP EDX에 BP를 걸어보니 EAX는 986CF7FA가 된다.


004091FA  ^\75 E4           jnz short Packed.004091E0

004091FC    5A              pop edx                                  ; Packed.<ModuleEntryPoint>

004091FD    5E              pop esi

004091FE    59              pop ecx

004091FF    C3              retn




큰일이다..

00409215    E8 C0FFFFFF     call Packed.004091DA

0040921A    C1E9 02         shr ecx,0x2

0040921D    8BD1            mov edx,ecx

0040921F    3107            xor dword ptr [edi],eax

XOR 명령 수행 후 크래시가 터진다.


제대로 분석한 것이 아니었을까?

잠시 1분 간 멍..하다가

예~전에 악성코드 분석할 때 Executable modules로 확인했던 기억이 순간 떠올라서 직접 경로에 들어가보았다.


00401000      17            db 17

00401001      2E            db 2E                                    ;  CHAR '.'

00401002      E6            db E6

00401003      B6            db B6

00401004      05            db 05

00401005      7E            db 7E                                    ;  CHAR '~'

00401006      0C            db 0C

00401007      0D            db 0D

00401008      9E            db 9E

00401009      15            db 15

0040100A      C5            db C5

0040100B      99            db 99


역시 401000이 맞다.

그런데 영문을 알 수 없는 명령어들이 가득하다.


00401000    17              pop ss                                   ; Modification of segment register

00401001    2E:E6 B6        out 0xB6,al                              ; I/O command

00401004    05 7E0C0D9E     add eax,0x9E0D0C7E

00401009    15 C5999039     adc eax,0x399099C5

0040100E    93              xchg eax,ebx

0040100F    00F1            add cl,dh

00401011    08BE 5B4FA15C   or byte ptr [esi+0x5CA14F5B],bh

00401017    90              nop

00401018    4E              dec esi

00401019    F1              int1

0040101A    46              inc esi


Back to user를 사용해보자. 으음 409187에 아까전에 bp를 걸어두었었나본데 (의식의 흐름으로 문제를 푸는중..)

이 풀이는 실시간으로 적고있음을 알려드립니다.  오늘은 시간도 재보고 있기 때문에 ㅎㅎ 


알게 된 것! 메시지박스에 입력한 나의 값은 이 메모리 주소에 저장되고 있었다.

00409412  41 41 41 41 41 41 41 41  AAAAAAAA

0040941A  41 00 00 00 00 00 00 00  A.......


00409190    FF97 23294000   call near dword ptr [edi+0x402923]       ; user32.SendMessageA

여기 있넨 SendMessageA님 


뭔가 진도는 나가고 있지만, 내가 입력한 값이 바뀌는 부분은 아직 못찾은 상태


놀다보니 user32.dll에 접근해버렸다...


재시작. 바람좀쐬고오자..

오전 1:49 2017-12-01


오전 1:58 2017-12-01


AAAA를 넣고 다시 한번 도전. 

메시지박스에 넣은 값을 보기 위해 alt+m -> ctrl+b 이용 


AAAA는 여기에 들어있음

00409412  41 41 41 41                                      AAAA

Hardware BP걸어야 나중에 찾아갈 수 있음.


004091DF    4E              dec esi

004091E0    46              inc esi

004091E1    3226            xor ah,byte ptr [esi]

004091E3    32C2            xor al,dl

004091E5    05 45444F43     add eax,0x434F4445

004091EA    8AC8            mov cl,al

004091EC    D3C8            ror eax,cl

004091EE    35 5A5AAA55     xor eax,0x55AA5A5A

004091F3    66:4A           dec dx

004091F5  ^ 74 EC           je short Packed.004091E3                 ; patch

004091F7    803E 00         cmp byte ptr [esi],0x0

004091FA  ^ 74 E4           je short Packed.004091E0                 ; patch


메시지박스에 실수로 한글자 더 넣어 

AAAAa가 되어있다.


잘못 트레이싱 해서 다시 시도


0040919C    3D 2A848FE9     cmp eax,0xE98F842A                       ; eax에 저 값을 강제로 넣자

004091A1    B8 00000000     mov eax,0x0                              ; 아니지 바로 다시 0으로 바뀌지

004091A6    EB 11           jmp short Packed.004091B9                ; jmp로 패치

004091A8    FE87 3E2A4000   inc byte ptr [edi+0x402A3E]

004091AE    6A 00           push 0x0

004091B0    FF75 14         push dword ptr [ebp+0x14]

004091B3    FF97 27294000   call near dword ptr [edi+0x402927]

004091B9    5D              pop ebp

004091BA    5F              pop edi

004091BB    5E              pop esi

004091BC    5B              pop ebx

004091BD    C2 1000         retn 0x10


다시 AAAAAAAAAA


오옷...user32.dll로 가서 멍하게 있다가 f9로 run 해보았는데 아까전에 브레이크 걸어둔 pushad로 가면서 

pushad의 eax가 401000으로 바꼈다!!!! 뭔가 다시 진행이 되는 것 같다.


----------------------------------------------------------------------------------

00409200    60              pushad                                   ; 패킹에 자주 이용되는 opcode

00409201    8BF8            mov edi,eax

00409203    8BF2            mov esi,edx                              ; Packed.00409412

00409205    B8 48534148     mov eax,0x48415348

0040920A    3206            xor al,byte ptr [esi]                    ; esi의 한 바이트를 48과 xor 하면 A0나옴

0040920C    E8 C9FFFFFF     call Packed.004091DA                     ; 똑같은 주소를 2번 들어간다면 꿍꿍이가 있는 것

00409211    8BD8            mov ebx,eax

00409213    3226            xor ah,byte ptr [esi]

00409215    E8 C0FFFFFF     call Packed.004091DA

0040921A    C1E9 02         shr ecx,0x2

0040921D    8BD1            mov edx,ecx

0040921F    3107            xor dword ptr [edi],eax

00409221    8AC8            mov cl,al

00409223    83C7 04         add edi,0x4

00409226    D3C3            rol ebx,cl

00409228    33C3            xor eax,ebx

0040922A    8ACF            mov cl,bh

0040922C    D3C8            ror eax,cl

0040922E    03D8            add ebx,eax

00409230    4A              dec edx

00409231  ^ 75 EC           jnz short Packed.0040921F

00409233    61              popad

00409234    C3              retn

------------------------------------------------------------------------------------------------------

EAX를 계속 401000으로 유지해야할 것 같은 생각이 들어서  mov eax,0x48415348을 NOP처리해보았다.

00409200    60              pushad                                   ; 패킹에 자주 이용되는 opcode

00409201    8BF8            mov edi,eax

00409203    8BF2            mov esi,edx

00409205    90              nop

00409206    90              nop

00409207    90              nop

00409208    90              nop

00409209    90              nop


....

0040921A    C1E9 02         shr ecx,0x2

0040921D    8BD1            mov edx,ecx

0040921F    3107            xor dword ptr [edi],eax

00409221    8AC8            mov cl,al

00409223    83C7 04         add edi,0x4

00409226    D3C3            rol ebx,cl

00409228    33C3            xor eax,ebx


얘를 만나면 ADD EDI, 0x4 

EDI 가 401004가 된다.

아까전에 401000 401004 (4바이트 차이) 뭔가 있다. 


잠시 아무 파일 켜서 401000과 4010004에 무슨 값이 들어있는지 궁금해졌다.

여러개 비교해보자. 심심하기도하고 궁금하기도 하고 


ref :reversing.kr

1. Music_player 

401000 : 72A39386

401004 : 72A309F9 


2. Easy_Keygen

401000: 0130EC81

401004: 56550000


음 다 다르긴 한것을 발견했다.


다시 원래의 파일을 켜서 메시지 입력하기 전에 401000, 401004를 보자.


Packed.exe

401000 : B6E62E17

401004 : 0D0C7E05


메시지박스에서 PUSHAD 접근 시 401000, 401004 


INPUT : AAAA


401000 : B6E62E17

401004 : 0D0C7E05 

음.. 이로써 개념을 하나 또 제대로 알아간다.


oep의 헥사값은 바뀌지가 않는다는 것.


0040921F    3107            xor dword ptr [edi],eax

00409221    8AC8            mov cl,al

00409223    83C7 04         add edi,0x4

00409226    D3C3            rol ebx,cl

00409228    33C3            xor eax,ebx

0040922A    8ACF            mov cl,bh

0040922C    D3C8            ror eax,cl

0040922E    03D8            add ebx,eax

00409230    4A              dec edx

00409231  ^ 75 EC           jnz short Packed.0040921F

4바이트씩 401000~ 계속 증가하면서 연산을 취한다.

jnz가 있는데 위에 cmp가 없다.. 항상 옳다고 생각했던 개념이 깨지는순간이다...


jnz에 zero flag를 패치해보니 MessageBox -> HeapDestory etc 가 나오면서 크래시 빵~ 

잘못된 접근이라고 올리디버거가 소리치는 것 같다..... ㅠㅠ 


음 그런데.. 갑자기 오리지널 파일이 궁금해졌다. 

얘는 분명히 패킹된것이 아니니까 OEP의 값이 제대로 되어있을거 아니냐 

그럼 그 값을 패킹바이너리에 강제로 덮어버리면???? 오호 괜찮은 편법인 것같다.


요호 Original.exe

401000 : 014CEC81

401004 : 57560000


덤으로 기분좋으니 pe view 열어서 비교 


Packed.exe vs Original.exe


Packed.exe(.text section)

Virtual Size : 369E

RVA : 1000


Original.exe(.text section)

Virtual Size : 369E

RVA : 1000  으잉? 


당연한거네.. 401000이 OEP니까 


다른점 ! 

Original.exe 

Characteristics : 60000020

+ IMAGE_SCN_MEM_WRITE가 없음 


Packed.exe

Characteristics : E0000020

+ IMAGE_SCN_MEM_WRITE : 80000000


IMAGE_SCN_MEM_WRITE가 포함되어 OR연산을 했을 때 차이가 나는 것이다~

갓 구글링... 이렇게 또 하나 배우게 됩니다.


** Characteristics **

#define IMAGE_SCN_CNT_CODE 0x0000020 // Section contains code

#define IMAGE_SCN_INITIALIZED_DATA 0x00000040 // Section contains initialized data

#define IMAGE_SCN_UNINITIALIZED_DATA 0x00000080 // Section contains uninitialized data

#define IMAGE_SCN_MEM_EXECUTE 0x20000000 // Section is executable

#define IMAGE_SCN_MEM_READ 0x40000000 //  Section is Readable

#define IMAGE_SCN_MEM_WRITE 0x80000000 // Section is Writeable


aaaa


음 401000의 값을 강제로 바꾸게 되면 어떠한 일이 벌어지는지 궁금한데 해봐야겠다.


우선, 테스트를 하기전에 레지스터들을 백업해두자.

오 굿 아이디어 


현재 401000 : B6E62E17 어라.. 잠만 오리지널이 순수한놈이고 패킹이 안순수한 놈이면 대부분의 루틴에서 무엇인가조작할 때

XOR을 자주 이용하잖아??????? 그럼 B6E62E17 ^ 014CEC81 = B7AAC296

우선 키핑 . 


지금은 이것부터 궁금함

EAX  00401000

ECX  00004000

EDX  00409412

EBX   004092FD

ESP    0019FF60

EBP   000069D2

EDI   00401000

EIP   00409205


401000값을 B6E62EE8로 바꾸어버림 

INPUT c0nstant


여담.. ctrl+f2로 재시작할때마다 제로플래그 바꾸어주어야하는놈이 왜이리 많은지.. 그냥 패치해서 저장해버릴까


음.. 모든 레지스터에 아무일도 일어나지 않았다 그렇다면, 401000, 401004 음.. 근데 다른값들도 다 다른데

이 두놈 가지고되나??

몰라 일단 해보는거다 


Original.exe 's 401004 : 57560000

Pakced.exe's 4010004 : 0D0C7E05


XOR => 5A5A7E05


자 이렇게 한다음 레지스터를 살펴보도록하자. 

두근두근.. 저장

INPUT : c0nstant

이번엔 점프 분기도 모조리 패치 

목표는 PUSHAD까지 가는것 

오마이갓... 크래시


ㅠㅠ 도대체 언제 풀릴거니..


점프 패치 안한 바이너리로 가서 제로플래그를 수정해야겠다


음... 몇분 더 삽질하다가 덤프값을 바꾸는게 아니라.. 

EAX값을 가지고 놀아야 한다는것을 알게 됬다.

00409205    B8 48534148     mov eax,0x48415348

0040920A    3206            xor al,byte ptr [esi] // 얘


왠지 이놈인것같은데 그리고 아까전에 2번 호출했다던 004091DA


0040920C    E8 C9FFFFFF     call Packed2.004091DA

00409211    8BD8            mov ebx,eax

00409213    3226            xor ah,byte ptr [esi] // 얘

00409215    E8 C0FFFFFF     call Packed2.004091DA


AL과 AH로 총 2번 복호화한다. 

그 이후에 쉬프트연산 후 ECX값을 EDX로 옮기는 행위가 있는데 이건 분석해보니 그닥 중요한게 아님


***중요

0040921F    3107            xor dword ptr [edi],eax

[edi]에는 401000의 값이 들어 있다. 

edi = edi ^ eax라고 생각하면 

edi의 값이 401000 주소에 있으니까 이 값이 Original.exe로 바뀌면 된다.!! 


그럼 eax를 여기서 B7AAC296로 바꾼 뒤 Original.exe의 주소 401000 값 014CEC81 이게

나오면 게임 끝날 것 같다.


설렌다.

???? 00 00 00 00 ????? 


그럼..음.. mov eax, 0x48415348 저 부분에서 바꾸어 볼까?? 


824B02C2 ? ? ? ?  하 너무 어렵다


그냥 인라인어셈 배웠으니까 인라인어셈으로 짤까나


담배하나...핍시다 힘들다

오전 4:21 2017-12-01



오전 4:28 2017-12-01



0040921F    3107            xor dword ptr [edi],eax

00409221    8AC8            mov cl,al

00409223    83C7 04         add edi,0x4

00409226    D3C3            rol ebx,cl

00409228    33C3            xor eax,ebx

0040922A    8ACF            mov cl,bh

0040922C    D3C8            ror eax,cl

0040922E    03D8            add ebx,eax

00409230    4A              dec edx

00409231  ^ 75 EC           jnz short Packed2.0040921F


이 부분 어셈으로 짜보면? 


4일전인가 인라인어셈 삽질했는데 해두길 잘했다.

eax가 0xB7AAC296 (401000 XOR)

두번째 EAX가 5A5A7E05 (401004 XOR)


EDI가 처음에 0x401000 이 안의 값 014CEC81 -> int *EDI_val = 014CEC81  &EDI_VAL= 401000

EBX 처음에  0C90741B


EDI = EDI + 4 -> 즉 401004


EAX = EAX ^ EBX 

EBX = EBX + EAX



JNZ가 성립하지 않으려면 뭘 해야하지? 뭔지 모르겠지만 루프는 확실함 ! ! 그럼 무한루프 주지뭐 


#include <stdio.h>


int main(int argc, char*argv[])

{

int eax_val = 0xB7AAC296;

int next_eax_val = 0x5A5A7E05;

int i = 0;

int tmp = 0;

GO:

__asm {

// xor dword ptr [edi], eax는 없어도 될 것 같다. 바로 eax_val이용 

// label 부여 

mov eax, eax_val // eax_val값을 eax에 복사

mov cl, al

//add edi, 0x4 edi는 지금 안써도 된다

mov ebx, i // ebx값을 모른다고 가정 

rol ebx, cl

xor eax, ebx

mov cl, bh

ror eax, cl

//add ebx,eax // 이걸 넣어버리면 ebx가 변해버림 

//dec edx 얘도 지금 필요 없음

add i, 1 // i++

mov tmp, eax // tmp에 넣어둔 뒤 연산 해서 next_eax_val과 같아지는지 봐야함

mov edx, next_eax_val

cmp tmp, edx

jnz GO


};

printf("Clear!!\n");

printf("EBX = %x\n", i);

goto GO;

return 0;

}


Clear!!

EBX = a1beee23

Clear!!

EBX = c263a2cc

Clear!!

EBX = a1beee23

Clear!!

EBX = c263a2cc


똑같은 값이 두번 나오는거 보니 두개뿐이다.


EDI 401000일 때 B7AAC296 

두개 다 크래시 터져서 이상해서 재 검토 해봤는데 

+1 된 값이 들어가고 있었다. 코딩 실수 ...

아악... 루틴이 뭔가 이상했다. 


수정

#include <stdio.h>


int main(int argc, char*argv[])

{

int eax_val = 0xB7AAC296;

int next_eax_val = 0x5A5A7E05;

int i = 0;

int tmp = 0;

GO:

__asm {

// xor dword ptr [edi], eax는 없어도 될 것 같다. 바로 eax_val이용 

// label 부여 

mov eax, eax_val // eax_val값을 eax에 복사

mov cl, al

//add edi, 0x4 edi는 지금 안써도 된다

mov ebx, i // ebx값을 모른다고 가정 

rol ebx, cl

xor eax, ebx

mov cl, bh

ror eax, cl

//add ebx,eax // 이걸 넣어버리면 ebx가 변해버림 

//dec edx 얘도 지금 필요 없음


mov tmp, eax // tmp에 넣어둔 뒤 연산 해서 next_eax_val과 같아지는지 봐야함

mov edx, next_eax_val


add i, 1 // i++

cmp tmp, edx

jnz GO


};

printf("Clear!!\n");

printf("EBX = %x\n", i-1); // -1 해야했었따..

goto GO;

return 0;

}


Clear!!

EBX = a1beee22

Clear!!

EBX = c263a2cb


훗... EAX가 5A5A7E05가 나온다~~

근데 왜 ..크래시가..어째서 ㅠㅠ 왜 !!!!! 


잠 자고싶다..

X32DBG 써야지..

여기는 int3으로 접근이 된다..


오전 5:57 2017-12-01 사실상 끝난거 아닌가 ㅠㅠ 

뭐가 문제일까....... 

'0x02 Reverse Engineer > 0x02. Reversing.kr' 카테고리의 다른 글

Position  (0) 2018.01.05
CRC1  (0) 2018.01.05
RansomWare  (0) 2017.07.28
MusicPlayer  (0) 2017.07.28
EasyUnpackMe  (0) 2017.07.28