[목차]

 

 

6. Run chall06() after 10 seconds with correct value

7. Bruteforce check07Pin() then confirm with chall07()

8. Change 'check' button's text value to 'Confirm’

 

 

 


 

 

 

6. Run chall06() after 10 seconds with correct value

> 올바른 값으로 10초 후 chall06() 메서드 실행하기

: 라이브 변수 조작

 

 

 

(1) 소스 확인

 

 

chall06 메서드에 어떤 정수형 값을 주면

if 문 내 challenge_06 클래스 내

confirmChall06(i) 메서드 값이

참이 나오면서 문제가 해결되는데

 

confirmChall06 메서드를 더블클릭하면

해당 메서드로 이동해 소스 확인이 가능

 

 

# 참 조건

i == chal06 && System.currentTimeMillis() > timeStart + 10000;

(1) i 값과 chall06 값이 같으면서

(2) 메서드가 시작된 지(startTime()) 10초가 지나면 참!

 

 

# 해결 방안

ㄱ. setTimeout(fn, delay) API 함수 사용

delay에 시간을 주면(10000ms)

해당 시간이 지난 후 fn에 작성한

로직이 실행이 됨

: setTimeout(function(){}, 10000);

 

ㄴ. challenge_06 클래스의

confirmChall06 메서드를

항상 true가 반환되도록 설정 후

MainActivity 인스턴스를 활용하여

chall06을 호출하면 문제 해결됨!

 

chall06을 호출할 때는

int형 인자 값을 받기 때문에

아무 숫자나 넣어주시면 해결됨!

 

 

 

 

(2) 코드 작성

setTimeout(function(){   // 2번째 조건 System.currentTimeMillis() > timeStart + 10000;
	console.log("\n[+] 10초가 지나 프로그램을 실행합니다!");  // 위에서 시작시간을 설정해 주었고 10초가 지나면 해당 로그가 뜬다.
	setImmediate(function(){
		Java.perform(function(){
			let challenge_main;
			Java.choose("uk.rossmarks.fridalab.MainActivity", {
				onMatch: function(instance) {
					challenge_main = instance;
					const chall_06 = Java.use("uk.rossmarks.fridalab.challenge_06");
					chall_06.confirmChall06.implementation = function () {
						console.log("\n[+] 6번 문제 해결!");
						return true;
					}
					challenge_main.chall06(1);
				},
				onComplete: function() {}
			});
		})
	})
}, 10000);		
 

해결 완료!

 

 

 

# 추가 해결 코드

1) addChall06 호출 방식 확인

 

MainActivity에서 호출됨!

 

 

 

confirmChall06 메소드의 인자 값에

addChall06에서 계산된 값을 넣어주면

i와 chall06 값이 항상 같아지게 되고

 

 

6번 문제 해결 조건인

 

chall06 메서드에

addChall06에서 만든 변수 값을 넣어주면

confirmChall06(i) 의 인자값과 동일해지면

문제 해결!

setTimeout(function(){   // 2번째 조건 System.currentTimeMillis() > timeStart + 10000;
	console.log("\n[+] 10초가 지나 프로그램을 실행합니다!");  // 위에서 시작시간을 설정해 주었고 10초가 지나면 해당 로그가 뜬다.
	setImmediate(function(){
		Java.perform(function(){
			var chall_06 = Java.use("uk.rossmarks.fridalab.challenge_06");    // chall_06 변수가 challenge_06 클래스 객체를 다룰 수 있다
			chall_06.addChall06.overload("int").implementation = function(arg){   // addChall06을 재작성! addChall06이 시작되면
				console.log("\n[+] 후킹 시작!");
				Java.choose("uk.rossmarks.fridalab.MainActivity",{       // mainActivity를 찾아 해당 instance를 다루고 실행해야 하니 Java.choose
					onMatch : function(instance){      // 이름은 상관없고 매칭이 되면  
						instance.chall06(chall_06.chall06.value);	// mainActivity가 실행될 때 chall06 메서드도 실행되면서 두 개의 값은 같아진다.
						console.log("\n[+] chall06 메서드 값 일치화 성공!");	
					},
					onComplete : function(){
						console.log("\n[+] 06 문제 해결!");
					}
		    	});
		    }
		})
	})
}, 10000);
 

 

 

 


 

 

7. Bruteforce check07Pin() then confirm with chall07()

> chall07Pin() 메서드를 브루트 포스 해서 chall07() 메서드로 확인하기

 

특정 pin 값을 무차별 대입으로

찾아 해결하는 문제

 

 

(1) 소스 분석

 

 

0~8999 + 1000

실 범위 = 1000 ~ 9999

 

 

 

 

(2) 코드 작성

setImmediate(function(){
	Java.perform(function(){
		var chall_07 = Java.use("uk.rossmarks.fridalab.challenge_07"); 
		Java.choose("uk.rossmarks.fridalab.MainActivity",{
				onMatch : function(instance){
					for(var i=9999; i>=1000; i--){
						var takudaddy = String(i);
						if(chall_07.check07Pin(takudaddy)){
							console.log("\n[+] chall07 pin 값 :" + takudaddy);
							instance.chall07(takudaddy);
							break;
						}
					}
				},
				onComplete : function(){
					console.log("\n[+] 7번 문제 해결!");
				}
		})
	})
})
 

해결 완료!

 

 

 

 


 

 

8. Change 'check' button's text value to 'Confirm’

 

화면 내 CHECK 버튼 글씨를 CONFIRM으로 바꿔라!

 

 

(1) 소스 확인

 

 

 

 

(2) 코드 작성

setImmediate(function(){
	Java.perform(function(){
		var klass = Java.use("android.widget.Button");
		Java.choose("uk.rossmarks.fridalab.MainActivity",{
				onMatch : function(instance){
					var checkid = instance.findViewById(0x7f07002f);
					var check = Java.cast(checkid, klass) // Java.use 반환 값을 가져온다
					check.setText("Confirm");
				},
				onComplete : function(){
					console.log("\n[+] 8번 문제 해결!");
				}
		})
	})
})
 

위 코드를 바로 돌리면

다음과 같은 애러가 발생하는데

setText() 인자 값으로 매치 가능한 종류는 6가지

(overload = 인자 값에 대한 자료형을 나타냄)

 

 

 

수정 코드

setImmediate(function(){
	Java.perform(function(){
		var klass = Java.use("android.widget.Button");
		Java.choose("uk.rossmarks.fridalab.MainActivity",{
				onMatch : function(instance){
					var checkid = instance.findViewById(0x7f07002f);
					var check = Java.cast(checkid, klass) // Java.use 반환 값을 가져온다
					var string = Java.use("java.lang.String");
					check.setText(string.$new("Confirm"));   // $new 메서드는 java.use로 사용한 klass로 반환된 객체를 new 선언 순간에 인스턴스화 시켜줌
				},
				onComplete : function(){
					console.log("\n[+] 8번 문제 해결!");
				}
		})
	})
})
 

 

출력되는 글자 변경 후

해결 완료!

 

 

 


 

 

[도움 출처]

: 보안프로젝트 김태영 팀장

 

728x90

+ Recent posts