【发布时间】:2014-01-05 15:28:39
【问题描述】:
所以基本上我要做的就是在我对汇编代码的分析任务中区分数据和内存地址。
这是一个我很难处理的例子。
假设我们在 .data 部分声明了一个变量 val。
0x08048054 01 00 00 00
这里是反汇编ELF文件的一行汇编代码。
mov $0x08048054, %eax
所以这可能是变量val的间接引用,像这样:
mov $0x8048054,%eax
mov %edx,0x4(%esp)
mov %eax,(%esp)
call printf
然后我将 $0x8048054 转换成变量名 val 像这样:
mov val,%eax
mov %edx,0x4(%esp)
mov %eax,(%esp)
call printf
但还有另一种情况,0x8048054 只是在一次计算中用作数字:
mov $0x8048054,%eax
add 0x8(%ebp), %eax
这可能等于(我知道我们在实际代码中几乎看不到这一点,但这是可能的)
b = 0x8048054 + argc;
在这种情况下,我不应该将 $0x8048054 重新写入 val
所以我的想法是,如果我能弄清楚 %eax 寄存器的类型,我大概可以区分这两种情况。
- 对于第一种情况,%eax的类型是指针
- 第二个,类型为整数
我的方法对吗?
谁能帮帮我?
谢谢!
【问题讨论】:
-
检查内存段,如
/proc/self/maps所示。如果它没有指向有效的数据部分,那么它绝对不是指针。如果它指向一个代码部分,它可能是一个函数指针 - 但它们永远不会被取消引用。
标签: c linux assembly x86 disassembly