본문 바로가기

Reversing

Knight CTF 2022 Reversing Droid Flag Wrteup

반응형

Knight CTF 2022 Reversing Droid Flag Wrteup

https://github.com/sajjadium/ctf-archives/tree/main/KnightCTF/2022/rev/DroidFlag

문제파일은 위 링크에서 다운로드하였다. 

 

apk 파일 하나주고 푸는 문제인 것 같다. 먼저 jadx로 디컴파일 진행했고 안드로이드 앱답게 많은 파일이 존재했다.

필자는 먼저 MainActiviy를 찾았다.

 

 

 

MainActivity

package org.knightsquad.droidflag;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

/* loaded from: classes.dex */
public class MainActivity extends AppCompatActivity {
    private EditText inputFlagET;
    private TextView kctfTitle;
    private Button validateButton;

    /* JADX INFO: Access modifiers changed from: protected */
    @Override // androidx.appcompat.app.AppCompatActivity, androidx.fragment.app.FragmentActivity, androidx.activity.ComponentActivity, androidx.core.app.ComponentActivity, android.app.Activity
    public void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        setContentView(R.layout.activity_main);
        TextView textView = (TextView) findViewById(R.id.kctf2022Title);
        this.kctfTitle = textView;
        textView.setText("|| KnightCTF 2022 || Organized by Knight Squad ||");
        this.kctfTitle.setSelected(true);
        this.inputFlagET = (EditText) findViewById(R.id.inputFlag);
        Button button = (Button) findViewById(R.id.checkButton);
        this.validateButton = button;
        button.setOnClickListener(new View.OnClickListener() { // from class: org.knightsquad.droidflag.MainActivity.1
            @Override // android.view.View.OnClickListener
            public void onClick(View view) {
                String obj = MainActivity.this.inputFlagET.getText().toString();
                if (obj.isEmpty()) {
                    Toast.makeText(MainActivity.this, "Please enter a flag", 0).show();
                } else if (obj.length() <= 10) {
                    Toast.makeText(MainActivity.this, KnightCTF.flag, 0).show();
                } else {
                    StringHandler stringHandler = new StringHandler();
                    if ((stringHandler.getS1(MainActivity.this) + "{" + stringHandler.getS3(MainActivity.this) + "_" + stringHandler.getS2(MainActivity.this) + "_" + stringHandler.getS4(MainActivity.this) + "}").equals(obj)) {
                        AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this, R.style.AlertDialog);
                        builder.setTitle(MainActivity.this.getResources().getString(R.string.s9));
                        builder.setMessage(MainActivity.this.getResources().getString(R.string.s10));
                        builder.show();
                        return;
                    }
                    AlertDialog.Builder builder2 = new AlertDialog.Builder(MainActivity.this, R.style.AlertDialog);
                    builder2.setTitle(MainActivity.this.getResources().getString(R.string.s11));
                    builder2.setMessage(MainActivity.this.getResources().getString(R.string.s12));
                    builder2.show();
                }
            }
        });
    }
}

onClick(View view) 부분을 보면 아주 의심스러운 코드가 있다.

 

 

if ((stringHandler.getS1(MainActivity.this) + "{" + stringHandler.getS3(MainActivity.this) + "_" + stringHandler.getS2(MainActivity.this) + "_" + stringHandler.getS4(MainActivity.this) + "}").equals(obj)) {

보면 flag 형식과 비슷하다. 그래서 stringHandler 코드를 살펴봤다.

 

 

StringHandler Class

package org.knightsquad.droidflag;

import android.content.Context;
import androidx.appcompat.app.AppCompatActivity;

/* loaded from: classes.dex */
public class StringHandler extends AppCompatActivity {
    public String getS1(Context context) {
        return context.getResources().getString(R.string.s5);
    }

    public String getS2(Context context) {
        return new StringBuilder(context.getResources().getString(R.string.s6)).reverse().toString();
    }

    public String getS3(Context context) {
        return new StringBuilder(context.getResources().getString(R.string.s7)).reverse().toString();
    }

    public String getS4(Context context) {
        return new StringBuilder(context.getResources().getString(R.string.s8)).reverse().toString();
    }
}

코드를 보면 getString을 통해 string 변수를 가져오고 있었다. 순서를 보면 getS1{getS3_getS2_getS4}로 불러온다.

 

 

s5, s6, s7, s8 변수를 가져와서 reverse하고 string으로 바꾼다. 이 과정을 다시 진행하면 되는데 먼저 resource에 저장된 string이 있는지 확인했다.

 

검색을 통해 resources.arsc -> res -> values -> strings.xml 에 string들이 모여있음을 알았다. 우리가 찾던 변수들이 잘 있었다. 

 

순서대로 맞추면 flag는 다음과 같다.

KCTF{D10RdNa_3LpM1s_3Sr3V3r}

 

728x90

'Reversing' 카테고리의 다른 글

b01lers CTF padlock Writeup  (0) 2023.03.20
KnightCTF 2023 Rev - Help Jimmy Writeup  (0) 2023.01.27
KnightCTF 2022 Baby Shark writeup  (0) 2023.01.19
irisCTF 2023 baby reversing writeup  (0) 2023.01.11
NahamCon CTF 2022 babyrev writeup  (0) 2022.11.15