분석 환경
- 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))