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语法间接内存引用
Run Code Online (Sandbox Code Playgroud)section:[base + index*scale + disp]被翻译成AT&T语法
Run Code Online (Sandbox Code Playgroud)section:disp(base, index, scale)其中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)
| 归档时间: |
|
| 查看次数: |
31899 次 |
| 最近记录: |