在这个例子中,jmpq命令是做什么的

Mic*_*ron 10 terminal assembly gdb att

我们使用gdb调试器来读取汇编函数.

在装配中,我们有以下说明: mov 0xc(%rsp),%eax jmpq *0x402390(,%rax,8)

在内存位置,*0x402390我们有价值0x8e.在寄存器rax中,我们有这个特定函数的第二个整数输入(可以使用变量y).

从我们的分析,我们推断,该功能只在三个变量(x, y, z),他们可以在存储位置找到(rsp),(rsp + 8),(rsp + 12)分别.

我们想知道发生了什么jmpq *0x402390(,%rax,8).是跳到指令(0x8e + rax*8)吗?如果是这样,我们如何才能找出该指令的名称?

这是函数phase_3的汇编代码的完整转储:

完全组装功能

rkh*_*khb 10

GAS手册:

表单的Intel语法间接内存引用

 section:[base + index*scale + disp]
Run Code Online (Sandbox Code Playgroud)

被翻译成AT&T语法

 section:disp(base, index, scale)
Run Code Online (Sandbox Code Playgroud)

其中base和index是可选的32位基址和索引寄存器,disp是可选的位移,而scale,取值1,2,4和8,乘以index来计算操作数的地址.

(https://sourceware.org/binutils/docs/as/i386_002dMemory.html#i386_002dMemory)

所以你可以翻译jmpq *0x402390(,%rax,8)成INTEL语法:jmp [RAX*8 + 0x402390].这是一次"间接"跳跃.地址[RAX*8 + 0x402390]是一个将成为目标的地址jmp.下一步是确定在0x402390 + x处可以找到多少个地址,在这种情况下使用它们.


Cel*_*_Xu 10

炸弹实验室对了哈哈?

此操作jmpq *0x402390(,%rax,8)用于直接跳转到存储在的绝对地址
8 * %rax + 0x402390

如果你x/16gx 0x402390在gdb中做(从十六进制开始检查16个"巨型单词" 0x402390),你会发现一个地址表如下所示:(我有一个不同的实验室,所以它与你的不一样)

 0x402880:  0x0000000000400fee  0x000000000040102b
 0x402890:  0x0000000000400ff5  0x0000000000400ffc
 0x4028a0:  0x0000000000401003  0x000000000040100a
 0x4028b0:  0x0000000000401011  0x0000000000401018
Run Code Online (Sandbox Code Playgroud)

所有这些地址都指向后面的单个mov操作jmpq *0x402390(,%rax,8)

  • @MichaelGofron:在这些年里你都没有接受过这个问题的答案,尽管rkhb给出了正确的答案.如果你接受答案,可能其他人可能不太愿意在几年后添加新的答案?;-) (4认同)
  • 哈哈,自从我发布这篇文章已经四年了,现在离学院差不多两年了:p (3认同)
  • 是的,但现在我什至不记得这是否是我问题的正确答案,因为我已经失去了它如何工作的背景 (2认同)