2018. 2. 9. 03:08ㆍ0x02 Reverse Engineer/0x01. CodeEngn
1) 출제 의도는 이름이 한 자리인데 지금 0X3을 비교하고 있어서 0X1로 패치를 하였다.
2) A일 때 FFE3-2C73-0502A34C-8A48A32-E1CBC640 면 FFE3을 찾는 부분을 잘 보도록 하자.
3) 0045B9D0 |. E8 3793FAFF call patch_st.00404D0C <- 이 부분을 살펴보자.
모든 시리얼 값이 위에 적어 둔 함수에서 결정 된다. 그렇다면 미리 어딘가에서 세팅을 할 것인데 분석하면서 유독 루프가 많은 곳 여러개가 있었다. 그 중 제일 첫번째 루프에서 BP를 걸고 살펴보면 FFE3이 어떻게 떴는지 알 수 있을 것이다.
4) 파악 했다면 C언어로 짜자.
#include <stdio.h>
/*
char ch = 'A';
char ch2 = 'a';
for (int i = 0; i < 10; i++)
{
printf("\'%d\',", i);
}
for (int i = 0; ; i++)
{
printf("\'%c\',", ch);
ch++;
if (ch == 'Z') {
printf("\'%c\',", ch2);
break;
}
}
for (int i = 0; ; i++)
{
printf("\'%c\',", ch2);
ch2++;
if (ch2 == 'z') {
printf("\'%c\'", ch2);
break;
}
}
*/
int main(int argc, char*argv[])
{
char target = '\0';
char brute[] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','a','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z' };
unsigned int esi = 0;
unsigned int edx = 0;
for (int i = 0; i < 62; i++)
{
target = brute[i];
esi = target;
esi *= 0x772;
edx = esi;
edx = edx * esi;
esi = esi + edx;
esi = esi | esi;
esi = esi * 0x474;
esi = esi + esi;
edx = esi;
edx /= 65535;
edx -= 1;
if (edx == 0xBEDA)
{
printf("%c\n", target);
break;
}
}
}
'0x02 Reverse Engineer > 0x01. CodeEngn' 카테고리의 다른 글
[CodeEngn Basic Final] (0) | 2019.01.31 |
---|---|
[CodeEngn basic 18] (0) | 2018.02.09 |
[CodeEngn Basic 16] (0) | 2018.02.09 |
Basic 15번. (0) | 2018.02.09 |
[CodeEngn Basic 15] obj. KNOW BOLRAND & Routine (0) | 2017.08.23 |