System/Reversing

Taint Analysis ( IDA lighthouse & FRIDA )

pyozzi 2020. 4. 17. 00:53

Taint Analysis란, 프로그램이 동작하면서 실행되는 코드의 흐름을 파악하는 분석 기술이다.

 

좀 더 직관적으로 설명하면, 실행되는 Instruction마다 색을 칠해놓고 전체적인 결과를 보면 실행된 Instruction만 색이 칠해져 있을 것이다. 실제 코드가 실행되는 부분을 파악할 수 있기 때문에 분석할 때 엄청난 이점이 될 수 있다.

 

IDA의 lighthouse은 DBI툴로 얻은 Taint Analysis결과를 코드블럭에 표시해주는 플러그인이다.

lighthouse와 호환되는 DBI툴은 PIN, DynamoRIO, FRIDA가 있으며, 그 중 FRIDA를 사용하는 방법을 소개하려고 한다.

 

PIN툴은 Intel아키텍처에서만 지원되고, DynamoRIO는 MacOS 64bit를 지원하지 않는 것 같다.

반면에 FRIDA는 환경설정도 굉장히 간편하고, 무엇보다 모든 플랫폼(Android, iOS, Windows, MacOS)을 지원하기 때문에 범용성이 우수하다.

우리 모두 FRIDA를 사용하자.

 


lighthouse

lighthouse는 IDA와 Binary Ninja Plugin을 지원한다. 나는 Windows환경에서 IDA7.0 Pro로 진행하였다.

 

lighthouse는 https://github.com/gaasedelen/lighthouse 에서 다운받을 수 있다.

 

 

[그림 1] lighthouse

 

 압축을 풀면 위와 같은 파일들을 볼 수 있다.

저 중 plugin폴더의 파일들을 복사해서 IDA Plugins 경로에 붙여넣어 준다.

 

 

[그림 2] IDA Path

 

나는 "%APPDATA%\Hex-Rays\IDA Pro\plugins"에 넣어줬고, 경로를 잘 모르겠다면 [그림 2]처럼 IDA 콘솔에서 알아낼 수 있다.

os.path.join(idaapi.get_user_idadir())

위 결과로 나온 위치에 plugins 폴더를 생성하고 그 안에 파일들을 넣어주면 된다.

 

 

[그림 3] %APPDATA%\Hex-Rays\IDA Pro\plugins

 

여기까지 진행하면 lighthouse플러그인 설정은 끝났다.

실제로 적용됐는지 확인하려면 IDA에 프로그램을 로드하고 [File]-[Load file]-[Code coverage file...]이 추가됐는지 확인하면 된다.

 

 

[그림 4] IDA lighthouse

 

 


FRIDA

 

pip install frida 또는 python -m pip install frida

먼저 FRIDA가 설치되어 있지 않다면 위 명령어로 FRIDA를 설치해준다.

여기서 주의할 점이 lighthouse의 frida Script는 python2.7에 맞춰져있다.

따라서, python2.x에 FRIDA모듈을 설치해줘야 한다.

 

 

[그림 5] usage frida-drcov.py

 

설치가 완료되면 coverage/frida경로에 위치한 frida-drcov.py를 사용하면 된다.

-t 옵션은 특정 Thread를 지정할 수 있고, -o는 결과파일을 지정해줄 수 있다.

 

python frida-drcov.py [PROCESS NAME or PID]

가장 기본적인 사용법은 위처럼 사용해주면 된다. 결과파일은 frida-cov.log로 저장된다.

 

 

[그림 6] FSViewer.exe

 

나는 Faststone Image Viewer를 타겟팅하여 진행하였다.

 

 

[그림 7] frida-drcov.py Execute

 

나처럼 Process Name을 입력해도 되고, PID인 24900을 입력해도 된다.

스크립트가 정상적으로 실행되면 Process의 모든 Thread를 모니터링하면서 Taint Analysis가 시작된다.

이렇게 스크립트를 실행해놓고 프로그램에서 원하는 테스트케이스를 진행해주면 된다.

 

이미지를 로드한다던가, 특정 기능을 실행한다던가 등등.. 분석하고자 하는 기능을 사용하면 스크립트에서 Taint된 Instruction들을 기록해두었다가 결과파일로 저장해줄 것이다.

 

 

[그림 8] frida-drcov.py Done

 

스크립트 종료는 ctrl+c 또는 ctrl+d로 인터럽트를 걸어주면 Process에서 Detach하고 기록한 Instruction들을 로그파일로 저장한다.

-o옵션으로 결과파일을 지정해주지 않았으면 frida-cov.log로 저장되어 있을 것이다.

이제 이 파일을 lighthouse에 로드해주면 실행된 코드블럭들을 확인할 수 있다.

 


lighthouse - Load Coverage file

 먼저 타겟 프로그램을 IDA에 로드해주고, 구문 분석이 완료된 idle상태가 되면 아래 과정을 진행한다.

 

 

[그림 9] Load Code Coverage File

 

[File]-[Load file]-[Code coverage file...] 메뉴를 선택한 뒤, 생성된 log파일을 IDA에 로드해준다.

 

 

[그림 10] Taint Code Block

 

나는 프로그램의 테스트케이스를 많이 만들지 않아서 적은 부분이 Taint이 되었다.

프로그램의 실행흐름이 위와 같이 색으로 칠해져서 실제로 어떤 Instruction이 실행되었는지 한눈에 확인이 가능하다.

 

 

[그림 11] Hex-rays Decompile

 

IDA의 진가가 여기서 발휘된다.

Decompile상태에서도 실행된 부분을 확인할 수 있기 때문에 더욱 직관적인 분석이 가능하다.

 

규모가 큰 프로그램을 분석해야 하거나, Fuzzing을 위해서 정확한 실행흐름을 분석해야 할 때 꽤나 큰 도움을 받을 수 있다.

실제로 분석에 사용해본 결과, Taint된 Instruction의 정확성도 상당히 신뢰할만 한 것 같다.

 

그리고 실행된 코드블럭이 많으면 저장하는데 시간도 꽤 걸린다.

여유있게 1시간정도는 기다려보다가 그래도 정상적으로 종료가 안된다면 프로세스를 종료해보자.