안드로이드 스튜디오(Android Studio)를 이용한 동적디버깅

1. 디버깅할 APP을 apktool로 디컴파일

2. 디컴파일한 폴더의 AndroidManifest.xml를 열고 <application> 태그 내에 android:debuggable="true" 옵션 추가 후 저장
ex) <application android:icon="@drawable/app_icon" android:debuggable="true" ...
** 일반적으로 앱스토어에서 다운받은 앱은 android:debuggalbe 속성이 존재하지 않거나 false로 처리되어있다.  
→ true인 경우, 앱스토어에 올릴 수 없음


3. 재컴파일 후 디바이스에 설치

4. 디버거 연결 대기 ON  :: 디바이스에서 설정 > 개발자 옵션 > USB 디버깅 ON > 디버깅할 앱 선택 > debuggable 옵션을 준 앱 선택 



6. 안드로이드 스튜디오에 설치한 뒤 재시작 :: File > Settings > Plugins > Install plugin from disk...


7. 안드로이드 스튜디오 실행 시 Open an existing Android Studio project를 클릭하여 디버깅할 앱의 smali 폴더를 지정하여 실행
* android studio를 켰을 때 좌측에 파일들이 보이지 않을 경우 상단의 Android라고 되어 있는 부분을 클릭하여 Project로 선택

8. Run > Edit Configurations > + > Remote 선택하여 나온 탭에서 Settings의 Port를 8700으로 변경 후 저장


9. [Help - Find Action] 클릭 후 monitor 검색 및 실행
* 만약 안켜질 경우 [SDK 설치 폴더 - tools - monitor.bat] 실행
ex) C:\Users\KJY\AppData\Local\Android\Sdk\tools 


10. 진단폰에서 디버깅할 APP 실행 시 디버거 대기 창이 뜨고 이 때 monitor에서 빨간색 디버깅모양이 뜨면 정상

11. 안드로이드 스튜디오 내에서 브레이크 포인트를 건 뒤 Shift+F9를 눌러 디버깅 



JEB2를 이용한 동적디버깅

    1. 위의 1~4과정 진행 혹은 dirtyC0w를 이용하여 디버깅 가능상태 만들기

    2. 디버깅할 앱의 패키지와 액티비티명 확인

    3. 현재 실행중인 애플리케이션 중에서 디버깅 플래그 값을 확일할 수 있게끔 명령어 실행

        adb shell am start -D -n [패키지 이름/액티비티]
                 
    -D : 디버깅 가능하도록 플래그 추가
                 -n : 네이티브 힙메모리 덤프



    4. JEB2에서 디버깅 시작 :: Debugger > Start (혹은 벌레모양 아이콘 클릭)


    5. 디버거에 디버깅할 앱 Attach
    ** 하단의 Suspend all threads 체크한다


    6. 필요한 곳에 break point를 설정하여 디버깅 진행 (Ctrl+b)


    아주 간단한 정규 표현식에 대해 정리한다...
    훨씬 더 많은 방법이 있지만 가장 보편적으로 쓰이는 것만!
    더 필요한게 있을 경우 추가할 예정임..

    \d
    숫자(0-9)
    .
    모든 char (숫자, 글자, 공백, 특수문자 등)
    \. , \?
    . (마침표),  ? (물음표)
    [abc]
    a,b,c
    [^abc]
    a,b,c 제외
    [A-C]
    A~C까지의 글자 검색
    \w
    알파벳 대소문자, 숫자(0-9), 공백 = [A-Za-z0-9_]
    a{3}
    aaa -> a 3번 반복
    a{1,3}
    a가 1번이상 3번 이하 반복
    \d*
    0개 이상의 숫자 (0 or more)
    \d+
    1개 이상의 숫자 (1 or more)
    ?
    선택적 포함
    \s
    빈칸( ), 탭(\t), 줄바꿈(\r), LF(\n)
    ^Mission$
    문장의 시작(^)과 끝($) 
    ()
    그룹 묶을때 -> 묶인 순서대로 그룹 형성
    |
    OR
    \D
    non-digits
    \S
    non-whitespace
    \W
    non-alphanumeric


    참고 URL


    DirtyC0w(더티카우) 취약점 (CVE-2016-5195)

    1. 개요
             1) DirtyC0w (더티카우) 취약점이란?
                : 2016년 10월 CVE-2016-5195 취약점
                : 루트 권한으로도 변경할 수 없었던 default.prop 파일을 익스플로잇을 통해 수정 가능하도록 하는 취약점
                : 디바이스를 재시작하는 경우, default.prop이 초기 설정으로 돌아가기 때문에 다시 수정해주어야함.

    1. 필요성
            1) 안드로이드 apk 파일 동적 디버깅 시, Manifest.xml 파일에 android:debuggable="true"라는 옵션이 있어야 디버깅이 가능하다.
                무결성 검증을 하는 앱의 경우, Manifest.xml 파일만 변경해도 무결성 탐지가 일어나므로 무결성 우회를 하지 않는 이상 디버깅이 불가능하다.
                따라서, 더티카우 취약점을 이용해 default.prop 파일 변경

            2) 매번 Manifest.xml파일을 변경하기 귀찮으므로 수월하게 default.prop 파일 변경


    1. 방법
            ** <안드로이드 애플리케이션 리버스 엔지니어링 - 남대현, 류재형 저>책에 나와 있는대로 시도해 보았지만 
    계속 에러가 나서 익스플로잇 코드로는 실행해보지 못함..ㅠㅠ
                 → 안드로이드 애플리케이션의 기본적인 점검 방법부터 약간의 후킹 방법까지 잘 나와있는 책이므로 추천

             그래서 인터넷 검색 도중 앱으로 쉽게 default.prop을 바꿀 수 있는 방법을 찾아냈당!! (그러면 결론적으로 dirtyC0w 익스플로잇을 한것과 동일해짐)



           

             1)  플레이스토어에서 Root Explorer를 다운받는다.
                 ** 유료 앱이므로 http://ko.apkhere.com/app/com.speedsoftware.rootexplorer 에서 apk를 다운받아 디바이스로 옮기는 것을 추천
                 ** 비슷하게 생긴 Explorer 앱이랑은 다른 기능을 가지고 있으므로 다운 시 유의! 



           2) 앱을 실행시킨 후 default.prop 파일의 ro.debuggable 속성 정보 확인

            → ro.debuggable의 속성값이 1이 되면 디버깅이 가능해짐
            → 처음에는 해당 파일의 권한이 644가 아니라 444로 설정되어있던것 것으로 기억하므로 3)번 과정을 수행해야 파일 수정이 가능할 것이다...
            


           3) 파일 권한 바꾸기 (최소 600)


           4) 이제 default.prop 파일 편집이 가능하다! 편집기로 텍스트를 열고 ro.debuggable=1로 변경하고 저장하면 끝!!!






    2020-01-30 수정

    해당 내용으로 인터넷 검색 도중 과거에 포스팅한 내용이 현재에는 실행이 불가능한 것을 알게되어 수정한다. 


    어느 중국인이 포스팅한 내용이다. 


    #0. mprop 파일 다운로드

    https://github.com/wpvsyou/mprop에 들어가 mprop 파일을 다운받는다. 


    이제 다운받은 mprop 파일을 디바이스에 삽입하고 실행 권한을 준뒤 실행시키면 익스플로잇 코드가 실행되면서 ro.debuggable이 0에서 1로 변경된다. 


    #1. 현재 설정값 확인

    일단 getprop ro.debuggable 명령어를 통해 현재 값을 확인한다.

       ※ 익스플로잇 전에는 설정값이 0임


    #2. mprop 파일 기기에 설치 후 권한 변경

    > adb push mprop /data/local/tmp     //mprop 파일 기기로 이동

    > adb shell    // adb 연결


    shell@b1:/$ su   // 루트 접근

    root@b1:/# chmod 777 /data/local/tmp/mprop     // mprop 권한 변경


    root@b1:/# cd /data/local/tmp              // 현재 위치 이동

    root@b1:/# ./mprop ro.debuggable 1     // mprop 실행


    mprop 실행 시 익스플로잇이 실행되면서 다음과 같은 결과를 출력하며 끝난다. 

    이 때, patched ~ 이부분이 뜨지 않는 경우 마지막 명령어를 다시한번 실행시켜준다.


    0001ffa0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

    0001ffb0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

    0001ffc0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

    0001ffd0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

    0001ffe0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

    0001fff0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

    patching it at:0xb6e81904[0xb6f388fc], value:[0x00000030 -> 0x00000031]

    patching it at:0xb6e81900[0xb6f388f8], value:[0x01000000 -> 0x01000000]

    patched, reread: [0xb6f388fc] => 0x00000031

    patched, reread: [0xb6f388f8] => 0x01000000


    #3. 변경된 설정값 확인

    이제 ro.debuggable 값이 1로 변경된 것을 확인할 수 있을 것이다!!

    하지만 이전에 설명한 root explorer로 default.prop 파일을 확인하면 값이 변하지 않았으므로 getprop ro.debuggable 명령어로 꼭 확인할것!!


    그리고 디바이스를 재실행하면 해당 값도 다시 0으로 초기화되므로 주의하자



    더 자세한 설명은 https://www.bodkin.ren/index.php/archives/533/ 참조.....(중국어임.....)


    + Recent posts