VMProtect Devirtualization - 2

안상준·2025년 8월 12일

VMProtect

목록 보기
6/6
post-thumbnail

https://github.com/JonathanSalwan/VMProtect-devirtualization?tab=readme-ov-file
해당 깃허브를 참고하여 실습을 진행하였다.

실습 과정

  1. 코드에 가상화를 적용
  2. 가상화 시작 주소와 종료 주소 찾기
  3. 해당 주소로 trace 생성
  4. Triton을 이용하여 LLVM-IR 생성

Virtualize

먼저 코드에 가상화를 적용하였다.
위와 같은 cpp코드를 사용하였다. 10과 3을 xor한 결과를 출력하는 코드로 secret 함수를 가상화 난독화 하였다.

실행 결과는 9가 나온다.

VMProtect의 GUI를 이용하여 가상화난독화를 적용하였다.

Analysis

주소를 찾기 위해 IDA Free 9.0을 이용하여 정적 분석과 동적 분석을 진행하였다.

정적 분석 결과 secret함수 호출 부분이 7FF6B58014A9 인 것을 확인할 수 있었고, 해당 부분을 따라가면 가상화 난독화가 적용된 것을 확인할 수 있었다.

동적 분석 결과 함수 호출 주소가 7FF71DAE14A9 인 것을 확인할 수 있었다.

Pintool

Pintool을 이용하여 가상화가 적용된 부분의 trace를 생성해야 한다. 위에서 분석한 결과 함수 호출 부분은 보이지만 확인 결과 IDA를 이용하여 동적으로 분석한 주소와 trace에서 실행한 주소는 서로 다르다. 그렇기 때문에 다른 방법으로 주소를 찾아야 한다.

instruction 찾기

먼저 해당 instruction을 전체 trace상에서 찾는 방법이 있다.

instruction은 E8 A2 FF FF FF이고,

전체 trace에서 해당 instruction의 주소는 0x77f71dae14a9 인 것을 확인할 수 있다.

offset 활용

두 번째 방법은 offset을 이용하는 방법으로 첫 번째 방법보다 해당 방법을 추천한다.

ImageBase주소를 이용하는 방법이 있다.

위에서 IDA를 통해 찾은 주소를 보면 동적이든 정적이든 모두 offset주소는 14A9인 것을 확인할 수 있다. 그렇기 때문에

  • 시작 주소 : 0x7ff71dae0000 + 14A9
  • 종료 주소 : 0x7ff71dae0000 + 14AE

이렇게 주소를 지정해 주었다.

실행

Triton을 실행하기 위해서 trace생성 결과 format을 맞춰 주었다.

실행 결과 위와 같이 trace가 생성되었다.

범위를 지정하여 실행하게 되면
~
이렇게 나오고 해당 범위가 가상화 난독화 로직이 된다.

Triton

마지막으로 Triton을 이용하여 생성한 trace를 LLVM-IR로 lift 해 주었다.
실습 환경은 Linux(Ubuntu 24.04)에서 진행하였다.

IR을 보면 9를 리턴하는 것을 볼 수 있다. 가상화 해제 및 최적화가 잘 이루어 진 것을 볼 수 있다.

0개의 댓글