我可以进行二进制污点分析吗?

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)