이전 포스팅에서
Process.enumerateModules
와Module.enumerateExports
를 통해 현재 로드된 모듈과 함수에 대해 확인하는 방법을 다뤘다. 하지만 이 방법으로는 간접 호출하는 함수의 포인터가 어떤 함수를 가리키는지 파악하기 어렵다.쥬스형의 꿀팁으로 맨날 복붙으로
backtrace
할 때만 쓰던DebugSymbol
API 를 활용해서 쉽게 파악하는 방법을 알게 되었다.
테스트는 구조체 형태로 인다이렉트 콜을 구현한 예제로 진행했다. 소스 코드는 여기에서 확인할 수 있다.
init
함수에서 myFunc
구조체를 초기화하고 dlsym
을 활용해서 libc 라이브러리의 함수 주소 값을 세팅하고 있다.
Frida CLI
로 확인해보자. DebugSymbol.fromAddress
함수로 해당 주소 값의 정보를 확인할 수 있다.
확인 결과 *(myFunc + 992)
에 담긴 주소 값은 fopen
이라는 것을 알 수 있다.
fopen
의 디버그 심볼을 확인해보면 myFunc[62]->func
와 동일한 것을 알 수 있다.
마찬가지로 *(myFunc + 40)
= open
이라는 것을 알 수 있다. myFunc[2]->func2
의 정보도 깔끔하게 확인할 수 있다.
나머지도 똑같이 계산하면 fgets
, strstr
함수의 주소 값이라는 것을 확인할 수 있다.
이로써 인다이렉트 콜 로직을 분석하는게 더욱 쉬워졌다. 댕큐 쥬스..