[andriod 실습] frida lab 1번 2번
먼저 녹스 - frida를 연결하는 adb 서버를 실행시켜 프리다 서버 프로그램을 adb 쉘에서 작동시켜 줘야 한다.
근데 필자의 컴퓨터에는 DOCKER가 실행중에 있어서 녹스를 설치하게 되면 wsl2와 오류를 일으켜 실행되지 않는 문제가 발생한다.
이를 고치기 위해 녹스를 삭제 한 후에 wsl을 다시 활성화 시켜도 문제가 생기는 일이 벌어저 포맷까지 했었다...
미래의 내가 그리고 이 글을 볼 누군가가 나처럼 스트레스 받지 않았으면 하는 마음 해경방법을 적어본다.
powershell - 관리자 권한으로 실행 후 다음을 복붙한다.
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
본인은 여기까지 해서도 분명 bios에서 가상화를 켜놨음에도 불구하고 가상화가 활성화 되어있지 않다면서 진행되지 않아서 추가로
- bcdedit /set hypervisorlaunchtype auto
명령어도 넣었을때 docker가 다시 살행되었다.
근데 이를 해도 진행되지 않고 바이오스 타령을 한다면 다음을 확인하길 바란다.
- 장치 관리자
- 동작 -> 레거시 하드웨어 추가
- 목록에서 직접 선택한 하드웨어 설치 선택 -> 다음
- 시스템 장치 선택 -> 다음
- 제조업체 에서 Microsoft 선택 -> 모델 에서 Microsoft Hyper-V 가상화 인프라 드라이버 선택
- 설치
- 시스템 재시작
외국 포럼같은 곳에서도 잘 찾아봐야 나오고 심지어 한국어로 표시된 자료는 많지 않아서 애먹었다.
그런데 이는 영구적인게 아니라 다시 녹스를 사용하기 위해 깔면 충돌이 일어나기 때문에
도커를 개별 서버로 실행시켜 외부로 접속하는걸 추천한다
도커와 문제되지 않는 블루스택도 실행해 보았으나 블루스택은 무슨 이유에서인지 adb shell 이 열리지 않았다..
(열린다고 해도 frida sever가 작동할지도 의문이다. )
도움을 받은 사이트 : https://devsub.tistory.com/m/10
들어가기 전에 frida 문법
https://velog.io/@yjok/%ED%94%84%EB%A6%AC%EB%8B%A4-%EA%B8%B0%EB%B3%B8-%EB%AC%B8%EB%B2%95
프리다 기본 문법
현재 스레드가 가상머신에 연결되어 있는지 확인하고 function을 호출한다.변수와 메소드에 접근할 수 있는 클래스 객체를 반환한다. (인스턴스가 아닌 클래스 객체를 반환함에 주의한다.).implement
velog.io
읽어둔다면 js 코드를 작성할때 큰 도움이 될것으로 보인다
adb 서버 실행하기
녹스가 깔린 폴더에서 cmd를 실행 시켜 준 뒤에 nox_adb.exe shell 이라고 쳐서 adb 쉘에 진입되는지 확인
https://github.com/frida/frida/releases 이곳에사 버전에 맞는 frida server를 다운받아 녹스가 있는 폴더에 넣기
다시 녹스폴더에서 cmd를 켠뒤 ox_adb push ./frida-server-16.0.11-android-x86.xz /data/local/tmp
로 xz 파일을 저기에 넣어주고
xz -d frida-server-16.0.11-android-x86.xz 를 해서 압축을 풀어주고
./frida-server-16.0.11-android-x86 & 로 실행 후 백그라운드에 넣어준다
(두번째 실행할때는 adb shell에서 cd data/local/tmp 한다음 ./frida-server-16.0.11-android-x86 & 으로 실행만 시켜주면 된다.)
그다음 파워쉘에서 frida-ps -Uai 하면 다음과 같이 출력되어야 한다
그리고 이 이후로 문제를 풀때마다 JS파일을 보낼때 쓰는 명령어는
frida -U -l <JSNAME.js> Fridalab
1번문제
challenge_01의 변수 chall01을 1로 만드는게 목적인것 처럼 보인다
스태틱 변수로 초기값을 지정하지 않아 0으로 되어있다.
Java.use 를 사용해서 스태틱 변수의 값을 1로 바꿔주었다.
// fridalab.js
setImmediate(function() {
Java.perform(function() {
// Challenge 01
var chall_01 = Java.use("uk.rossmarks.fridalab.challenge_01");
chall_01.chall01.value = 1;
console.log("\nchallenge_01 solved!");
});
});
그리고 파워쉘에서 실행시켜주면
문제 1 해결완료!
2번문제
메인엑티비티에 들어가서 컨트롤 f로 chall02를 검색하면 다음과같이 instance 메소드로 선언된 chall02를 볼수 있다.
이 메소드를 실행하면 completeArr[1]에 1 값이 들어가도록 되어있고, 그것을 이용해서 감지하는것으로 보인다
js로 코드를 작성해 주자
setImmediate(function() {
Java.perform(function() {
// Challenge 01 (생략)
// Challenge 02
Java.choose("uk.rossmarks.fridalab.MainActivity", {
"onMatch": function(chall_02) {
chall_02.chall02();
},
"onComplete": function() {
console.log("\nchallenge_02 solved!");
}
})
});
});
1, 2번 모두 해결된 것을 볼 수 있다.