我正在尝试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 尚未运行)。
当我的顶点代码正在执行时,我还假设上面%rsp
的0x8(%rsp)
值不是“当前”堆栈指针的值。
我理解正确吗?mov %rax, 0x8(%rsp)
在执行该指令期间,我应该如何获得 RSP 寄存器将包含的地址?
非常感谢您的帮助!