안드로이드/InsecureBank

[InsecureBank] #2 Application patching , Week Auth

ICEB34R 2020. 1. 8. 11:18

처음으로 해볼 것은 앱 패치입니다.

 

필요한 것은 apktool과 SignApk입니다. 

인터넷에 apktool과 SignApk설치 관련 자료가 많으니 생략하겠습니다.

./apktool d InsecureBankv2.apk

 

apktool경로에 InsecureBankv2.apk를 옮긴 뒤, 명령을 이용해서 앱을 디컴파일 해줍니다. 

 

그 뒤 /InsecureBankv2/res/values/strings.xml파일을 열어줍니다.

 

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="abc_action_bar_home_description">Navigate home</string>
    <string name="abc_action_bar_up_description">Navigate up</string>
    <string name="abc_action_menu_overflow_description">More options</string>
    <string name="abc_action_mode_done">Done</string>
    <string name="abc_activity_chooser_view_see_all">See all</string>
	... 중략
    <string name="hello_world">Hello world!</string>
    <string name="is_admin">no</string>
    <string name="loginscreen_password">Password:</string>
    <string name="loginscreen_username">Username:</string>
    <string name="pref_submit">Submit:</string>
    <string name="server_ip">Server IP:</string>
    <string name="server_port">Server Port:</string>

</resources>

strings.xml은 앱 내부에 들어가는 문자열들이 모여있는 파일입니다.

 

파일 내용을 잘 살펴보면, is_admin이라는 요소가 보입니다. no라고 지정이 되어있는데, 이 값을 통해서 어드민인지 아닌지 앱에서 판단하는 것 같아 보입니다.

 

실제로 저 부분이 어디서 쓰이는지 확인해보겠습니다.

 

우선 https://github.com/Konloch/bytecode-viewer/releases링크를 통해 Bytecode-Viewer.jar를 다운로드 받습니다.

 

가장위의 jar파일을 받아줍니다.

jar파일을 더블클릭 혹은 java -jar Bytecode-Viewer-[버전명].jar로 실행시켜줍니다. 

 

bytecode viewer실행화면

왼쪽 상단에 InsecureBankv2.apk를 드래그 드롭해줍니다. (파일이 로드되는데 시간이 조금 걸립니다.)

 

com.android.insecurebankv2.R$string.class를 클릭하여 열어줍니다.

 

방금 우리가 확인했던 is_admin이 보입니다. is_admin의 값은 2131165258이고, 앱 내부에서 is_admin을 사용할 때 2131165258를 이용하여 참조합니다. 따라서 왼쪽 하단의 search로 2131165258를 검색해봅시다.

 

2131165258검색 결과

검색결과가 하나가 나오는데 위치는 LoginActivity이고, onCreate메소드에서 참조됩니다. 

 

if문을 보게되면, is_admin에 해당하는 2131165258번 리소스를 가져와서, "no"인지 검사합니다. 

 

만약 "no"라면, 2131558510리소스에 setVisibility(8)을 해주는것을 알 수 있습니다.

 

0 is for VISIBLE
4 is for INVISIBLE 
8 is for GONE

이때 8은 GONE이므로  2131558510리소스를 없애버린다고 이해할 수 있습니다. 

 

 

com.android.insecurebankv2.R$id.class파일을 열어서 검색을 해보면 button_CreateUser라는 것을 알 수 있습니다. 

 

CreateUser버튼이 없는 모습

그렇다면 아마 is_admin의 값이 "no"만 아니면, CreateUser버튼이 활성화 된다 라고 생각해 볼 수 있겠습니다.

 

no 였던 값을 ICEBEAR로 변경

다시 apktool폴더로 돌아와서 /InsecureBankv2/res/values/strings.xml의 is_admin값을 임의로 바꿔 봅시다.

 

저장한 뒤 re compile 해줍니다.

 

./apktool b InsecureBankv2

 

작업이 완료되면, InsecureBank/dist/ 에 apk파일이 생성되는데, adb install을 통해 이 파일을 설치하려고 하면 에러가 발생합니다.

Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES: Failed to collect certificates from /data/app/vmdl883768825.tmp/base.apk: Attempt to get length of null array]

 

그 이유는 리컴파일 한 뒤, signing을 해주지 않았기 때문입니다. 

 

https://github.com/appium/sign

 

appium/sign

Sign.jar automatically signs an apk with the Android test certificate. - appium/sign

github.com

여기서 sign.jar를 받아준 뒤, 

java -jar sign.jar InsecureBankv2.apk

를 해주시면, sign이 완료되고 InsecureBankv2.s.apk가 생성됩니다.

 

sign과정에서 BASE64 관련 오류가 난다면 Java 8이하의 버전으로 실행하셔야합니다.

 

adb install InsecureBankv2.s.apk

adb를 통해 앱을 설치를 하게되면 정상적으로 설치가 됩니다.

 

Create User버튼이 활성화된 모습

예상대로 Create User버튼이 활성화 되었습니다.