Published 2022. 12. 15. 18:24
코드 분석
MainActivity에서 challenge_07.setChall07()을 호출하여 chall07에 랜덤한 값을 삽입 후 challenge_07.check07Pin()에서 검증을 수행한다.
반복문을 돌리기 위해 chall07 변수에 삽입될 값의 범위를 한번 알아보겠다.
Math.random() * 9000이므로, 0 ~ 8999까지의 범위를 가진다. 하지만 뒤에 1000이 더해져서 최소 범위는 1000부터 시작이 된다. 즉, chall07의 값 범위는 1000 ~ 8999이다.
문제의 목표는 무차별 대입 공격을 수행하여 검증을 통과하라고 하였으니, MainActivity.chall07()의 파라미터에 반복문을 이용하여 값을 넣어서 검증을 통과하면 될 것이다.
Write Up
Java.perform(() => {
console.log("\n* Hooking Start *")
var challenge07 = () => {
var challenge_07 = Java.use("uk.rossmarks.fridalab.challenge_07")
Java.choose("uk.rossmarks.fridalab.MainActivity", {
"onMatch": (instense) => {
var pin = 1000
while (true) {
if (String(pin) == challenge_07.chall07.value) {
instense.chall07(String(pin))
break
}
pin++
}
},
"onComplete": () => console.log("challenge_07 solved!")
})
}
// Hooking Function Call
challenge07()
})
반복문으로 challenge_07.chall07의 값와 증가되는 값을 비교 후 맞다면, MainActivity.chall07()에 파라미터로 넘겨 검증을 통과하였다.
사실 challenge_07.chall07 값을 MainActivity.chall07()에 파라미터로 넘기면 바로 통과하겠지만, 그럼 Challenge 06과 같은 문제 풀이가 되어 이렇게 무차별 대입 공격을 시도하여 통과하라고 하는 것으로 보인다.