반응형


문제에 접근하면 이렇게 버튼이 2개가 존재한다.

Join을 누르면 Access_Denied 라는 메시지와 함께 아무런 동작을 하지 않는다.

Login 버튼을 누르면 mem/login.php에 접근을 한다.

그리고 로그인창이 뜨는데 여기에 test / test로 로그인을 시도하였다.



그 결과 위와 같이 admin이 아닌 id라며 Access Denied가 출력된다.


문제는 admin으로 회원가입을 하면 될 것으로 보인다.

게싱을 하여 mem/join.php에 접근을 시도해보았다.


접근은 되는데 검은 화면 뿐이다.

소스코드를 보면 아래와 같은 자바스크립트가 존재하는 것을 볼 수 있다.



보기가 어려워 JSbeautifier에 넣었다.


그 결과 변수에 값을 넣고 그 값으로 JS를 만든 것이다.

조건이 2가지가 있는데 첫번째는 document.cookie 내에 oldzombie가 존재하는가를 확인한다.


이를 위해 chrome의 EditThisCookie 라는 확장 프로그램을 이용하여 test라는 cookie를 만들고 그 안에 oldzombie를 넣어주었다.


그리고 다시 join.php에 접근하면 또 다시 access_denied가 뜬다.

여기서 두번쨰 조건인 document.URL에 mode=1이라는 문자열이 있는지를 확인하는 조건을 만족시켜주기 위해 http://webhacking.kr/challenge/web/web-05/mem/join.php?mode=1로 접근하였다.


그 결과 아래와 같이 회원가입하는 창이 떴다.


여기서 admin으로 가입하면 되는 것으로 보인다.

처음에는 소문자, 대문자 비교를 하지 않는 것으로 푸는것으로 생각하였는데 생각해보니 mysql은 소문자, 대문자 비교를 하지 않기 떄문에 Admin으로 가입을 시도했을 떄 admin으로 인식하여 중복체크를 우회할 수 없다.


admin이라는 계정으로 중복체크를 우회해서 가입해야하므로 구글링을 조금만 해보면 취약점이 나온다.

( 참고 : https://crehacktive3.blog.me/221119849411 )


이를 이용하여 id에 admin, pass에 123을 넣은 뒤 burp 상에서 공백을 주고 전송시키면 회원가입이 된다.

다시 login.php에 가서 admin / 123으로 로그인을 시도하면 클리어~

반응형

'Solve Problem > Webhacking.kr' 카테고리의 다른 글

[webhacking.kr] 8번 문제  (0) 2018.03.05
[webhacking.kr] 6번 문제  (0) 2018.03.05
[webhacking.kr] 4번 문제  (0) 2018.03.05
[webhacking.kr] 3번 문제  (0) 2018.03.05
[webhacking.kr] 2번 문제  (0) 2018.03.04
블로그 이미지

rootable

,
반응형


문제 접근 시 위와 같은 화면이 뜬다.


==으로 끝나는 것으로 보아 Base64라 생각하여 디코딩을 시도하였다.

그 결과 아래와 같은 문자가 나왔다.


c4033bff94b567a190e33faa551f411caef444f2


길이가 40자인것으로 보아 sha1으로 인코딩된 것으로 보인다.

(참고 : 인코딩 결과가 32자면 md5로 인코딩, 40자면 sha1으로 인코딩)



온라인 decode 사이트에 가서 decode 시도 시 결과의 길이도 40자로 sha1으로 인코딩된 것으로 판단된다.


다시 decode를 하면 아래와 같이 test라는 문자가 출력된다.


해당 값을 password에 넣고 제출을 누르면 클리어~

반응형

'Solve Problem > Webhacking.kr' 카테고리의 다른 글

[webhacking.kr] 6번 문제  (0) 2018.03.05
[webhacking.kr] 5번 문제  (0) 2018.03.05
[webhacking.kr] 3번 문제  (0) 2018.03.05
[webhacking.kr] 2번 문제  (0) 2018.03.04
[webhacking.kr] 1번 문제  (0) 2018.02.13
블로그 이미지

rootable

,
반응형

문제에 접근하면 위와 같은 거대한 퍼즐이 나온다.

클릭할 수 있는 거라곤 숫자들 사이의 칸과 밑에 있는 [gogo] 버튼 뿐이다.

수도쿠 문제인가?? 재미삼아 해봐야지 ㅎㅎㅎ



위와 같이 클릭 후 gogo를 눌렀더니..오잉??


이름을 입력하는 칸이 나왔다.

name을 입력하고 write 버튼을 눌러보았다.



입력한 name과 함께 answer과 ip가 뜬다.

이번에도 SQL Injection인가..?


name부분은 10자리만 입력 가능하길래 JS에서 바꾸면될까 해서 바꿔보았지만 서버단에서 10개의 문자만 받는 듯 하다.

answer부분에 '를 넣었을 떄 no hack이 뜨고 "을 넣었을 떄 query error가 뜨는 것으로 보아 answer부분에서 SQL Injection을 하는 듯 하다.


정답은 or을 ||로 바꿔서 진행하는 것!

answer=101010000001110010101111||1

을 입력하면 정답이 출력된다.


반응형

'Solve Problem > Webhacking.kr' 카테고리의 다른 글

[webhacking.kr] 5번 문제  (0) 2018.03.05
[webhacking.kr] 4번 문제  (0) 2018.03.05
[webhacking.kr] 2번 문제  (0) 2018.03.04
[webhacking.kr] 1번 문제  (0) 2018.02.13
[webhacking.kr] 새로운 시작  (0) 2018.02.13
블로그 이미지

rootable

,

3월 5일자

Hacking/Reversing 2018. 3. 5. 11:25
반응형

* 원하는 코드를 빨리 찾아내는 4가지 방법

1) 명령어 하나씩 직접 실행하면서 원하는 위치를 찾아가는 방법

2) All referenced text strings를 통해 문자열 검색

3) API 검색 후 호출 코드에 BP - All intermodular calls 이용

4) API 코드에 직접 BP - Name in all modules 이용(Packer, Protecter 이용 시 API 호출 목록이 보이지 않으므로 로딩된 라이브러리(DLL 코드)에 직접 BP


 - 3, 4의 차이는 직접 이 프로그램에서 호출한 곳에 BP를 거느냐, DLL 내 API에 BP를 걸어 사용할 때 잡히게 할거냐 의 차이


- API에 BP걸 때 이용하는 기능 구분

 All intermodular calls

 코드에서 호출되는 모든 API 함수 보기 

 Name in all modules 

 모든 API 함수 보기 



* Label과 Comment의 차이

 - Label 은 메모리 값에 이름을 붙어주는 것이므로 추후 해당 메모리를 CALL할 때 붙여준 이름으로 나타난다.

 - Comment는 말그대로 해당하는 한 줄에 주석을 다는 것


* 범용 레지스터 쓰임새

 - EAX : 주로 함수의 return값이나 사칙연산의 결과값 저장

 - EBX 

 - ECX : 반복문의 count를 저장, 반복문이 돌때마다 1씩 감소

 - EDX

 - ESP : Stack pointer

 - EBP : Stack frame을 위한 레지스터로 ESP의 값을 저장해두는 곳

 - ESI : Source pointer 로서 값 복사를 위해 주로 사용

 - EDI : Destination pointer 로서 값 복사를 위해 주로 사용


* 바이트 수

BYTE = 1바이트

WORD = 2바이트

DWORD  = 4바이트


* Calling Convention (함수 호출 규약)

cdecl : Caller가 스택 정리

stdcall : Callee가 스택 정리

반응형

'Hacking > Reversing' 카테고리의 다른 글

Ollydbg 창 설명 및 기초  (0) 2019.02.10
Visual Basic 파일 분석  (0) 2018.11.18
immunity debugger가 바로 꺼질 때 해결  (2) 2016.01.03
블로그 이미지

rootable

,
반응형

문제를 풀어보자

첫 페이지 접근 시 응답 내 아래와 같은 주석이 존재함을 알 수 있다.

쿠키를 보면 time이라는 변수가 존재하는데 이 값을 변경하면 저 주석의 값이 변경됨을 알 수 있다.

이를 이용하는 것이 아닐까?


조금 더 포인트를 찾아보았다.

응답 내 admin이라는 페이지가 존재하여 들어가면 아래와 같은 페이지가 뜬다.

패스워드를 입력하는 부분인거 같아 SQL Injection으로 로그인을 bypass해보려했지만 실패했다.


마지막으로 찾은 포인트는 BOARD에 들어가면 글이 하나 있는데 접근하려하면 아래와 같이 비밀글이라며 패스워드를 요구한다.

이 또한 SQL Injection으로 bypass해보려했지만 실패하였다.


다시 처음으로 돌아가 time을 이용한 주석에서 SQL Injection을 하는 것이 아닐까하여 원래값인 time=1520154131을 time=1520154131%2b1 로 하였을 때 값이 변하는 것을 통해 SQL Injection 포인트인 것을 확인하였다.


time=1520154131+and+1=1 → <!--2070-01-01 09:00:01-->

time=1520154131+and+1=2 → <!--2070-01-01 09:00:00-->

으로 출력되는 것을 통해 blind sql injection으로 패스워드를 획득해야겠다 생각하였다.


삽질의 결과 limit가 사용이 불가한 것을 알았다. 따라서 information_schema를 통해서 데이터를 획득하는데는 한계가 있다.


아래 사진과 같이 BOARD를 눌렀을 때 상단에 FreeB0aRd라고 나오는 것을 통해 테이블명이 저것과 같지 않을까란 생각에 시도.


time=1520154131+and+(select 1+from+FreeB0aRd)=1 의 결과 <!--2070-01-01 09:00:01-->이 출력되었다.

이를 통해 해당 테이블이 존재함을 확인하였고 패스워드 획득을 위해 또 게싱을 하였다.


time=1520154131+and+(select+ascii(substr(password,1,1))+from+FreeB0aRd)>1의 결과 <!--2070-01-01 09:00:01-->이 출력되었다.


이를 통해 column명은 password임을 알았다. (데이터가 1개 뿐이였기 때문에 password도 하나일 거란 생각을 하였다. limit도 사용못하므로 1개만 했을 거란 생각도..)


efficient blind sql injection으로 할까 하다가 귀찮아서 Intruder를 돌리고 있는데 오래걸린다... 여기까지를 작성하면 다 될줄 알았는데....

Efficient blind sql injection 코드를 써보자.


음???? 코드짜고 돌린 efficient 가 더 빨랐따 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

결과로 나온 7598522ae를 패스워드로 입력하면 아래와 같은 화면이 뜬다.


저 admin manual이라는 파일을 다운을 받을 수가 있는데 다운받아 압축을 해제하려고 하면 패스워드를 입력하란다...

웹해킹.kr이니까 압축 비밀번호를 찾으라는 건 아니겠지....??

혹시나해서 게시판 비밀번호를 입력해봤지만 실패

admin 페이지도 같은 비밀번호로는 로그인 실패


다시 처음으로 온 느낌...

오!! 개이득

게싱으로 admin 테이블을 시도해봤는데 password 컬럼까지 존재를 확인했다.

time=1520154131+and+(select+ascii(substr(password,1,1))+from+admin)>1 → <!--2070-01-01 09:00:01-->


아까와 같은 방법으로 패스워드를 찾아보자.

time=1520154131+and+(select+length(password)+from+admin)=10; 를 통해 패스워드가 10자리인 것을 확인하였고 efficient blind sql injection 코드 짜 놓은 것으로 패스워드를 알아보았다.


확인 결과 0nly_admin임을 알았다.

이것을 통해 admin 페이지에 접근 완료!


써져있는 메뉴얼 패스워드로 압축을 풀면 될 듯 하다.

풀어보자~



정답 획득!


여기서는 아래와 같은 것을 깨달았다.

1. cookie의 값으로도 sql injection이 가능하다.

2. 게싱도 필요하다.

3. Intruder보다 efficient blind sql injection이 훨씬 빠르다... (Free 버전이라 Intruder가 느린건가?)

반응형

'Solve Problem > Webhacking.kr' 카테고리의 다른 글

[webhacking.kr] 5번 문제  (0) 2018.03.05
[webhacking.kr] 4번 문제  (0) 2018.03.05
[webhacking.kr] 3번 문제  (0) 2018.03.05
[webhacking.kr] 1번 문제  (0) 2018.02.13
[webhacking.kr] 새로운 시작  (0) 2018.02.13
블로그 이미지

rootable

,
반응형


문제를 보자.

전 문제와 비슷해보인다.

sleep과 benchmark, _가 막힌것으로 보아 time based는 아니다.

error based를 이용해야하는데 이전 문제를 풀 때 사용한 if문이 막혔다.


이전과 다른 점이라면 exit() 안에 mysql_error()가 없어서 정확히 어떤 에러가 나왔는지는 알 수 없다.

하지만 뭐.. 에러가 나냐 안나냐만 알면 되므로 그건 중요하지 않다!


먼저 알아본 것은 if와 case 대신 사용할 수 있는 함수가 있는지였다.

그 결과 나온 함수들은 coalesce() , nvl() 두가지인데 nvl()함수는 오라클 전용이란다.. ( mysql에서 같은 의미의 함수는 ifnull() )


* coalesce()함수는 처음 파라미터부터 시작하여 null이 아닌 값을 출력해준다고 한다.

ex) coalesce(null,1,2.5,"test") 의 경우 1이 출력

coalesce(null,null,null,3,"test') 의 경우 3이 출력


하지만 이 함수의 경우 에러를 출력시키지 않는다는 함정이 있다..

우리는 에러를 출력시켜야한단 말이다 ㅠㅠ


일단 union 과 select를 막지 않았으므로 아까처럼 select 1 union select 2를 사용하는 것 아닐까?


query : select id from prob_dark_eyes where id='admin' and pw='' or id='admin' and (select 1 union select 2 where length(pw)>100)#'


이와 같이 진행하면 된다.

만약 pw의 길이가 100이 넘는다면 select 2도 동작을 하여 and부분에 union으로 두가지 select가 되어 에러가 출력된다.


query : select id from prob_dark_eyes where id='admin' and pw='' or id='admin' and (select 1 union select 2 where length(pw)=8)#'


해당 쿼리 실행시 에러가 발생되어 빈 화면이 떴다. where 부분의 조건이 맞아 select 2가 동작했기 때문!


efficient blind sql injection를 이용하여 문제 해결






반응형

'Solve Problem > LOS' 카테고리의 다른 글

[LOS] 문제풀이 11번 - 20번  (0) 2019.05.26
[LOS] 문제풀이 1번 - 10번  (0) 2019.05.10
[LOS] 21번 문제  (0) 2018.02.22
[LOS] 20번 문제  (0) 2018.02.14
[LOS] 19번 문제  (0) 2018.02.11
블로그 이미지

rootable

,
반응형

* 64비트 단말기로 진행하다가 32비트 단말기로 진행하여 실제 진행시 달라질 수 있습니다.



실행시키면 1번 문제와 똑같다. 1번 문제와 똑같이 루팅 우회를 시도하였다.



동일하게 루팅이 우회되었고 이제 Secret String을 찾으면 된다.

JEB로 apk를 Open한 뒤 Launcher Activity인 MainActivity로 갔다.


분석하던 중 verify라는 함수에서 실행했을 때 뜬 문자열이 보였다.

조건문을 보면 this.m.a(v0)가 true면 성공했을 때의 문자열이 출력되는 것을 볼 수 있다.

해당 함수에 들어가보자.


해당 함수에 들어가면 입력한 문자열을 같은 클래스 내의 bar 함수로 전송시키는데 아래에 있는 bar 함수에는 코드가 존재하지 않는 것을 볼 수 있다.

앞에 native가 있는 것으로 보아 라이브러리안에 해당 함수의 코드가 존재한다는 것을 알 수 있다.


다시 MainActivity로 가면 "foo"라는 라이브러리를 호출하고 있는 것을 알 수 있다.

apkManager로 디컴파일한 뒤 Libraries 폴더 내 자신이 테스트 중인 플랫폼에 맞는 폴더에 들어가면 libfoo.so 파일이 존재함을 볼 수 있다.


* .so 파일이란?

 - 리눅스의 동적 라이브러리로 윈도우에서의 dll과 완벽하게 일치하는 개념의 라이브러리

 - 런타임에 호출될 코드가 결정되고, 로드된다.

 - 무결성 탐지를 위한 네트워크 통신이나 루팅탐지 등 중요하다고 생각되는 부분을 라이브러리로 만들어 분석을 더 어렵게 하기 위해 주로 사용됨.

 - Android 공식 홈페이지의 경우 별로 비추천하는 방식이긴 하다.. (https://developer.android.com/ndk/guides/index.html?hl=ko)


해당 라이브러리 파일을 IDA를 통해 열어보았다.

파일에서 Export되는 모든 함수 목록을 보여주는 Exports windows에 가면 [Java_패키지명_클래스명_함수명] 으로 명명된 두 함수를 볼 수 있다.


이 중 우리는 CodeCheck 클래스의 bar 함수에 관심이 있다!

그 전에 혹시 패스워드가 코드 내에 하드코딩되어 있을 수 있으므로 [View - Open subviews - Strings] 혹은 [ Shift+F12 ] 를 통해 Strings 탭을 보자.


.data 쪽을 보면 abcdefghijklmnopqrstuvw가 있다. 해당 문자열이 혹시 답일까하여 입력 후 Verify 버튼을 클릭하였지만 틀렸다고 나온다.

그렇다면! 방금 찾은 CodeCheck_bar  함수에 더블클릭하여 들어가보자. (Exports 탭에서 더블클릭해야한다)


무언가 코드가 쭈우욱 있는데 아직..리버싱 초짜라 뭔지 모르겠다 ㅇ_ㅇ 하면서 읽고 있는데 .strncmp가 보인다.

strncmp의 경우 문자열을 비교할 때 특정 길이까지만 비교하는 함수이다! 그렇다면 몇번째까지 비교를 할지 알아보자.

스페이스바를 누르면 Graph형식으로 나타나 조금 더 분석하기 용이해진다.


분기문을 보면 CMP W0, #0x17 이라고 되어있고 이를 B.NE(Branch Not Equal = 플래그가 0이 아니면 분기)를 하여 분기문이 일어나는 것을 볼 수 있다.


W0에 대해 알아보자면 ARM의 범용 레지스터에는 30개의 범용 레지스터가 존재한다.

64-bit의 경우 X0-X30으로 이루어져있고 32-bit에는 W0-W30으로 이루어져있다.

(참고 : http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.den0024a/BABHDEEJ.html)

즉, 32비트 레지스터에 들어있는 값을 0x17과 비교하여 분기를 시키므로 23과 비교를 하는 것을 알 수 있다. 

눈치가 빠르다면 문자열의 길이가 23인 것과 비교한다는 것을 생각할 수 있는데 W0에 클릭을 하면 X0과 같이 표시가 되는 것으로 보아 한 레지스터를 32비트만큼 사용하냐 64비트만큼 사용하냐에 따라 표시를 달리 하는 듯 하다.


MOV a,b의 의미가 b의 값을 a로 넣는다는 것을 잘 생각해서 분석을 하다보면 .... 음 ㅠㅠ 모르겠다.. 일단 23개의 문자를 넣어야겠다는 생각을 가지고 진행해보자.


.strncmp하는 것을 보면

MOV X1, SP

MOV W2, #0x17

MOV X0, X21

을 한 뒤 .strncmp를 하는 것을 알 수 있다.

strncmp가 비교할 두 문자열과 비교 길이를 넣는 것이므로 X0와 X1 레지스터 내 문자열을 비교하며 0x17만큼 비교한다는 것을 알 수 있다.

그렇다면 둘 중 하나는 내가 입력한 문자열일 것이고 하나는 패스워드일 것이다.


동적디버깅으로 가보자.

먼저 [ IDA 설치 폴더 - dbgsrv 폴더 ]에 가서 자신의 플랫폼에 맞는 android_server 파일을 /data/local/tmp 폴더에 올려준다.

그 후 권한을 준 뒤 실행시켜준다. 

아래의 사진이 위의 과정을 한 명령어와 그 결과이다. 잘 실행시키면 Listening on 0.0.0.0:23946... 이 뜰 것이다.

이제 새로 cmd창을 열어 adb forward tcp:23946 tcp:23946 을 작성한다. 이는 컴퓨터의 23946 포트를 루팅폰의 23946 포트로 포워딩하는 명령어이다. 이를 진행해야 IDA에서 루팅폰이 연 23946으로 접근할 수 있다.


열려있던 libfoo.so에 대한 창을 [ File - Close ]를 통해 닫고 [ Debugger - Attach - Remote ARMLinux/Android debugger ] 를 클릭해준다.

나타나는 창에 Hostname에는 localhost, Port는 루팅폰에서 열린 23946(default port)로 한 뒤 OK를 누르면 아래와 같이 프로세스 목록이 뜬다.

여기서 우리가 하기로 한 sg.vantagepoint.uncrackable2 프로세스를 선택 후 OK를 눌러준다.


잠시 로딩 후 디버깅 창이 뜬다.

우측 Path 창에서 우리가 디버깅 중인 libfoo.so를 찾아 더블클릭하면 함수 목록이 뜨며 그 중 패스워드를 확인하는 CodeCheck_bar 함수를 더블클릭하면 해당 코드가 왼쪽 Debug View에 나타난다.


코드 중 .strncmp에 BP를 걸고싶었지만 보이지 않았다. 그래서 스페이스바를 눌러 Graph 형식으로 바꿔준 뒤 위에서 봤던 형식과 동일한 부분이 B509B25C에 있는 것을 확인하였다.


.strncmp로 생각되는 25C에 BP를 건 뒤 실행시켰다.

실행시킨 뒤 문자열을 23자보다 적게 입력하면 BP까지 도달하지도 않기 때문에 반드시 23자리를 적어주어야한다.


[ 12345678901234567890123 ] 으로 23자리를 입력한 뒤 Verify를 누르면 아래와 같이 BP에 걸린 것을 확인할 수 있다.

이 때 우리는 첫번쨰와 두번째 레지스터의 스트링 값을 확인해야한다.


우측 상단을 보면 아래 사진과 같이 Gerneral registers 창이 있는 것을 볼 수 있다.


코드를 보면 R0와 R1이 쓰인 것을 확인할 수 있으므로 해당 레지스터에 들어있는 주소(R0 : 9F0770B8 / R1 : BE890C38 )를 아래 Hex View에서 검색하였다.


Hex View를 클릭한 뒤 G 버튼을 누르면 Jump to address 창이 뜨는데 여기에 주소값을 넣어주면 해당 주소로 이동한다.


R0에 들어있는 주소로 가니 내가 입력한 문자열이 있는 것을 확인할 수 있다.


다음으로 R1에 들어있는 주소로 가니 패스워드로 예상되는 값이 들어있었다.


해당 문자열을 나열해보면 [ thanks for all the fish ]로 정확히 23자리인 것을 알 수 있다.

디버깅을 풀고 위의 문자열을 입력하면 문제가 풀린다!



* 참고

 - ARM 어셈블리어 명령어 : http://egloos.zum.com/orangetigger/v/359478

 - 어셈블리어 정리 : 

http://bang1575.tistory.com/entry/%EB%A6%AC%EB%B2%84%EC%8B%B1%EC%9D%84-%EC%9C%84%ED%95%9C-%EC%96%B4%EC%85%88%EB%B8%94%EB%A6%AC%EC%96%B4-%EC%A0%95%EB%A6%AC




반응형
블로그 이미지

rootable

,
반응형

문제 : https://github.com/OWASP/owasp-mstg/tree/master/Crackmes



문제를 보면 앱 어딘가에 secret string이 있다고 한다. 그것을 추출해낼 방법을 찾아보라고 한다.


루팅폰에서 앱 설치 후 실행시키면 아래와 같은 메시지가 뜨며 OK를 누를 시 앱이 종료된다.


따라서 이를 분석하여 루팅탐지부터 우회해야 한다.



Launcher Activity의 onCreate에 가면 루팅탐지 시 나타난 "Root detected!"라는 문구가 하드코딩되어 있는 것을 볼 수 있다.

따라서 c.a() , c.b(), c.c() 함수에 뭔 짓(?)을 하면 될거라 생각된다.


간단하게 smali 코드에서 if문을 반대로 동작하도록 하면 풀릴 거라 생각하고 if-nez 두개를 if-eqz로 바꿨다. 


하지만 풀리지 않았다.

루팅폰의 경우 3가지 조건에 다 걸릴 수도 있지만 1개만 걸릴 수도 있기 때문에 log를 출력시켜 걸리는 함수만 조건문을 반대로 작동하게 하기로 하였다.


각 조건문에 log를 출력하도록 아래와 같이 smali 코드를 작성하였다. (v1 부분의 문자열만 first, second, third로 변경하였다.)


const-string v1, "first"

const-string v2, "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"

invoke-static {v1,v2}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I


그 결과 로그캣으로 봤을 때 하나도 보이지 않아 먼저 첫번째 조건문을 우회해야겠다 생각하였고 첫번째 조건문만 if-nez를 if-eqz로 바꾸고 다시 묶어 실행시키고 로그캣으로 봤다.



위와 같이 출력이 되며 루팅탐지가 우회되어 잘 접근되었다.

들어가면 아래와 같이 Secret String을 입력하라는 창이 뜬다.


임의의 문자를 입력하면 Nope... 이라는 메시지가 뜨는데 이를 코드에서 확인해보면 verify 라는 함수에 있는 것을 볼 수 있다.



조건 문이 if(a.a(v0)) 가 되면 Success가 뜨는 것으로 보아 a.a 함수를 확인해보면 답이 될 듯 하다.


a.a 함수에 따라 들어가면 입력한 문자열과 sg.vantagepoint.a.a.a 함수에 문자열 2개를 넣은 것과 비교를 한다.


따라서 sg.vantagepoint.a.a.a에 따라 들어가면 AES 암호화 혹은 복호화와 관련한 것이 보이는데 그 결과를 return시키고 있다.



따라서 smali 코드에 해당 리턴값을 출력시키면 답이 될거라 생각하였다.

아래와 같은 smali코드를 return 전에 입력해주었다.


const-string v3, "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"

new-instance v4, Ljava/lang/String;

invoke-direct {v4,v0}, Ljava/lang/String;-><init>([B)V

invoke-static {v3,v4}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I


간단히 설명하면 v4를 새로 생성해준 뒤 리턴값이 들어있는 v0를 v4에 넣어주고 해당 값을 로그에 찍어주었다.



로그에 보이는 I want to believe를 입력하고 검증 버튼을 누르면 문제 해결!


반응형
블로그 이미지

rootable

,