언팩완료. 클리어
내 수리능력이 참으로 원망스러웠던 문제..
고길님의 문서를 보고 마지막의 EAX와 EBX를 구해서 제일 처음의 EAX와 EBX로 만들고 언팩했다.
원본 파일에 트랩이 있어서 삽질을 조금. ..
오리지날 파일이 왜 제공됐는가 의문이었는데 원본 메모리를 뜯어보니 문서와 똑같이 따라하면 실패하도록 트랩이 설치되어있었다. -_-
goodluck ....
가장 처음의 EAX와 EBX를 구하는 소스코드
#include <stdio.h>
int main(void)
{
unsigned int prev = 0x726ee12b, ofst = 0x20c1085a, check = 0;
unsigned char bhChk=0;
unsigned int reEbx = 0x????????;
// 가장 마지막의 Ebx값을 reEbx에 넣어주면 된다. 이 값을 적고 프로그램을 돌리면 바로 답이 나오기에 이 값은 블라인드 처리..
_asm{
push ebx
push eax
push edx
push ecx
xor ecx,ecx
xor edx,edx
xor ebx,ebx
xor eax,eax
}
for(unsigned char i=0; i<=0xFF; i++){
_asm{
mov eax,ofst
mov cl, i
rol eax, cl
xor eax, prev
mov check, eax
mov ebx, check
mov bhChk, bh
mov eax, prev
mov cl, al
ror ebx, cl
mov check, ebx
}
if(bhChk == i)
{
printf("BH : %x, EBX : %x\n", i, check);
}
if(i == 0xFF){
break;
}
}
_asm{
}
for(unsigned int i=5; i<=0x1000; i++){
_asm{
mov ebx, reEbx
mov eax, prev
sub ebx, eax
mov cl, bh
rol eax, cl
xor eax, ebx
mov cl, al
ror ebx, cl
mov reEbx, ebx
mov prev, eax
}
}
_asm{
pop ebx
pop eax
pop edx
pop ecx
}
printf("prev EAX...EBX %x, %x\n", prev,reEbx);
return 0;
}