Skip to content
KitploitKITPLOIT
도구익스플로잇블로그
Log in
제출
도구익스플로잇블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

피드문의개인정보© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
pyvex — Valgrind의 VEX IR을 위한 Python 바인딩. | Kitploit
도구/GitHubGitHub/angr/pyvex
Static AnalysisVulnerability AnalysisCode AnalysisReverse EngineeringUtilities & FrameworksBinary AnalysisPapers & Research
GitHubangr/pyvex

pyvex

Valgrind의 VEX IR을 위한 Python 바인딩.

저장소 보기
3811301071일 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

PyVEX

Latest Release Python Version PyPI Statistics License

PyVEX는 VEX IR을 위한 Python 바인딩입니다.

프로젝트 링크

프로젝트 저장소: https://github.com/angr/pyvex

문서: https://api.angr.io/projects/pyvex/en/latest/

PyVEX 설치하기

PyVEX는 pip으로 설치할 수 있습니다:

pip install pyvex

PyVEX 사용하기

import pyvex
import archinfo

# translate an AMD64 basic block (of nops) at 0x400400 into VEX
irsb = pyvex.lift(b"\x90\x90\x90\x90\x90", 0x400400, archinfo.ArchAMD64())

# pretty-print the basic block
irsb.pp()

# this is the IR Expression of the jump target of the unconditional exit at the end of the basic block
print(irsb.next)

# this is the type of the unconditional exit (i.e., a call, ret, syscall, etc)
print(irsb.jumpkind)

# you can also pretty-print it
irsb.next.pp()

# iterate through each statement and print all the statements
for stmt in irsb.statements:
    stmt.pp()

# pretty-print the IR expression representing the data, and the *type* of that IR expression written by every store statement
import pyvex
for stmt in irsb.statements:
    if isinstance(stmt, pyvex.IRStmt.Store):
        print("Data:", end="")
        stmt.data.pp()
        print("")

        print("Type:", end="")
        print(stmt.data.result_type)
        print("")

# pretty-print the condition and jump target of every conditional exit from the basic block
for stmt in irsb.statements:
    if isinstance(stmt, pyvex.IRStmt.Exit):
        print("Condition:", end="")
        stmt.guard.pp()
        print("")

        print("Target:", end="")
        stmt.dst.pp()
        print("")

# these are the types of every temp in the IRSB
print(irsb.tyenv.types)

# here is one way to get the type of temp 0
print(irsb.tyenv.types[0])

이것은 기본 블록의 구문적 표현이라는 점을 명심하세요. 즉, 블록이 무엇을 의미하는지는 알려주지만, 예를 들어 저장 명령어에 의해 실제로 어떤 데이터가 기록되는지 말할 수 있는 컨텍스트는 없습니다.

VEX 중간 표현

매우 다양한 아키텍처를 다루기 위해서는 중간 표현에 대한 분석을 수행하는 것이 유용합니다. IR은 서로 다른 아키텍처를 다룰 때 여러 아키텍처 차이를 추상화하여, 단일 분석을 모든 아키텍처에서 실행할 수 있게 해줍니다:

  • 레지스터 이름. 레지스터의 수와 이름은 아키텍처마다 다르지만, 현대 CPU 설계는 공통된 주제를 따릅니다: 각 CPU에는 여러 범용 레지스터, 스택 포인터를 저장하는 레지스터, 조건 플래그를 저장하는 레지스터 세트 등이 있습니다. IR은 서로 다른 플랫폼의 레지스터에 대해 일관되고 추상화된 인터페이스를 제공합니다. 구체적으로, VEX는 레지스터를 별도의 메모리 공간으로 모델링하며, 정수 오프셋을 사용합니다 (즉, AMD64의 rax는 이 메모리 공간의 주소 16부터 저장됩니다).
  • 메모리 접근. 서로 다른 아키텍처는 메모리에 서로 다른 방식으로 접근합니다. 예를 들어, ARM은 리틀 엔디안과 빅 엔디안 모드 모두에서 메모리에 접근할 수 있습니다. IR은 이러한 차이를 추상화해야 합니다.
  • 메모리 세그멘테이션. x86과 같은 일부 아키텍처는 특수 세그먼트 레지스터를 사용하여 메모리 세그멘테이션을 지원합니다. IR은 이러한 메모리 접근 메커니즘을 이해합니다.
  • 명령어 부작용. 대부분의 명령어에는 부작용이 있습니다. 예를 들어, ARM의 Thumb 모드에서 대부분의 연산은 조건 플래그를 갱신하고, 스택 푸시/팝 명령어는 스택 포인터를 갱신합니다. 분석에서 이러한 부작용을 임시방편으로 추적하는 것은 미친 짓이므로, IR은 이러한 효과를 명시적으로 만듭니다.

IR에는 많은 선택지가 있습니다. 우리는 VEX를 사용하는데, 바이너리 코드를 VEX로 리프팅하는 것이 상당히 잘 지원되기 때문입니다. VEX는 여러 대상 기계 언어에 대한 아키텍처 독립적이고 부작용이 없는 표현입니다. 이는 기계 코드를 프로그램 분석을 더 쉽게 만들기 위해 설계된 표현으로 추상화합니다. 이 표현은 다섯 가지 주요 객체 클래스를 가집니다:

  • 표현식. IR 표현식은 계산되거나 상수인 값을 나타냅니다. 여기에는 메모리 로드, 레지스터 읽기, 산술 연산의 결과가 포함됩니다.
  • 연산. IR 연산은 IR 표현식의 수정을 설명합니다. 여기에는 정수 산술, 부동 소수점 산술, 비트 연산 등이 포함됩니다. IR 표현식에 적용된 IR 연산은 결과로 IR 표현식을 산출합니다.
  • 임시 변수. VEX는 임시 변수를 내부 레지스터로 사용합니다: IR 표현식은 사용 사이에 임시 변수에 저장됩니다. 임시 변수의 내용은 IR 표현식을 사용하여 검색할 수 있습니다. 이러한 임시 변수는 t0부터 시작하여 번호가 매겨집니다. 이러한 임시 변수는 강한 타입을 가집니다 (즉, "64비트 정수" 또는 "32비트 부동 소수점").
  • 명령문. IR 명령문은 메모리 저장 및 레지스터 쓰기의 효과와 같이 대상 기계의 상태 변화를 모델링합니다. IR 명령문은 필요할 수 있는 값에 IR 표현식을 사용합니다. 예를 들어, 메모리 저장 IR 명령문은 쓰기의 대상 주소에 IR 표현식을 사용하고, 내용에 또 다른 IR 표현식을 사용합니다.
  • 블록. IR 블록은 IR 명령문의 모음으로, 대상 아키텍처의 확장된 기본 블록 ("IR Super Block" 또는 "IRSB"라고 함)을 나타냅니다. 블록은 여러 출구를 가질 수 있습니다. 기본 블록 중간에서의 조건부 출구의 경우, 특별한 Exit IR 명령문이 사용됩니다. IR 표현식은 블록 끝의 무조건 출구의 대상을 나타내는 데 사용됩니다.

VEX IR은 실제로 VEX 저장소의 libvex_ir.h 파일 (https://github.com/angr/vex/blob/dev/pub/libvex_ir.h)에 상당히 잘 문서화되어 있습니다. 게으른 분들을 위해, 자주 상호작용할 가능성이 높은 VEX의 일부 부분을 자세히 설명하겠습니다. 먼저, 몇 가지 IR 표현식이 있습니다:

IR 표현식평가된 값VEX 출력 예시
Constant상수 값.0x4:I32
Read TempVEX 임시 변수에 저장된 값.RdTmp(t10)
Get Register레지스터에 저장된 값.GET:I32(16)
Load Memory메모리 주소에 저장된 값으로, 주소는 다른 IR 표현식에 의해 지정됨.LDle:I32 / LDbe:I64
Operation지정된 IR 표현식 인수에 적용된 지정된 IR 연산의 결과.Add32
If-Then-Else주어진 IR 표현식이 0으로 평가되면 하나의 IR 표현식을 반환합니다. 그렇지 않으면 다른 것을 반환합니다.ITE
Helper FunctionVEX는 특정 아키텍처의 조건 플래그 레지스터를 계산하는 것과 같은 특정 연산에 C 헬퍼 함수를 사용합니다. 이러한 함수는 IR 표현식을 반환합니다.function_name()

이러한 표현식은 다음으로 IR 명령문에서 사용됩니다. 다음은 몇 가지 일반적인 것입니다:

IR 명령문의미VEX 출력 예시
Write Temp주어진 IR 표현식의 값으로 VEX 임시 변수를 설정합니다.WrTmp(t1) = (IR Expression)
Put Register주어진 IR 표현식의 값으로 레지스터를 갱신합니다.PUT(16) = (IR Expression)
Store MemoryIR 표현식으로 주어진 메모리 위치를, 역시 IR 표현식으로 주어진 값으로 갱신합니다.STle(0x1000) = (IR Expression)
Exit기본 블록에서의 조건부 출구로, 점프 대상은 IR 표현식에 의해 지정됩니다. 조건은 IR 표현식에 의해 지정됩니다.if (condition) goto (Boring) 0x4000A00:I32

ARM에서의 IR 변환 예시가 아래에 나와 있습니다. 예시에서 뺄셈 연산은 5개의 IR 명령문으로 구성된 단일 IR 블록으로 변환되며, 각 명령문은 적어도 하나의 IR 표현식을 포함합니다 (실제로는 IR 블록이 일반적으로 하나 이상의 명령어로 구성됩니다). 레지스터 이름은 GET 표현식과 PUT 명령문에 주어진 숫자 인덱스로 변환됩니다. 예리한 독자는 실제 뺄셈이 블록의 처음 4개 IR 명령문에 의해 모델링되고, 다음 명령어 (이 경우 0x59FC8에 위치)를 가리키도록 프로그램 카운터를 증가시키는 것이 마지막 명령문에 의해 모델링된다는 것을 관찰할 것입니다.

다음 ARM 명령어:

subs R2, R2, #8

는 다음과 같은 VEX IR이 됩니다:

t0 = GET:I32(16)
t1 = 0x8:I32
t3 = Sub32(t0,t1)
PUT(16) = t3
PUT(68) = 0x59FC8:I32

멋진 것들입니다!

PyVEX 인용하기

학술 작업에서 PyVEX를 사용하는 경우, 이것이 개발된 논문을 인용해 주세요:

@article{shoshitaishvili2015firmalice,
  title={Firmalice - Automatic Detection of Authentication Bypass Vulnerabilities in Binary Firmware},
  author={Shoshitaishvili, Yan and Wang, Ruoyu and Hauser, Christophe and Kruegel, Christopher and Vigna, Giovanni},
  booktitle={NDSS},
  year={2015}
}
도구 다운로드