본문 바로가기

Project/Group. Surplus

[작성중] example 예제 정리



- 몇몇 정보는 확실치 않을 수 있으니 참조만 하시기 바랍니다.



callback_before,py / callback_after.py



callback_before / after 예제에서는 instruction 아규먼트로부터 얻을 수 있는 정보들에 대한 예제가 담겨 있다.

instruction 의 경우는 before 에 하든 after 에 하든 내용에 변화가 없다.

instruction struct 는 src/binding/python/objects/PyInstruction.cpp 에 정의되어 있다.




* Class Instruction from Inst
*
* - address (integer)
* - assembly (string)
* - baseAddress (integer)
* - imageName (string)
* - isBranch (bool)
* - offset (integer)
* - opcode (integer)
* - opcodeCategory (IDREF.OPCODE_CATEGORY)
* - operands ([Operand])
* - routineName (string)
* - sectionName (string)
* - symbolicExpressions (list of SymbolicExpression)
* - threadId (integer)




* Class Instruction from Irb (IRBuilder)

*
* - address (integer)
* - assembly (string)
* - baseAddress (integer)
* - imageName (string)
* - isBranch (bool)
* - offset (integer)
* - opcode (integer)
* - opcodeCategory (IDREF.OPCODE_CATEGORY)
* - operands ([Operand])
* - routineName (string)
* - sectionName (string)
* - symbolicExpressions (list of SymbolicExpression)
* - threadId (integer)



address 

- instruction 의 주소(RIP)

assembly 

- 어셈블리 구문. 그냥 string 형태로 되어 있다.

참고로, 나는 처음 디스어셈블리 파싱해서 레지스터를 체크하려고 했는데 굳이 그럴 필요 없다.

baseAddress

- 이미지베이스

imageName 

- 파일의 경로 + 이름

isBranch 

opcodeCategory == IDREF.OPCODE_CATEGORY.COND_BR

offset

- 이미지베이스로부터의 상대주소 

opcode (https://github.com/JonathanSalwan/Triton/wiki/IDREF-OPCODE)

- IDREF.OPCODE 에서의 인덱스

opcodeCategory (https://github.com/JonathanSalwan/Triton/wiki/IDREF-OPCODE_CATEGORY)

- IDREF.OPCODE_CATEGORY 에서의 인덱스


operands (https://github.com/JonathanSalwan/Triton/wiki/Class_Operand)

- 오퍼랜드에 대한 정보들을 담고 있는 Operand 클래스의 리스트.


type (https://github.com/JonathanSalwan/Triton/wiki/IDREF-OPERAND)

- 오퍼랜드의 타입으로, register / immediate / memory read / memory write / lea 가 있다.

조건문을 구성할 때 타입을 먼저 체크하고, register 일 경우 value 를 보고 어떤 레지스터인지 판단한다.


value(https://github.com/JonathanSalwan/Triton/wiki/IDREF-REG)

- type 값에 의존적인 값이다. type 이 register 일 경우, 이 value 는 IDREF.REG 의 인덱스가 되고

immediate 일 경우 일반 숫자가 들어있다.

e.g: mov eax, 51 -> op0.value = IDREF.REG.RAX and op1.value = 51


size

- 마찬가지로 type 에 의존적이다. register 의 경우 레지스터의 크기가, 그 외의 경우 명령어에 따라 다르다. 

e.g: mov rax, byte ptr [rdx] -> op0.size = 8 and op1.size = 1


operand.baseReg

-

operand.displacement

-

operand.indexReg

-

operand.memoryScale

-




routineName

- 현재 인스트럭션의 함수명

sectionName

- 파일 경로/이름이 나오는데 imageName 이랑 뭐가 다른가.. 원래는 .text 와 같이 섹션이름이 나온다고 한다.

symbolicExpression

- 변화된 값들의 심볼릭 값들을 보여줌. 

threadID

- 스레드 ID


before / after 에서 바뀌는 값을 체크하려면 실제로 getRegValue 나 getMemValue 로 얻어와야 한다.

getRegValue(IDREF.REG.RAX)

getMemValue(uint64 mem, uint32 readSize)

이런식이다.


symbolicExpression 의 경우는 Triton 에서 사용하고 있는 심볼릭 형태에 대한 조사가 조금 더 필요하다.

(https://github.com/JonathanSalwan/Triton/wiki/Class_SymbolicExpression)






callback_routine.py / callback_syscall.py


callback_routine 과 callback_syscall 은 후킹의 개념으로 사용할 수 있다.

routine 은 함수명을 지정할 수 있고,

callback_syscall 은 실행 중에 나타나는 모든 시스템 콜을 기록한다. strace 와 거의 동일.

callback_routine 예제에서 나타나듯, testSuite 바이너리에서 malloc 을 후킹함으로써 UAF 를 확인할 수 있다.

testSuite 바이너리에 대해 callback_syscall 예제를 적용하면 BRK 시스템 콜이 일어나는 것을 확인할 수 있다.

BRK 는 malloc 의 내부 동작이다.




get_expression.py / get_model.py / taint_reg.py / taint_rundime_memory.py


get_expression.py 는 2015 07 16 시점에 없어진 코드.

expression 을 구하는 것은 getAst() 함수로 바뀌었다. 







'Project > Group. Surplus' 카테고리의 다른 글

Triton 에서의 테인트와 심볼릭에 관해  (0) 2015.07.21
triton struct IDREF  (0) 2015.06.21
Triton & panda  (0) 2015.06.06