Tribal 2018. 6. 20. 13:29

코드 : https://github.com/Tribal1012/mipsHex


목적 : Mips 바이너리의 어셈블리어를 IDA Python을 이용해 C언어처럼 변환시켜, 최대한 어셈블리어를 적게 보고 빠르게 분석할 수 있도록 한다.


사용 방법

  1. IDA를 켜고 mips 바이너리 열기
  2. File - Run Script - hex-ray.py
  3. mips 바이너리 경로의 함수 명과 동일한 이름의 파일 확인
  4. 분석


파일별 설명(Proto version)

  • hex-ray.py : main 함수
  • base
    • asm.py : 어셈블리의 기본적인 정보를 담는 class 선언
    • asmutils.py : 어셈블리의 기본적인 정보를 변경 또는 뽑아내고자 할 때 사용
    • error.py : 오류 메시지 출력, assert 사용
    • function.py : hex-ray를 통해 함수를 생성하는데 필요한 정보를 저장
    • Iasm.py : 특정 어셈블리에 맞는 메소드를 호출하기 위한 외부로 공개되는 인터페이스
    • register.py : 레지스터 정보를 담는 class 선언
  • mipsHex
    • asm_type
      • all.py : import를 축약하기 위해 사용
      • mips_asm_arithmetic.py : mips의 사칙연산 어셈블리어
      • mips_asm_bits.py : mips의 비트연산 어셈블리어
      • mips_asm_branch.py : mips의 분기 어셈블리어
      • mips_asm_etc.py : 종류를 정의하기 어려운 어셈블리어 모음
      • mips_asm_jump : mips의 강제 분기 어셈블리어
      • mips_asm_load : mips의 레지스터에 읽어들이는 어셈블리어
      • mips_asm_move : mips의 레지스터간 값 이동 어셈블리어
      • mips_asm_set : mips의 상황별 값 설정 어셈블리어
      • mips_asm_store : mips의 메모리에 쓰는 어셈블리어
    • mips_asm : mips 어셈블리의 기본적인 정보를 담은 class 선언, base.asm.py를 상속
    • mips_asmutils : mips 어셈블리의 utils 제공, base.asmutils.py를 상속
    • mips_function.py : mips 전송 hex-ray를 통해 생성되는 함수에 대한 정보를 저장하기 위해 사용, base.function.py 상속
    • mips_Iasm.py : mips의 타입별 어셈블리를 확인하여 메소드 호출 인터페이스 제공, base.Iasm.py 상속
    • mips_register.py : mips에서 사용되는 레지스터 관리, base.register.py 상속


주의 사항

  • Exception 발생시 IDA를 한번 끈 후, Exception을 수정해야 한다. 안 끄면 수정해도 적용이 안 된다.
  • 분기의 흐름을 따르지 않고 함수의 시작과 끝을 그대로 따라가기 때문에 완전 신뢰하지 말고 주석으로 나오는 내용을 검토하는게 좋다.
  • argument register의 내용만을 인자로 참고하기 때문에 Stack에 저장된 인자는 체크하지 못 한다. 인자가 많은 함수의 경우, 함수 호출 전에 var_로 시작하는 지역 변수에 저장되는 값들이 있는데 이 값이 인자이다.