变量在堆栈上的位置

逆向工程 数据库 动态分析 堆栈变量 指针
2021-06-16 17:25:33

我想创建一个脚本/程序来修改另一个进程的内存中的值。使用 GDB,我发现我想要修改的变量位于堆上。因为这个变量是在每次程序启动时动态创建的,所以它被放置在另一个地址下。我试图在堆栈上找到指向该值的指针,但每个程序开始时指针也在另一个位置。最后,我在主循环中找到了带有断点的变量位置,并从寄存器中读取位置。

有没有更好的方法来找到对脚本有益的变量?

1个回答

我会在创建变量并将其存储到其位置时立即更改变量。例如,如果一个函数调用另一个函数,另一个函数返回变量,第一个函数将它存储在某个地方,这在汇编中看起来有点像

80483e7:       e8 d8 ff ff ff          call   80483c4 <value>
80483ec:       8b 54 24 1c             mov    0x1c(%esp),%edx
80483f0:       89 02                   mov    %eax,(%edx)

where0x1c(%esp)保存指向变量的指针,并且%eax是存储在那里的值。

现在,您只需要一个像这样的 gdb 输入脚本:

break *0x80483f0
run
set $eax=7
cont

和你的程序

gdb myprog < gdb.in

myprog你的程序在哪里gdb.in是上面的脚本。

如果你真的需要在稍后改变变量,程序运行时,做同样的,但更换set $eax=7info registers和输出重定向到一个文件中。然后,当您想要更改变量时,读取该文件,从中解析地址,并使用该地址来存储您的变量。