CTF | wargame

labyrenth 2017 / Mobile 1 - Ezdroid(안드로이드 코드 리버싱, 자바 연산상 오류 )

nopdata 2018. 2. 27. 21:33
apk를 디컴파일 해 보면 볼만한 클래스는 EzMain과 ones 두 개가 존재한다. EzMain을 메인으로 생각하면 된다.

[ onCreate ]

onCreate부분을 보게 되면 Part1으로 특정 문자열이 출력 되게 되어 있다. 기기를 붙여 실행을 시키면 log로 확인이 가능하다. 아니면 코드 분석을 하면 된다.

[ retIt ]

part1의 답인 retIt을 보면 위와 같다. 고정된 숫자값의 shift right x만큼을 한다. 단, 저장되는 형태가 byte이므로, &연산을 통해 버려주어야 한다. 파이썬 연산으로 변환하면 다음과 같다.

(-1041749503 >> 5) & 0xff
(-1865645093 >> 9) & 0xff
(-1972361451 >> 7) & 0xff
(-1779558645 >> 18) & 0xff
(339200404 >> 2) & 0xff
(1725700009 >> 4) & 0xff
(-1760823842 >> 13) & 0xff
(-1727695801 >> 22) & 0xff
(-685164605 >> 20) & 0xff
(1706546180 >> 15) & 0xff
(757601807 >> 21) & 0xff
(-979820414 >> 14) & 0xff
(-660212506 >> 12) & 0xff

PAN{ez_droid_

다음으로 Part2이다.



input을 넣어 next로 보낼 수 있는데, 여기에 들어가는 값이 답으로 출력된다. 맞는 값인지, 아닌지 체크하는 루틴은 존재하지 않는다.

"two plus one", "one plus one", "five plus two", "three plus zero", "nine minus two", "two plus two", "three plus three", "eleven minus ten", "negative two plus nine", "one plus one", "five plus two", "three plus one"
327374617274가 답이며, Part2의 출력으로는 HexToAscii(327374617274.tostring())이므로, '327374617274'.decode('hex')인 2start_가 된다.

마지막 부분이다. 먼저 출력 구문을 보면 다음과 같다.

System.out.println("Final Part: " + this.hexToASCII("" + arg10.charAt(14) + arg10.charAt(3) + arg10.charAt(14) + arg10.charAt(11) + arg10.charAt(5) + arg10.charAt(4) + arg10.charAt(14) + arg10.charAt(13) + arg10.charAt(19) + arg10.charAt(6) + arg10.charAt(14) + arg10.charAt(13) + arg10.charAt(14) + arg10.charAt(1) + arg10.charAt(14) + arg10.charAt(14) + arg10.charAt(14) + arg10.charAt(1) + arg10.charAt(14) + arg10.charAt(11) + arg10.charAt(5) + arg10.charAt(13)) + "}");

특정 값이 어디에 존재하는지 확인을 한다. 여기서 비교 대상이 되는 arg10은 다음과 같다.


x * -37 + 42 = 17206538691이 되는 값 x를 찾아야 한다. 하지만 정확히 떨어지는 값이 아니며, 자바의 연산상 오류가 발생 한다고 한다.

BigInteger를 사용하면 구할 수 있다.
x*-37 = (17206538691-42)
x = inverse(-37, 1<<64) * (17206538691-42)
 -5982727808154625893

각 값을 charat의 인덱스 값에 맞추어 뽑아내면 hard2defeat를 얻을 수 있고 각 파트의 답을 조합하면 답을 얻을 수 있다.

flag : PAN{ez_droid_2start_hard2defeat}