본문 바로가기

Programming

IDA FLIRT Symbol Recovery

심볼이 스트립된 바이너리를 IDA 로 분석하는 경우 모든 함수명이 아래처럼 가상주소 번지로만 나타나기때문에

무슨 함수인지 알수가 없어서 분석이 매우 어려워진다. 



IDA 가 제공하는 FLIRT 심볼복구기능은 정적링킹되어 스트립된 리눅스 바이너리에 대해서

링킹된 정적 라이브러리 파일이 존재할때 완벽하게 심볼들을 복원 시킬 수 있다. 

정확한 버전의 정적 라이브러리 파일이 존재하지 않아도, 비슷한 버전을 통해서도 왠만큼 복구가 가능하다.


기본적인 원리는 libc.a 를 예로들면 다음과 같다


1. libc.a 와 같은 정적 라이브러리 파일속에 존재하는 모든 함수들에 대한 시그니쳐를 생성

2. 시그니쳐 파일과 스트립된 바이너리속의 패턴을 매칭시켜서 함수 이름을 복원


리눅스의 libc.a 로부터 시그니쳐 파일을 생성하기 위해서는 IDA 리눅스 버전의 "pelf, sigmake" 두개의 툴이 필요하다.

먼저 pelf 툴을 통해서 .pat 파일을 생성하고, .pat 파일을 sigmake 툴이 입력받아서 .sig 파일을 생성한다.

최종적으로 IDA 가 사용하는 시그니쳐 파일은 .sig 파일이다.


pelf 파일의 사용법은 다음과 같다.


보통은 ./pelf libc.a libc.pat 하면 패턴파일이 바로 생성되지만 이번에는 unknown relocation type 이라는 오류가 생겼다.

구글링해도 뭐가 안나와서 당황스럽지만 pelf 사용법에 보니 아래와 같이 support relocation type 라는항목이 있길래

나와있는대로 적용해보았더니 해결되었다.  자세히는 어떻게 된건지 모르겠다.



생성된 libc.pat 파일을 이용해서 sigmake 툴로 아래와같이 sig 파일을 생성하면 처음에는 오류가 생긴다.



서로다른 함수들에서 동일한 시그니쳐가 생성되기때문인데, 이러한 Collision 에 대한 정보가 exc 파일에 생성되고

열어보면 아래와 같다.



파일자체에 있는 설명대로 Collision 이 난 여러개의 시그니쳐중 실제로 적용하고 싶은 것에 + 표기를 하고

exc 파일상의 주석을 지우면 아래와 같이 되는데, 이상태로 파일을 저장해주고 다시 sigmake 툴을 실행하면 된다.



exc 파일을 수정한뒤에 sigmake 를 수행한 결과 아래처럼 sig 파일이 생성된다.



이제 이 sig 파일을 IDA 디렉토리의 sig 폴더(ARM 바이너리인 경우 sig/arm) 에 넣어놓고

아래의 FLIRT signature file 메뉴를 열어보면 sig 파일이 나타난다.



아래에 libc_arm 이라는 이름으로 넣어둔 sig 파일을 열면 시그니쳐 패칭을 수행하면서 심볼들을 복원한다.


최종적으로 sig 파일이 적용되면 아래와 같이 대부분의 libc 함수명들이 복원된다.






'Programming' 카테고리의 다른 글

Windows PE Structure  (0) 2013.09.12
Linux vmarea structure  (0) 2013.09.11
ARM Soft-MMU implementation  (0) 2013.08.29
Linux Kernel 3.8.x Structure Definitions  (0) 2013.08.28
IDAPython adding System.map symbols to kernel image  (0) 2013.08.14