12번 Hardcoding Issues Part 2
Source Code
package jakhar.aseem.diva;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
/* loaded from: classes.dex */
public class Hardcode2Activity extends AppCompatActivity {
private DivaJni djni;
/* JADX INFO: Access modifiers changed from: protected */
@Override // android.support.v7.app.AppCompatActivity, android.support.v4.app.FragmentActivity, android.support.v4.app.BaseFragmentActivityDonut, android.app.Activity
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_hardcode2);
this.djni = new DivaJni();
}
public void access(View view) {
EditText hckey = (EditText) findViewById(R.id.hc2Key);
if (this.djni.access(hckey.getText().toString()) != 0) {
Toast.makeText(this, "Access granted! See you on the other side :)", 0).show();
} else {
Toast.makeText(this, "Access denied! See you in hell :D", 0).show();
}
}
}
- DivaJni
package jakhar.aseem.diva;
/* loaded from: classes.dex */
public class DivaJni {
private static final String soName = "divajni";
public native int access(String str);
public native int initiateLaunchSequence(String str);
static {
System.loadLibrary(soName);
}
}
Solution
사실 이 문제를 풀면서 가장 시간을 많이 썼다..
우선 Hardcode2Activity의 access() 함수에서 호출한 access() 함수가 속해있는 DivaJni 클래스의 코드를 보면 divajni라는 라이브러리를 로드하는 걸 확인할 수 있었고, access() 함수는 native 코드(CPU와 운영체제(OS)가 직접 실행할 수 있는 코드)로 작성됨을 알 수 있다.
그리고 divajni와 관련된 라이브러리를 호출하는 걸 확인할 수 있는데 jadx에서도 lib 폴더에서 확인이 가능하다.
adb shell에서도 학인할 수 있는데, 내가 알아낸 절차는 다음과 같다.
- 패키지 pid 확인

- /proc/[pid]/maps에서 프로세스의 메모리를 확인 이때 “divajni”를 사용해서 관련 라이브러리만 출력 가능

- 확인한 /data/app/jakhar.aseem.diva-0eXPLLcp8P9D2vW1cV8srQ== 로 이동한 뒤 lib 경로로 이동하여 /data/app/jakhar.aseem.diva-0eXPLLcp8P9D2vW1cV8srQ==/lib/arm64 경로에서 libdivajni.so 파일 확인

- 해당 .so 파일을 jadx에서 확인하면,, 아래와 같기 때문에

stringsutil을 이용해 아래와 같이 확인할 수 있었다.

여기서 나는 olsdfgad;lh가 가장 암호처럼 보여서 대입을 해보았다.
추가적으로 ghidra에서 Search 탭에서 For Strings 기능을 사용해서 아래처럼 확인도 가능하다

- Access 성공!

13번 Input Validation Issues Part 3
Source Code
package jakhar.aseem.diva;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
/* loaded from: classes.dex */
public class InputValidation3Activity extends AppCompatActivity {
private DivaJni djni;
/* JADX INFO: Access modifiers changed from: protected */
@Override // android.support.v7.app.AppCompatActivity, android.support.v4.app.FragmentActivity, android.support.v4.app.BaseFragmentActivityDonut, android.app.Activity
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_input_validation3);
this.djni = new DivaJni();
}
public void push(View view) {
EditText cTxt = (EditText) findViewById(R.id.ivi3CodeText);
if (this.djni.initiateLaunchSequence(cTxt.getText().toString()) != 0) {
Toast.makeText(this, "Launching in T - 10 ...", 0).show();
} else {
Toast.makeText(this, "Access denied!", 0).show();
}
}
}
Solution
우선 hint를 보고 메모리 corruption 취약점이 있다는 것을 확인하고,, 오버플로우를 발생하기 위해 A값을 50개 삽입해보았다

이렇게 해서 버튼을 눌렀더니 메인화면으로 나가게 되었고,

logcat을 통해 확인해보니,, 세그먼트 폴트 에러가 발생한 걸 확인할 수 있다. 힌트에서 말해준대로, 익스플로잇이 가능한 환경인 것 같다.
12번에서는 access 함수를 사용했고, 13번에서는 initiateLaunchSequence이며 strcpy를 사용해서 실제 변수인 값과 비료를 해보는 것이라 생각하였다.

12번에서 확인했던 문자열들 중 대입을 했을때 .dotdot을 대입하였더니 아래와 같이 일치했을 때, 출력되는 메세지가 나오는 것을 확인했다.

이상 Diva 풀이 끝..! 예전에 풀고 정리했지만, 다시 포스팅하면서 복습하니까 또 새로웠던..
'Hacker > APP' 카테고리의 다른 글
| Diva 풀이 9~11번 (Access Control Issues - Part 1~3) (0) | 2024.09.16 |
|---|---|
| Diva 풀이 7~8번 (Input Validation Issues Part 1~2) (0) | 2024.09.15 |
| Insecurebankv2 - Insecure Content Provider access (취약한 컨텐트 프로바이더 접근) (0) | 2024.08.21 |
| drozer 환경 구축 (0) | 2024.08.20 |
| Insecurebankv2 - Local Encryption issues, Hardcoded secret, Weak Cryptography implementation (0) | 2024.08.12 |