Security Tech

OWASP - MASTG UnCrackable-LEVEL 3 (2)

작성자 - 5rocks_

1. verify method 분석

   - check.check_code에 어떤 값이 들어가는지 확인하는 함수

    public void verify(View view) {
        String obj = ((EditText) findViewById(owasp.mstg.uncrackable3.R.id.edit_text)).getText().toString();
        AlertDialog create = new AlertDialog.Builder(this).create();
        if (this.check.check_code(obj)) {
            create.setTitle("Success!");
            create.setMessage("This is the correct secret.");
        } else {
            create.setTitle("Nope...");
            create.setMessage("That's not it. Try again.");
        }
        create.setButton(-3, "OK", new DialogInterface.OnClickListener() { // from class: sg.vantagepoint.uncrackable3.MainActivity.3
            @Override // android.content.DialogInterface.OnClickListener
            public void onClick(DialogInterface dialogInterface, int i) {
                dialogInterface.dismiss();
            }
        });
        create.show();
    }

 

 

2. check_code 메서드 분석

- 사용자의 입력 값을 검증하는 부부은 native 함수로 되어 있기때문에 libfoo.so 파일을 분석 해야함을 확인

public class CodeCheck {
    private static final String TAG = "CodeCheck";

    private native boolean bar(byte[] bArr);

    public boolean check_code(String str) {
        return bar(str.getBytes());
    }
}

 

3. libfoo.so 파일 분석

   - IDA를 통해 CodeCheck_bar 함수 존재함을 확인 후 디컴파일하여 분석 시도

   - sub_10E0 함수 : secret string으로 해당 함수의 v8을통해 받아오는 것을 확인

   - (*((unsigned __int8 *)& qword_15038  + v7) ^ *((unsigned __int8 *)v8 + v7)) ) 해당 값들이 서로 xor 연산하는 것을 확인

3-1.  qword_15038 함수 분석

   -  qword_15038 함수 분석 --> MainActivity.init에서 실행함을 확인

   -  qword_15038 값: pizzapizzapizzapizzapizza

 

   - MainActivity에서 init 함수 호출 시 xorkey를 통해 연산 확인

 

3-2.  sub_10E0 함수 분석 

   - 해당 함수 깊은 분석 필요 - 수정필요

   - v8 값을 받아 특정 연산 진행

   - 해당 함수 연산이 끝난이후 xmmword_34 rdata 값에 해당 secret key로 추정되는 함수 확인

 

4. 풀이

- Frida를 통해 사용자 입력 검증에 사용되는 v8의 값을 출력

Java.perform(function () {
    var base = Module.findBaseAddress("libfoo.so");
    var addr = base.add(0x10e0);

    Interceptor.attach(addr, {
        onEnter: function (args) {
            this.key_ptr = args[0];
        },
        onLeave: function () {
            if (this.key_ptr && !this.key_ptr.isNull()) {
                var data = Memory.readByteArray(this.key_ptr, 24);
                console.log(hexdump(data, { length: 24 }));
            }
        }
    });
});

 

 

 

 

 

- 해당 값과 xorkey를 xor 연산 진행

(function () {
    var key = "pizzapizzapizzapizzapizz";
    var a1 = [
        0x1D, 0x08, 0x11, 0x13, 0x0F, 0x17, 0x49, 0x15,
        0x0D, 0x00, 0x03, 0x19, 0x5A, 0x1D, 0x13, 0x15,
        0x08, 0x0E, 0x5A, 0x00, 0x17, 0x08, 0x13, 0x14
    ];

    var result = "";
    for (var i = 0; i < 25; i++) {
        var c = key.charCodeAt(i % 24) ^ a1[i];
        result += String.fromCharCode(c);
    }

    console.log("solve:", result);
})();

 

   - p는 제외하고 답 입력

[SM G973N::PID::16413 ]-> solve: making owasp great againp

 

   - 풀이 완료

'Security Tech' 카테고리의 다른 글

웹 LLM 공격  (0) 2025.06.30
MITM RELAY 를 활용한 TCP 패킷 변조  (0) 2025.06.30
[Mobile] QuarkEngine 툴 소개 및 사용법  (0) 2025.05.31
함수 프롤로그/에필로그 분석  (0) 2025.05.31
스택 구조 그리기  (0) 2025.04.30
Contents

이 글이 도움이 되었다면, 응원의 댓글 부탁드립니다.