기존에 Uncrackable3에 대해 분석하다가 이제서야 풀이를 올리네요
기존에 분석했던 내용은 아래에 있습니다.
https://taesun1114.tistory.com/entry/Uncrackable31?category=729990
앞서 프리다 및 xposed를 탐지하고 있고 루팅체크하는 것을 확인하였고, 돌아와서 소스코드를 확인해보면 this.check.check_code()를 통해서 문자열이 맞는지 확인하고 있습니다.
확인해보니 네이티브 함수를 호출하네요
libfoo.so파일 내 CodeCheck_bar함수를 기드라를 통해 분석해 보겠습니다.
첫번째 빨간 박스에서 무언가 하고 두번째 빨간 박스의 if문을 통해 문자열의 길이가 0x18이라는걸 알 수 있습니다.
첫번째 네모박스의 함수를 통해 문자열 혹은 키값을 생성한후 local_38이라는 변수에 저장해둔 후 3번째 네모박스의 함수에서 최종 문자열을 만들거나 비교를 하는 것으로 보이네요.
첫번째 네모박스 함수에 들어와서 분석해 보겠습니다. 뭔가 코드가 되게 긴걸 보실 수 있는데....
uVar1, uVar2, *puVar3을 통해 하는 행위는 분석을 어렵게 하기 위한 더미코드로 보여요(의미없는 행위들을 몇번이고 반복합다.)
더미코드라고 생각한 이유는 인자로받은 puParm1은 두고 로컬변수만 가지고 행위를 한 후 어디에 값을 넣는다던가 하는 행위가 없어서 더미코드라고 생각했습니다.
더미코드를 지나 쭉 내려오다보면 이제서야 puParm1에 무언가를 넣는코드를 보실 수 있습니다.
함수를 따라가 볼게요
함수를 통해 전달받은 uVar1과 0xb4와 xor연산을 한 후, 리턴해 주네요. 다시 함수를 따라가 봅니다.
xor하는 값만 다르고 계속 함수를 호출하는데요. 몇번이고 동일한 코드를 지나서 계속 함수를 따라 들어가다 보면.
최초에 0xe7을 리턴하는 것을 알 수 있습니다. 그러면 여기서부터 차례로 올라가볼게요 실력은 없고 시간은 많으니 이렇게라도 찾아볼게요
0xe7을 시작으로 xor해주면 다음과 같이 나옵니다.
이게 하나의 값이고 앞에서 보셨듯이 길이가 0x18(24)니까.. 24번 반복해주면 키값을 얻을 수 있어요 ....
소스코드에 보면 xorkey라는 값이 있는데 위에서 노가다로 획득한 키와 이값을 xor해줘야 됩니다.
다음과 같이 xor해주면 키값이 출력되는 것을 확인할 수 있습니다.
프리다로 풀려고 했는데.. so파일 분석하다 보니 그냥 키값을 추출하게 되었네요....
'Mobile' 카테고리의 다른 글
Can't connect to App. Have you connected the device?(with.Frida) (0) | 2019.05.08 |
---|---|
Waiting for USB device to appear...(With.Frida) (0) | 2019.05.08 |
Ghidra Installation (0) | 2019.04.10 |
Android Burp 인증서 설치(Android 7.0) (2) | 2019.03.11 |
Objection(with. iOS SSL Pinning) (0) | 2019.03.11 |