파일을 다운받아보면 Unregister이라는 폴더에 "Project1" 이라는 프로그램이 있다.

실행시키면 이전에 봤던 문제와 같은 느낌으로 Register KEY를 찾으라고 나온다.

디버거를 열어서 string을 보니까 "Authkey:", "Congratulation!"이라는 문자열이 보여서 해당 위치로 이동해서 확인해 보았다.

"Congratulation!"이 나오는 위쪽 함수의 시작 부분부터 내려오다보니 빈 주소를 EAX, 특정 값을 EDX에 넣은 후 404260 함수를 반복적으로 호출하고 있었다.

해당 부분 실행이 끝난 후 비어있던 EBX+310 부분을 확인하니까 각각 "2V" "B6" "H1" "XS" "0F"를 가르키고 있는 주소의 값으로 채워져 있고 마지막에(EBX+330) 다 합쳐진 "2VB6H1XS0F" 문자열을 가르키는 주소가 저장된다.

그 다음에는 EBP-4의 주소와 EBX+2F4의 값을 가져와서 42F4BC 함수를 실행하는데 이 부분이 끝나고 나면 EBP-4 부분에 내가 입력한 값(여기서 "111111")이 들어가 있다.

다음으로 입력값이 들어가 있는 EBP-4와 "2VB6H1XS0F"이 들어있는 EBX+330을 가져와서 함수를 실행 후 점프문을 수행하는데 아마 그대로 비교하는 함수로 생각되어 입력 폼에 "2VB6H1XS0F"를 입력하니까 AuthKey를 알 수 있었다.

 

함수를 하나하나 분석할 수도 있었지만 큰 흐름만 봐도 프로그램의 동작을 알 수 있었기 때문에 함수가 실행되기 전 후의 차이를 중점적으로 비교하며 분석했다.

 

'forensic > suninatas.com' 카테고리의 다른 글

[suninatas] Level 12  (0) 2021.10.04
[suninatas] Level 10  (0) 2021.10.04
[suninatas] Level 9  (0) 2021.09.10
[suninatas] Level 8  (0) 2021.09.06
[suninatas] Level 7  (0) 2021.09.06

 

"reversing.exe" 파일을 다운받고 ollydbg로 열어보려고 하니까 오류가 생기면서 열리지 않았다.

그냥 실행을 해보면 입력 폼과 OK 버튼이 있는 프로그램이 실행된다.

 

PEID로 확인해보니 C#으로 만들어진 프로그램이라 ollydbg로 실행이 되지 않은 듯 했다.

C# 프로그램을 리버싱해주는 .NET Reflector를 통해 확인해 보자.

먼저 Main을 보면 Form1이 실행되고 있다.

public class Form1 : Form
{
    // Fields
    private IContainer components;
    private TextBox textBox1;
    private Button button1;
    private Label label2;
    private Button button2;

    // Methods
    public Form1();
    private void button1_Click(object sender, EventArgs e);
    private void button2_Click(object sender, EventArgs e);
    protected override void Dispose(bool disposing);
    private void InitializeComponent();
    private void label2_Click(object sender, EventArgs e);
}

Form1에는 Button이 두 개 있는데 코드를 보면 button1이 "OK" 버튼인 것을 알 수 있다.

private void button1_Click(object sender, EventArgs e)
{
    string str = "2theT@P";
    string text = "Authkey : Did U use the Peid?";
    if (this.textBox1.Text == str)
    {
        MessageBox.Show(text, "SuNiNaTaS");
        this.textBox1.Text = "";
    }
    else
    {
        MessageBox.Show("Try again!", "SuNiNaTaS");
        this.textBox1.Text = "";
    }
}

button1 코드를 보면 바로 Authkey를 확인할 수 있다. 입력 폼에 "2theT@P"를 넣어서도 Authkey가 나온다.

그냥 Peid를 사용할 줄 아는지 확인하는 문제였나보다.

'forensic > suninatas.com' 카테고리의 다른 글

[suninatas] Level 12  (0) 2021.10.04
[suninatas] Level 11  (0) 2021.10.04
[suninatas] Level 9  (0) 2021.09.10
[suninatas] Level 8  (0) 2021.09.06
[suninatas] Level 7  (0) 2021.09.06

파일을 다운받은 후 ollydgb로 열어서 "all referenced text string"를 통해 문자열을 확인해보니까 Congratulation! 이라는 문자열을 볼 수 있었다. 

해당 문자열이 존재하는 위치로 이동하여 코드를 살펴보았다.

(사실 여기서 913465라는 문자열을 보고 바로 입력해봤는데 통과할 수 있었다ㅎㅎ)

첫 번째 함수를 call 하는 부분에 break point를 걸고 입력 폼에 "1111"을 입력 후 실행시켜보자.

한 줄 씩 실행시켜보면서 확인해보니까 우리의 입력 값이 사용되는 부분은 마지막 함수였다.

EAX와 EDX에 각각 입력값과 "913465"를 넣고 404608함수를 호출한다. 404608함수를 확인하면 다음과 같다.

ESI: input address, EDI: "913465" address

ESI-4와 EDI-4에 접근하는데 이 위치에는 해당 문자열의 길이가 저장되어 있는 듯 하다. 이전 함수에서 길이를 저장해놓은 것 같다.

그 후 EAX에서 EDX를 빼서 EAX에 넣는다. JA는 플래그 중 C와 ZR이 0일 때 점프한다. 즉, EAX가 EDX보다 클 때 점프하게 된다. 이 과정은 두 문자열 중 길이가 작은 문자열의 길이를 EDX에 넣는 과정으로 보인다.

그 다음 점프문은 JE인데 점프를 하기 위해서는 ZF가 1 즉, SHR EDX, 2의 결과가 0이 되어야 하기 때문에 길이가 4 미만일때만 점프를 하게 된다. 입력 문자열이 3 이하일 때를 먼저 확인해보자.

cmp cl, bl을 통해 첫번째 자리 문자가 같은지를 확인하고 같지 않다면 4046A6으로 점프해서 바로 리턴하므로 ZF가 0이기 때문에 Congraturation!을 통과할 수 없다.

끝 문자가 같다면 EDX(입력 값의 문자열 길이)에서 1을 빼고 je를 한다. 이 때 문자의 길이가 1이라면 je를 통해 리턴되는 부분으로 넘어가고 이와 같은 부분이 40466c 부분에도 있으므로 문자의 길이가 3이 되어야 이 부분을 통과할 수 있다.

그 후 cmp ch, bh로 두번째 자리 문자까지 같은지 확인해준다. 이번 경우에도 같아야 통과할 수 있다.

 

그 다음에도 and 연산을 통해 세 번째 자리 문자도 같은지 확인해주는데 결국 바로 return으로 점프하기 때문에 Congraturation!은 통과할 수 없게 된다..ㅎ 입력 값의 길이가 3보다 작을 때에도 문자를 비교하기는 하지만 결국은 통과할 수 없게 되는 것이다. 이제 길이가 4 이상일 때를 확인해보자.

 

앞에서부터 문자 네개를 가지고와서 같은지 확인한 뒤 다르면 404691로 점프한다.

404691에서도 한 글자씩 비교를 하다가 return을 하게 되는데 결국 여기도 4글자가 다 같아야지만 Congraturation을 통과하도록 해두었다. 즉, 일단 첫 네글자는 "9134"를 충족해야 한다.

첫 네 글자가 같다면 edx에서 1을 뺀 값이 0일 때 404651로 점프하게 된다. edx는 두 문자열 중 작은 값이 들어 있는 것에서 shr 2를 했으니 길이가 4, 5, 6일 때 넘어가게 된다(기존에 있는 문자열이 "913465"로 여섯글자 이므로 그 이상의 숫자가 edx에 들어갈 수 없다.)

esi와 edi가 가르키는 곳을 각 문자열의 다섯번째 문자로 변경한 뒤 and edx, 3이 0이면 40467f로 점프하게 된다. 즉 길이가 4일 경우에 점프하는데 40467f로 가면 이번에도 그냥 return하게 된다.

그 뒤로는 이전에 살펴봤던 것 처럼 한글자씩 비교한다. 이 때 한글자라도 다르다면 바로 return 부분으로 점프해버리니까 전부 같아야 하고 주어진 문자열에서 비교하는 부분이 "65"니까 우리가 넣은 문자열도 7글자면 안되고 6글자로 맞춰서 "65"를 가르키게 해야한다.

그 다음에는 add eax, eax를 한 뒤 return을 하는데 이 때에는 이전에 입력 문자열의 길이가 6이 아닐때와 다르게 eax가 0으로 세팅되어 있는 상태이기 때문에 ZF가 1인 상태로 넘어가게 되고 Congraturation!이 나오게 되는 것이다.

 

하나하나 해석하다 보면 꽤나 오래 걸리지만 역시 리버싱은 일단 떄려 맞추는게 제일 빠르게 풀 수 있는 것 같다ㅎㅎ 그래서 답은 "913465"가 된다!

'forensic > suninatas.com' 카테고리의 다른 글

[suninatas] Level 11  (0) 2021.10.04
[suninatas] Level 10  (0) 2021.10.04
[suninatas] Level 8  (0) 2021.09.06
[suninatas] Level 7  (0) 2021.09.06
[suninatas] Level 6  (0) 2021.09.06

+ Recent posts