0

我正在尝试mylib.so使用 capstone c++ 库编写一个库(调用)并LD_PRELOAD查找位于二进制文件中的系统调用指令的位置(该二进制文件包含一些在内联汇编中编写的系统调用),以及这些系统调用是什么(即 SYS_open、SYS_read、 ETC)。

我使用命令LD_PRELOAD=mylib.so <target_program>运行二进制文件并在“运行时”中进行二进制分析,但不是静态的。

我已经能够使用以下方法找到并反汇编系统调用指令libcapstone

...
/* pseudo code */
csh handle;
cs_insn *insn;

cs_open(CS_ARCH_X86, CS_MODE_64, &handle);
cs_option(handle, CS_OPT_DETAIL, CS_OPT_ON);
cs_disasm_iter(handle, &code, &size, &addr, insn);

/* then get operand information from 'insn->detail->x86.operands' */

但问题是如果值移动到 %rax 不是 IMM 操作数,我无法确定它是哪种系统调用。例如,如果反汇编结果是:

/* result is printed by printf(), the syntax may not be correct */
...
mov rax, 39    --> store value 39 to rax
syscall

我可以知道这个系统调用是一个getpid()since __NR_getpid == 39。但是如果反汇编的结果是:

...
// the assembly syntax here may not correct, capstone returns:
// op[0]->type == X86_OP_REG, op[0]->reg == X86_REG_RAX
// op[1]->type == X86_OP_MEM, op[1]->mem.base == X86_REG_RSP, op[1]->mem.disp == 8
mov rax, 0x8(rsp)    --> store value at address sp+8 to rax
syscall

(抱歉上面的汇编代码混淆了,我还在学习汇编)

这是我的想法,如果我错了,请纠正我。我认为应该可以在这个 %rsp 中获取值,因为目标 binray 应该已经映射到内存中(但由于 LD_PRELOAD 尚未运行)。

当我的顶点代码正在执行时,我还假设上面%rsp0x8(%rsp)值不是“当前”堆栈指针的值。

我理解正确吗?mov %rax, 0x8(%rsp)在执行该指令期间,我应该如何获得 RSP 寄存器将包含的地址?

非常感谢您的帮助!

4

0 回答 0