- 몇몇 정보는 확실치 않을 수 있으니 참조만 하시기 바랍니다.
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 |