Diva 풀이 12~13번 (Hardcoding issues Part 2, Input Validation Issues Part 3)

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();
        }
    }
}
  1. 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에서도 학인할 수 있는데, 내가 알아낸 절차는 다음과 같다.

  1. 패키지 pid 확인

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

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

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

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

여기서 나는 olsdfgad;lh가 가장 암호처럼 보여서 대입을 해보았다.

추가적으로 ghidra에서 Search 탭에서 For Strings 기능을 사용해서 아래처럼 확인도 가능하다

  1. 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 풀이 끝..! 예전에 풀고 정리했지만, 다시 포스팅하면서 복습하니까 또 새로웠던..