You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何利用格式化字符串攻击获取C语言全局变量的内存地址?

获取全局变量data的内存地址(格式化字符串攻击场景)

嘿,我来帮你搞定怎么拿到全局变量data的地址,这样你就能用格式化字符串攻击触发那个Print me!输出了。下面是两种简单靠谱的方法:

方法1:用GDB直接调试查看

  1. 先编译你的代码,记得加上调试符号并关闭优化(方便后续操作):
    gcc -g -fno-stack-protector -z execstack -o vuln your_code.c
    
    (-fno-stack-protector关闭栈保护,-z execstack开启栈执行权限,-g添加调试信息)
  2. 启动GDB调试可执行文件:
    gdb ./vuln
    
  3. 在GDB提示符下,直接打印data的地址:
    print &data
    
    你会得到类似这样的输出:$1 = (int *) 0x555555558014,这里的十六进制数就是data的内存地址。
  4. 或者用info variables命令列出所有全局变量,找到data对应的条目,里面也会显示地址。

方法2:从可执行文件的符号表读取(不用启动调试)

如果不想启动GDB,也可以直接用系统工具读取可执行文件的符号表:

  • 用nm工具:
    nm ./vuln | grep data
    
    输出会像0000000000008014 D data,其中开头的十六进制数就是data的地址(D表示该变量在全局已初始化数据段)。
  • 或者用objdump工具:
    objdump -t ./vuln | grep data
    
    同样能找到data对应的内存地址。

拿到地址后,你就可以构造格式化字符串了:把data的地址按小端序拆分成字节放在字符串开头,然后用%x填充到对应的偏移量,最后用%n来修改data的值,让它不等于NUM + 0x5(也就是0x11a+5=0x11f),这样就能触发Print me!的输出啦。

内容的提问来源于stack exchange,提问作者Gardas462

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 14:07:54