2022蓝帽杯初赛 pwn wp
pwn还挺有意思的,第一题写shellcode,第二题能逆就能pwn
2022蓝帽杯初赛 pwn wp
蓝帽杯2022 pwn escape_shellcode
写shellcode题
只允许使用read和write,但是程序在开始的时候将flag读取到了bss段上
并且在调用shellcode之前还将寄存器的值都给清理掉了。
因为程序开了pie所以直接使用flag地址行不通。那就需要思考一下如何泄露出flag地址。
这里可以借助fs寄存器来得到有关text段的地址,再算出flag地址即可。
fs寄存器用于保存线程局部存储TLS,TLS主要是为了避免多个线程访问同一全局变量或静态变量所导致的冲突。所以fs寄存器周围会有线程地址。在笔者调试的时候发现在0x300这里有一个栈地址,跟进发现里面放着有关text段的地址
算出flag偏移
拿到flag地址之后直接write打印出来即可。exp如下
1 | from pwn import * |
解法肯定不止上面这一种,还有一种解法可以利用write遇到不写读的内存时会返回值小于0这个特性来解,我们可以先将rsi放到基址前面也就是根本没有这块内存的地方也就是小于下图的0x555555554000
然后利用条件判断,每次rsi加上0x500,一直这样直到可以正常读的地址也就是0x555555554000后面。此时就应该在0x555555554000 - 0x555555554500附近,而flag在0x555555558120,我们只需要再让rsi为0x4000这样我们就可以拿到flag了,exp如下
1 | from pwn import * |
蓝帽杯2022 pwn Bank
保护全开
这道题其实逆清楚了基本就可以解出来了
这里是输入对应的单词就可以进入对应的功能
先看一下Deposit功能
先判断是否login,接着输入多少钱,然后判断一下card_money钱是否足够,如何足够则总钱+输入的,这个函数没什么用。
看一下put函数
这里就是需要存放的钱,判断是否小于总钱。并将需要存放的钱放入card_money中
接下来再看login函数
输入card_numbers,需要过检测
长度大于0,并在0-9之间,接下来输入密码的时候长度需要大于5,也是0-9
满足上面的条件即可login成功
info函数就是打印这两个东西
Transfer这个功能很重要
首先还是输入什么单词进入什么功能。
先是admin功能
这里可以进行越界读因为没有限制a1,但是a1必须大于30
hacker这个函数就是任意地址释放
guest申请了0x18大小的堆,并可以写入0x10个数据
ghost这里可以申请小于0x100大小的堆,需要特别注意的是这里使用的是realloc函数
而abyss这个功能可以一次任意写并exit退出
所以我们可以劫持exit_hook来getshell。首先需要泄露出heap地址。这个很好办,前面利用了realloc这个函数,所以我们可以借助realloc来free出堆地址。
上图红色的是借助realloc来free出堆地址,而粉色的是vuln_addr,admin这个功能可以从vuln这里往后读到最后一个红框的堆地址。
0x421这个是为了泄露出libc地址做准备。
继续利用realloc往后走,将距离0x420后的prev改成0x420这样利用hacker来free 0x55555575a2c0这个地址时候可以绕过检查
到了这一步直接admin来泄露的话还不行因为i还小于30,所以想个办法将下面的堆合并一下使得i大于30可以利用admin泄露出来。
泄露出libc之后再次利用hacker将vuln_addr地址释放掉,这样再利用guest的时候可以将vuln_addr给劫持到exit_hook这里。接着利用abyss将exit_hook改成one_gadget即可getshell
1 | from pwn import * |