如何利用格式化字符串攻击获取C语言全局变量的内存地址?
获取全局变量
data的内存地址(格式化字符串攻击场景) 嘿,我来帮你搞定怎么拿到全局变量data的地址,这样你就能用格式化字符串攻击触发那个Print me!输出了。下面是两种简单靠谱的方法:
方法1:用GDB直接调试查看
- 先编译你的代码,记得加上调试符号并关闭优化(方便后续操作):
(gcc -g -fno-stack-protector -z execstack -o vuln your_code.c-fno-stack-protector关闭栈保护,-z execstack开启栈执行权限,-g添加调试信息) - 启动GDB调试可执行文件:
gdb ./vuln - 在GDB提示符下,直接打印
data的地址:
你会得到类似这样的输出:print &data$1 = (int *) 0x555555558014,这里的十六进制数就是data的内存地址。 - 或者用
info variables命令列出所有全局变量,找到data对应的条目,里面也会显示地址。
方法2:从可执行文件的符号表读取(不用启动调试)
如果不想启动GDB,也可以直接用系统工具读取可执行文件的符号表:
- 用
nm工具:
输出会像nm ./vuln | grep data0000000000008014 D data,其中开头的十六进制数就是data的地址(D表示该变量在全局已初始化数据段)。 - 或者用
objdump工具:
同样能找到objdump -t ./vuln | grep datadata对应的内存地址。
拿到地址后,你就可以构造格式化字符串了:把data的地址按小端序拆分成字节放在字符串开头,然后用%x填充到对应的偏移量,最后用%n来修改data的值,让它不等于NUM + 0x5(也就是0x11a+5=0x11f),这样就能触发Print me!的输出啦。
内容的提问来源于stack exchange,提问作者Gardas462
相关产品推荐
相关产品推荐

