분석 환경

  • MAC m1
  • Jadx

초기 코드 분석

com.ctf.projectapp.MainActivity 코드를 보면 onClick 함수를 호출하는 코드를 볼 수 있다.

@Override // androidx.fragment.app.FragmentActivity, androidx.activity.ComponentActivity, androidx.core.app.ComponentActivity, android.app.Activity  
    protected void onCreate(Bundle bundle) {  
        super.onCreate(bundle);  
        setContentView(R.layout.activity_main);  
        this.serialEditText = (EditText) findViewById(R.id.serialEditText);  
        ((Button) findViewById(R.id.checkButton)).setOnClickListener(new View.OnClickListener() { // from class: com.ctf.projectapp.MainActivity.1  
            @Override // android.view.View.OnClickListener  
            public void onClick(View view) {  
                MainActivity.this.checkSerial();  
            }  
        });  
    }

지금 코드에서 버튼을 누르면 checkSerial()가 실행하는 것을 볼 수 있다.

public void checkSerial() {  
        if (decodeSecret().equals(this.serialEditText.getText().toString())) {  
            showAlert("Correct!");  
        } else {  
            showAlert("Incorrect!");  
        }  
    }

위 코드를 봤을때 decodeSecret()이라는 함수에서 나온 결과 값과 입력창의 입력 값을 비교해서 같으면 Correct를 출력한다. 따라서 decodeSecret() 함수를 보면 flag를 알 수 있을 것 같다.

private String decodeSecret() {  
        try {  
            InputStream inputStreamOpenRawResource = getResources().openRawResource(R.raw.secret);  
            byte[] bArr = new byte[inputStreamOpenRawResource.available()];  
            inputStreamOpenRawResource.read(bArr);  
            inputStreamOpenRawResource.close();  
            return new String(Base64.decode(new String(bArr), 0));  
        } catch (IOException e) {  
            e.printStackTrace();  
            return "";  
        }  
    }

위 코드를 보면 R.raw.secret에 파일을 읽어서 문열로 저장하고 Base64로 해독하면 된다.

Resources > res > raw > secret.txt 파일을 보면 base64로 encode된 코드를 볼 수 있다.

해당 문자열을 python을 이용해서 base64로 decode를 하면 플래그를 취득할 수 있다.

import base64
s = "ZmxhZ3t0aGlzX2lzX3NlY3JldH0="
print(base64.b64decode(s))