2017. 12. 1. 06:00ㆍ0x02 Reverse Engineer/0x02. Reversing.kr
시작
오전 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 |