[FRIDA] DebugSymbol & Indirect Calls

koo00·2022년 9월 23일
0

이전 포스팅에서 Process.enumerateModulesModule.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 함수의 주소 값이라는 것을 확인할 수 있다.


이로써 인다이렉트 콜 로직을 분석하는게 더욱 쉬워졌다. 댕큐 쥬스..

profile
JFDI !

0개의 댓글