본문 바로가기

Reversing/▷ Study

[CodeEngn] basic 20

advance 문제 다시풀어보기 전에 기초 다질겸 basic 20번 문제를 다시한번 풀어보았다.


메인 함수보면 CRACKME3.KEY 파일이 있는지 확인 후 있다면 파일 데이터가 0x12 byte 인지 확인한다. 

같은 디렉토리에 따로 18byte CRACKME3.KEY 파일을 만든다음 분석을 진행했다.


함수 두개만 중점적으로 보면 된다.


첫번째 함수이다. 대략 pseudo code로 나타내보면

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int file_data[18];
    int sum = 0;
    int bl = 0x41;
    for (int i = 0; ; i++)
    {
        file_data[i] ^= bl;
        bl++;
        sum += file_data[i];
        if (file_data[i] == 0)
            break;
        if (bl == 0x4f)
            break;
    }
    sum ^= 0x12345678;
    if (file_data[15~18== sum)
        Correct;
    else
        Incorrect;
cs

이런 느낌이다. (물론 C언어로 컴파일하면 에러난다 ㅎ.. 대략 느낌만 나타낸 코드다)

저렇게 합한 sum 값과 0x12345678 을 xor 한 후 input_data[15~18] 값과 비교한다.

이 해당 값이 맞으면 correct 문이 나온다 :)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
int main()
{
    int file_data[18= { 671111001016911010311033, }; // CodeEngn!
    int sum = 0;
    int bl = 0x41;
    for (int i = 0; ; i++)
    {
        file_data[i] ^= bl;
        printf("%x ", file_data[i]);    //02 2D 27 21 00 28 20 26 68 4A 4B 4C 4D 4E
        bl++;
        if (bl == 0x4f)
            break;
    }
    return 0;
}
cs

암호화 한 후 나온 값이 "CodeEngn!" 이 나올 수 있게 CRACKME3.KEY 값을 바꿔 준 후 실행시켰다.


(어라.. 뒤에 가 자동으로 붙네 ㅎㅎ..)



'Reversing > ▷ Study' 카테고리의 다른 글

angr 설치  (0) 2018.01.03
Retargetable Decompiler  (0) 2017.12.23
ELF Simple Anti Reverser  (0) 2017.06.22
프로그램 실행구조  (0) 2017.03.15
어셈블리와 C언어의 포인터 구문 형식  (0) 2017.03.08