我可以进行二进制污点分析吗?
Can I do binary taint analysis?
我想分析以下二进制文件。
4005e0: 55 push %rbp
4005e1: 48 89 e5 mov %rsp,%rbp
4005e4: 48 83 ec 10 sub [=10=]x10,%rsp
4005e8: c7 45 fc 09 00 00 00 movl [=10=]x9,-0x4(%rbp)
4005ef: c7 45 f8 00 00 00 00 movl [=10=]x0,-0x8(%rbp)
4005f6: c7 45 f4 00 00 00 00 movl [=10=]x0,-0xc(%rbp)
4005fd: 83 7d f4 0a cmpl [=10=]xa,-0xc(%rbp)
400601: 0f 8d 2a 00 00 00 jge 400631 <func_1+0x51>
400607: 8b 45 f4 mov -0xc(%rbp),%eax
40060a: 3b 45 fc cmp -0x4(%rbp),%eax
40060d: 0f 85 0b 00 00 00 jne 40061e <func_1+0x3e>
400613: 8b 45 f4 mov -0xc(%rbp),%eax
400616: 89 45 f8 mov %eax,-0x8(%rbp)
400619: e9 13 00 00 00 jmpq 400631 <func_1+0x51>
40061e: e9 00 00 00 00 jmpq 400623 <func_1+0x43>
400623: 8b 45 f4 mov -0xc(%rbp),%eax
400626: 83 c0 01 add [=10=]x1,%eax
400629: 89 45 f4 mov %eax,-0xc(%rbp)
40062c: e9 cc ff ff ff jmpq 4005fd <func_1+0x1d>
400631: 8b 75 f8 mov -0x8(%rbp),%esi
400634: 48 bf a4 08 40 00 00 movabs [=10=]x4008a4,%rdi
40063b: 00 00 00
40063e: b0 00 mov [=10=]x0,%al
400640: e8 1b fe ff ff callq 400460 <printf@plt>
400645: 89 45 f0 mov %eax,-0x10(%rbp)
400648: 48 83 c4 10 add [=10=]x10,%rsp
40064c: 5d pop %rbp
40064d: c3 retq
我已经Triton试过了,但是movl(movq)等访问内存的指令没有反汇编,分析失败
我想知道如何输出可以被 Triton 或其他污点分析工具分析的二进制文件。
源代码(我用clang编译的。)
void func_0()
{
int src = 9;
int dest = 0;
for (int i = 0; i < 10; ++i) {
if (i == src) dest = i;
}
printf("%d\n", dest);
}
Triton 的代码如下。
from __future__ import print_function
from triton import *
import sys
function = {
0x400570: b"\x55", # push %rbp
0x400571: b"\x48\x89\xe5", # mov %rsp,%rbp
0x400574: b"\x48\x83\xec\x10", # sub [=12=]x10,%rsp
0x400578: b"\xc7\x45\xfc\x09\x00\x00\x00", # movl [=12=]x9,-0x4(%rbp)
0x40057f: b"\xc7\x45\xf8\x00\x00\x00\x00", # movl [=12=]x0,-0x8(%rbp)
0x400586: b"\xc7\x45\xf4\x00\x00\x00\x00", # movl [=12=]x0,-0xc(%rbp)
0x40058d: b"\x83\x7d\xf4\x0a", # cmpl [=12=]xa,-0xc(%rbp)
0x400591: b"\x0f\x8d\x25\x00\x00\x00", # jge 4005bc <func_0+0x4c>
0x400597: b"\x8b\x45\xf4", # mov -0xc(%rbp),%eax
0x40059a: b"\x3b\x45\xfc", # cmp -0x4(%rbp),%eax
0x40059d: b"\x0f\x85\x06\x00\x00\x00", # jne 4005a9 <func_0+0x39>
0x4005a3: b"\x8b\x45\xf4", # mov -0xc(%rbp),%eax
0x4005a6: b"\x89\x45\xf8", # mov %eax,-0x8(%rbp)
0x4005a9: b"\xe9\x00\x00\x00\x00", # jmpq 4005ae <func_0+0x3e>
0x4005ae: b"\x8b\x45\xf4", # mov -0xc(%rbp),%eax
0x4005b1: b"\x83\xc0\x01", # add [=12=]x1,%eax
0x4005b4: b"\x89\x45\xf4", # mov %eax,-0xc(%rbp)
0x4005b7: b"\xe9\xd1\xff\xff\xff", # jmpq 40058d <func_0+0x1d>
0x4005bc: b"\x8b\x75\xf8", # mov -0x8(%rbp),%esi
0x4005bf: b"\x48\xbf\xa4\x08\x40\x00\x00", # movabs [=12=]x4008a4,%rdi
0x4005c6: b"\x00\x00\x00",
0x4005c9: b"\xb0\x00", # mov [=12=]x0,%al
0x4005cb: b"\xe8\x90\xfe\xff\xff", # callq 400460 <printf@plt>
0x4005d0: b"\x89\x45\xf0", # mov %eax,-0x10(%rbp)
0x4005d3: b"\x48\x83\xc4\x10", # add [=12=]x10,%rsp
0x4005d7: b"\x5d", # pop %rbp
0x4005d8: b"\xc3", # retq
}
if __name__ == '__main__':
# Triton context
ctx = TritonContext()
# Set the architecture
ctx.setArchitecture(ARCH.X86_64)
# Symbolic optimization
ctx.enableMode(MODE.ALIGNED_MEMORY, True)
# Define the Python syntax
ctx.setAstRepresentationMode(AST_REPRESENTATION.PYTHON)
# Define entry point
pc = 0x400570
# Setup stack
ctx.setConcreteRegisterValue(ctx.registers.rsp, 0x7fffffff)
ctx.setConcreteRegisterValue(ctx.registers.rbp, 0x7fffffff)
# Let's emulate the function
while pc in function:
# Build an instruction
inst = Instruction()
# Setup opcode
inst.setOpcode(function[pc])
# Setup Address
inst.setAddress(pc)
print(hex(pc))
# Process the instruction
ctx.processing(inst)
# Next instruction
pc = ctx.getConcreteRegisterValue(ctx.registers.rip)
sys.exit(0)
错误如下。
TypeError: x8664Cpu::disassembly(): Failed to disassemble the given code.
操作码 "\x48\xbf\xa4\x08\x40\x00\x00"
无效。您必须提供 "\x48\xbf\xa4\x08\x40\x00\x00\x00\x00\x00"
。补丁如下:
--- a.py 2019-07-17 21:28:25.828014823 +0200
+++ b.py 2019-07-17 21:27:25.988013339 +0200
@@ -29,8 +29,7 @@
0x4005b4: b"\x89\x45\xf4", # mov %eax,-0xc(%rbp)
0x4005b7: b"\xe9\xd1\xff\xff\xff", # jmpq 40058d <func_0+0x1d>
0x4005bc: b"\x8b\x75\xf8", # mov -0x8(%rbp),%esi
- 0x4005bf: b"\x48\xbf\xa4\x08\x40\x00\x00", # movabs [=10=]x4008a4,%rdi
- 0x4005c6: b"\x00\x00\x00",
+ 0x4005bf: b"\x48\xbf\xa4\x08\x40\x00\x00\x00\x00\x00", # movabs [=10=]x4008a4,%rdi
0x4005c9: b"\xb0\x00", # mov [=10=]x0,%al
0x4005cb: b"\xe8\x90\xfe\xff\xff", # callq 400460 <printf@plt>
0x4005d0: b"\x89\x45\xf0", # mov %eax,-0x10(%rbp)
我想分析以下二进制文件。
4005e0: 55 push %rbp
4005e1: 48 89 e5 mov %rsp,%rbp
4005e4: 48 83 ec 10 sub [=10=]x10,%rsp
4005e8: c7 45 fc 09 00 00 00 movl [=10=]x9,-0x4(%rbp)
4005ef: c7 45 f8 00 00 00 00 movl [=10=]x0,-0x8(%rbp)
4005f6: c7 45 f4 00 00 00 00 movl [=10=]x0,-0xc(%rbp)
4005fd: 83 7d f4 0a cmpl [=10=]xa,-0xc(%rbp)
400601: 0f 8d 2a 00 00 00 jge 400631 <func_1+0x51>
400607: 8b 45 f4 mov -0xc(%rbp),%eax
40060a: 3b 45 fc cmp -0x4(%rbp),%eax
40060d: 0f 85 0b 00 00 00 jne 40061e <func_1+0x3e>
400613: 8b 45 f4 mov -0xc(%rbp),%eax
400616: 89 45 f8 mov %eax,-0x8(%rbp)
400619: e9 13 00 00 00 jmpq 400631 <func_1+0x51>
40061e: e9 00 00 00 00 jmpq 400623 <func_1+0x43>
400623: 8b 45 f4 mov -0xc(%rbp),%eax
400626: 83 c0 01 add [=10=]x1,%eax
400629: 89 45 f4 mov %eax,-0xc(%rbp)
40062c: e9 cc ff ff ff jmpq 4005fd <func_1+0x1d>
400631: 8b 75 f8 mov -0x8(%rbp),%esi
400634: 48 bf a4 08 40 00 00 movabs [=10=]x4008a4,%rdi
40063b: 00 00 00
40063e: b0 00 mov [=10=]x0,%al
400640: e8 1b fe ff ff callq 400460 <printf@plt>
400645: 89 45 f0 mov %eax,-0x10(%rbp)
400648: 48 83 c4 10 add [=10=]x10,%rsp
40064c: 5d pop %rbp
40064d: c3 retq
我已经Triton试过了,但是movl(movq)等访问内存的指令没有反汇编,分析失败
我想知道如何输出可以被 Triton 或其他污点分析工具分析的二进制文件。
源代码(我用clang编译的。)
void func_0()
{
int src = 9;
int dest = 0;
for (int i = 0; i < 10; ++i) {
if (i == src) dest = i;
}
printf("%d\n", dest);
}
Triton 的代码如下。
from __future__ import print_function
from triton import *
import sys
function = {
0x400570: b"\x55", # push %rbp
0x400571: b"\x48\x89\xe5", # mov %rsp,%rbp
0x400574: b"\x48\x83\xec\x10", # sub [=12=]x10,%rsp
0x400578: b"\xc7\x45\xfc\x09\x00\x00\x00", # movl [=12=]x9,-0x4(%rbp)
0x40057f: b"\xc7\x45\xf8\x00\x00\x00\x00", # movl [=12=]x0,-0x8(%rbp)
0x400586: b"\xc7\x45\xf4\x00\x00\x00\x00", # movl [=12=]x0,-0xc(%rbp)
0x40058d: b"\x83\x7d\xf4\x0a", # cmpl [=12=]xa,-0xc(%rbp)
0x400591: b"\x0f\x8d\x25\x00\x00\x00", # jge 4005bc <func_0+0x4c>
0x400597: b"\x8b\x45\xf4", # mov -0xc(%rbp),%eax
0x40059a: b"\x3b\x45\xfc", # cmp -0x4(%rbp),%eax
0x40059d: b"\x0f\x85\x06\x00\x00\x00", # jne 4005a9 <func_0+0x39>
0x4005a3: b"\x8b\x45\xf4", # mov -0xc(%rbp),%eax
0x4005a6: b"\x89\x45\xf8", # mov %eax,-0x8(%rbp)
0x4005a9: b"\xe9\x00\x00\x00\x00", # jmpq 4005ae <func_0+0x3e>
0x4005ae: b"\x8b\x45\xf4", # mov -0xc(%rbp),%eax
0x4005b1: b"\x83\xc0\x01", # add [=12=]x1,%eax
0x4005b4: b"\x89\x45\xf4", # mov %eax,-0xc(%rbp)
0x4005b7: b"\xe9\xd1\xff\xff\xff", # jmpq 40058d <func_0+0x1d>
0x4005bc: b"\x8b\x75\xf8", # mov -0x8(%rbp),%esi
0x4005bf: b"\x48\xbf\xa4\x08\x40\x00\x00", # movabs [=12=]x4008a4,%rdi
0x4005c6: b"\x00\x00\x00",
0x4005c9: b"\xb0\x00", # mov [=12=]x0,%al
0x4005cb: b"\xe8\x90\xfe\xff\xff", # callq 400460 <printf@plt>
0x4005d0: b"\x89\x45\xf0", # mov %eax,-0x10(%rbp)
0x4005d3: b"\x48\x83\xc4\x10", # add [=12=]x10,%rsp
0x4005d7: b"\x5d", # pop %rbp
0x4005d8: b"\xc3", # retq
}
if __name__ == '__main__':
# Triton context
ctx = TritonContext()
# Set the architecture
ctx.setArchitecture(ARCH.X86_64)
# Symbolic optimization
ctx.enableMode(MODE.ALIGNED_MEMORY, True)
# Define the Python syntax
ctx.setAstRepresentationMode(AST_REPRESENTATION.PYTHON)
# Define entry point
pc = 0x400570
# Setup stack
ctx.setConcreteRegisterValue(ctx.registers.rsp, 0x7fffffff)
ctx.setConcreteRegisterValue(ctx.registers.rbp, 0x7fffffff)
# Let's emulate the function
while pc in function:
# Build an instruction
inst = Instruction()
# Setup opcode
inst.setOpcode(function[pc])
# Setup Address
inst.setAddress(pc)
print(hex(pc))
# Process the instruction
ctx.processing(inst)
# Next instruction
pc = ctx.getConcreteRegisterValue(ctx.registers.rip)
sys.exit(0)
错误如下。
TypeError: x8664Cpu::disassembly(): Failed to disassemble the given code.
操作码 "\x48\xbf\xa4\x08\x40\x00\x00"
无效。您必须提供 "\x48\xbf\xa4\x08\x40\x00\x00\x00\x00\x00"
。补丁如下:
--- a.py 2019-07-17 21:28:25.828014823 +0200
+++ b.py 2019-07-17 21:27:25.988013339 +0200
@@ -29,8 +29,7 @@
0x4005b4: b"\x89\x45\xf4", # mov %eax,-0xc(%rbp)
0x4005b7: b"\xe9\xd1\xff\xff\xff", # jmpq 40058d <func_0+0x1d>
0x4005bc: b"\x8b\x75\xf8", # mov -0x8(%rbp),%esi
- 0x4005bf: b"\x48\xbf\xa4\x08\x40\x00\x00", # movabs [=10=]x4008a4,%rdi
- 0x4005c6: b"\x00\x00\x00",
+ 0x4005bf: b"\x48\xbf\xa4\x08\x40\x00\x00\x00\x00\x00", # movabs [=10=]x4008a4,%rdi
0x4005c9: b"\xb0\x00", # mov [=10=]x0,%al
0x4005cb: b"\xe8\x90\xfe\xff\xff", # callq 400460 <printf@plt>
0x4005d0: b"\x89\x45\xf0", # mov %eax,-0x10(%rbp)