메뉴 닫기

Reversing Rust binaries like a semi-pro

요즘 CTF에서 Rust문제가 많이 나오는데, 분석이 너무 힘들더라고요. -_-

 
Go언어 분석을 해보셨던 분들은 아마 위 게시글을 한번쯤 보았을텐데요, IDA 스크립팅을 이용해서 Go언어 분석을 쉽게 해주는 내용입니다. 저 게시글을 보고 영향을 받아서 저는 Rust 분석을 쉽게 해주는 스크립트를 만들었습니다.
(예전에 서로이웃글로 소개만 한적 있었는데, 추가된 기능도 있고, 홍보 목적도 있으니(?) 자세하게 적어봅니다.)

 

https://github.com/cha5126568/rust-reversing-helper

설명 : 현재 5가지 기능이 구현되어 있는데요, 시그너쳐 로딩(FLIRT 아닙니다.), 문자열 복구, 디맹글링(주로 strip 되지 않은-DWARF 정보가 살아있는-), 인자 복구, 사용자 함수 찾기 가 구현되어 있습니다.
 
시그너쳐 로딩의 경우 Signature maker\parse.py로 생성된 시그너쳐를 로딩하는데, parse.py 는 DWARF 정보가 살아있는 Rust 바이너리의 symtab 으로 부터 정보를 가져와 ( (인스트럭션 크기 – 인스트럭션의 첫번쨰 바이트 – 인스트럭션의 마지막 바이트)순으로, 함수별 시그너쳐를 만들고 sha256 해시를 한 것) 딕셔너리에 저장하고 출력하는 역할을 합니다. 좌우지간에 parse.py 로 생성된 시그너쳐를 IDA에 적용하는 역할을 하는게 시그너쳐 로딩 기능입니다.

 
(ASIS CTF 2018 right_or_left 바이너리 입니다.)
이런식으로 FLIRT 와 함께 사용하면 이런식으로 대부분의 함수의 본디 이름이 나옵니다.3
 
문자열 복구의 경우, 다닥다닥(?) 붙어 있는 문자열을 때고, 문자열을 사용하는곳에 주석으로 그 문자열을 달아주는 기능입니다.
<before>

<after>
 
사용자가 정의한 함수와 특정 섹션를 쭉 스캔해서 문자열을 찾고 MakeStr 하는 원리 입니다.
 
디맹글링 기능은 rustfilt에 의존합니다. 함수 이름들을 rustfilt 에 pipe로 주고 결과를 받아오는 형태입니다.

인자 복구 기능은 IDA에서 잘못 잡아 주는 인자를 제대로 잡아주는 역할을 합니다만, 그리 완벽하진 않습니다.

내부적으론 rdi,rsi,rcx,rdx,r8,r9,xmm0,xmm1,xmm2,xmm3 이 mov에서 두번째 오퍼랜드로 쓰였으나(혹은 push에 쓰였으나), 앞에서 그 레지스터에 접근하는 인스트럭션이 없을 경우 등을 카운팅해서 인자 갯수를 결정합니다.

(안쓰는것 보다는 좋다고 할 수 있습니다만, 가끔 인자를 잘라먹는 경우가 있으니, 주의하시길 바랍니다..)

 

 
끝으로 사용자 함수 찾기 기능은 특정 함수 사이에 있는 함수들의 주소를 출력하는 기능입니다. 여러 바이너리로 테스트 해보니 잘 작동합니다.
<사용법> 
https://github.com/luser/rustfilt

 

1. "cargo install rustfilt" 를 통해 디맹글링 해주는 프로그램을 설치합니다.

https://github.com/cha5126568/rust-reversing-helper

<풀리퀘 환영!!>
 
2. 위 링크를 git clone 을 하던 뭘 하던 다운로드 받고, Signature.rust 와 rust_reversing_helper.py 그리고 분석하려는 파일을 같은 디렉토리에 둡니다.
 
3. rust_reversing_helper.py를 열어 _demangle 함수에 적혀있는 rustfilt의 경로를 수정합니다.

 

 
4. main 함수에서 원치 않는 기능에 주석을 치거나(몇몇 기능이 불완전 하니, 이 부분은 개인 선택) 시그너쳐를 다른 시그너쳐로 바꿉니다.
(Signature.rust 파일은 제가 올린 파일을 쓰는것 보다는, 분석하려는 프로그램과 같은 라이브러리(라고 해야하나?)를 사용하는 깡통 프로그램을 하나 만드신후 parse.py 를 사용해 시그너쳐를 추출한다음, 그 시그너쳐를 쓰는게 더욱 좋은 결과를 얻습니다.)

 
5. IDA에서 Shift+F5 를 누르고, rust_x64_elf.sig 파일을 불러옵니다.
 
6. IDA에서 스크립트를 불러오고, 실행되는 동안 잠시 기다립니다!
 
7. 즐거운 리버싱!

User xrefs chart 에서 "To library functions" 를 체크하고 그래프를 그려보면..

 

 

이렇게 전체적인 구조를 먼저 파악하고 분석을 할 수 있습니다.

 

2 Comments

댓글 남기기

이메일은 공개되지 않습니다.