0.前言
福师大那边举办的比赛,PWN的难度不大,很适合我这种小朋友玩,AK PWN自然不在话下。
1.PWN
1-1.ReorPwn?
nc,然后传入“hs/nib/”即可获取shell。
1-2.ezpie
给了后门函数,给了主函数地址,能算出程序基地址,过于简单,直接贴exp:
1 | from pwn import * |
1-3.shop_pwn
一道条件竞争题,其中买和卖都会创建线程。
一开始将flag读入到缓冲区中:
漏洞点在to_sale函数中,to_sale函数由sale函数创建线程调用,但是其存在usleep函数,因此线程存在延迟:
思路是短时间内调用两次sale,使得两个线程产生竞争,从而使得一些条件失效,最终产生的效果就是不减少物品的情况下“卖出”该物品(刷钱),使得获取的金钱足够购买flag。
exp如下:
1 | from pwn import * |
这里有一点需要注意,如果我选择接收到“> ”后再发送数据的话,本地是打得通的,但是远程不行。(注:根据官方wp的解释,这可能是因为网络延迟。)所以这里我选择不接收数据直接发送。
1-4.ezstack
32位程序ret2libc没什么好说的,记得对齐栈就行。
exp如下:
1 | from pwn import * |
1-5.ezheap
简单到不能再简单的堆溢出,我甚至都不想去gdb动态调试它。
直接放exp:
1 | from pwn import * |
1-6.UAF
不难的UAF,只可惜一开始想复杂了。
在create函数里可以看到创建的第0页的作用,其中fd为传入的参数,fd+4为调用的函数的地址。
正常情况下edit函数不允许我们修改第0页堆块的数据。
show函数专门规定了第0页会调用fd+8的地址处的函数,并将fd的内容作为参数传给被调用的函数。
正常的情况下是会调用echo函数打印出“giao”。
漏洞点在del函数,存在UAF漏洞。
因此思路就是先申请page 0,释放掉堆块,再申请。这样由于tcache管理机制,我们再次申请得到的page 1其对应的堆块和page 0的堆块是同一内存区域。这样我们就可以将page_0->fd和page_0->fd+4的内容改掉。由于page 0的指针未清空,因此我们仍然可以调用show(0),这样系统就会调用被我们改掉的函数。而程序又很好心地给了我们后门函数。
exp如下:
1 | from pwn import * |
2.RE
2-1.ezpython
要反编译exe为python,我们提取src和struct为pyc。
比较两个发现src缺少前12位,将struct的前12位补到src。
用在线工具反编译为python。
得到的py源码如下:
1 | #!/usr/bin/env python |
根据源码编写脚本即可获取flag:
1 | #!/usr/bin/env python |
2-2.sign-ezc++
在.data段找到flag:
追踪可以找到调用的函数:
很明显是异或了10。
编写逆程序即可获取flag:
1 |
|
2-3.string
这题我是用非预期解出来的。由于flag的生成用到了伪随机数,并且种子据出题人说是忘了加密了,因此可以直接生成flag。
程序是ELF,放脚本:
1 | from ctypes import * |
运行即可生成flag: