[CodeEngn Basic 17]

2018. 2. 9. 03:080x02 Reverse Engineer/0x01. CodeEngn

728x90

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