pwn2 chunk
自定义的read函数里存在null by one,这里在泄露堆地址和libc地址后,用了free时堆块向上合并制造一个overlap,然后fastbin attack修改__malloc_hook。
1 | #!/usr/bin/python |
pwn4 宇宙超级难搞
这个题目一个栈上的ROP,但是需要注意覆盖时要保持栈上计数变量的值,否则不能连续写入。
1 | from pwn import * |
pwn5 pwn_me
首先使用upx脱壳,一开始是一个base64 decode的算法,需要计算出passcode为"[m]",随后有一个随机数的效验,这里是1/5的概率。
接着有两次格式化字符串漏洞,第一次泄露pie的值,第二次写data段一个数据为0x77。
随后有一个栈上任意长度读入,下面是abs负数漏洞,输入0x80000000可以通过,再次read读入,这里刚好可以覆盖rip,随意第一次读入来泄露canary,第二次去进行rop。
1 | #!/usr/bin/python |
pwn6 shellcode
这个题目要求编写shellcode进行OWR,但是shellcode要求是可见字符,使用工具alpha3可以获得可见字符。
1 | from pwn import * |
re1 babyvm
vm逆向,看懂规则后编写parse脚本:
1 | opcode = [0xF5, 0xF1, 0xE1, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xE2, 0x01, 0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x01, 0x00, 0x00, 0x00, 0xF1, 0xE2, 0x02, 0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4, 0x01, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x02, 0x00, 0x00, 0x00, 0xF1, 0xE2, 0x03, 0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4, 0x02, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x03, 0x00, 0x00, 0x00, 0xF1, 0xE2, 0x04, 0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4, 0x03, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x04, 0x00, 0x00, 0x00, 0xF1, 0xE2, 0x05, 0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4, 0x04, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x05, 0x00, 0x00, 0x00, 0xF1, 0xE2, 0x06, 0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4, 0x05, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x06, 0x00, 0x00, 0x00, 0xF1, 0xE2, 0x07, 0x00, 0x00, 0x00, 0xF1, 0xE3, 0x08, 0x00, 0x00, 0x00, 0xF1, 0xE5, 0x0C, 0x00, 0x00, 0x00, 0xF6, 0xF7, 0xF1, 0xE4, 0x06, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x07, 0x00, 0x00, 0x00, 0xF1, 0xE2, 0x08, 0x00, 0x00, 0x00, 0xF1, 0xE3, 0x09, 0x00, 0x00, 0x00, 0xF1, 0xE5, 0x0C, 0x00, 0x00, 0x00, 0xF6, 0xF7, 0xF1, 0xE4, 0x07, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x08, 0x00, 0x00, 0x00, 0xF1, 0xE2, 0x09, 0x00, 0x00, 0x00, 0xF1, 0xE3, 0x0A, 0x00, 0x00, 0x00, 0xF1, 0xE5, 0x0C, 0x00, 0x00, 0x00, 0xF6, 0xF7, 0xF1, 0xE4, 0x08, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x0D, 0x00, 0x00, 0x00, 0xF1, 0xE2, 0x13, 0x00, 0x00, 0x00, 0xF8, 0xF1, 0xE4, 0x0D, 0x00, 0x00, 0x00, 0xF1, 0xE7, 0x13, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x0E, 0x00, 0x00, 0x00, 0xF1, 0xE2, 0x12, 0x00, 0x00, 0x00, 0xF8, 0xF1, 0xE4, 0x0E, 0x00, 0x00, 0x00, 0xF1, 0xE7, 0x12, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x0F, 0x00, 0x00, 0x00, 0xF1, 0xE2, 0x11, 0x00, 0x00, 0x00, 0xF8, 0xF1, 0xE4, 0x0F, 0x00, 0x00, 0x00, 0xF1, 0xE7, 0x11, 0x00, 0x00, 0x00, 0xF4] |
# print(ans)
随后获得逻辑是异或18,但是这个逻辑是错的,后搜索0xF4,发现不止一个,再次运行脚本获得逻辑如下:
1 | 0 :readflag |
先是一段链式异或,随后三个方程,随后置换位置,逆回去获得flag
Y0u_hav3_r3v3rs3_1t!
re2 pyre
使用工具获得逆向源代码,先是逐字符处理,后链式异或,链式异或逆回去后,逐字节爆破获得flag: GWHT{Just_Re_1s_Ha66y!}
re3 re3
先是一段异或0x99的SMC,后使用MD5进行hash获得了AES的密钥,这里AES加密模式为CBC模式,所以调试获得MD5后的结果,从程序中dump出密文,解密获得flag。
1 | key = [ |
flag{924a9ab2163d390410d0a1f670}
re4 xxor
应该是原题魔改
1 | #include<iostream> |
misc math
使用eval计算,交互getshell。
1 | from pwn import * |
misc fun
剪刀石头布游戏, 首先实验几次判断胜负条件分别为 胜 负 平局, 然后写个exp交互即可
1 | from pwn import * |
crypto warmup
输入一个字符串之后获取签名, 根据签名求出程序中的未知变量x为 x = 6607725413179724508177363550570298402931936301412225532321779846090
然后用这个方程签名admin提交即可.
crypto babyrsa1
p和q接近,分解出n然后再解一个方程获得答案。
1 | #-*- coding:utf-8 -*- |
web1 枯燥的抽奖
随机数预测,给了前十位,查看源码发现使用了不安全的播种函数
http://wonderkun.cc/index.html/?p=585
照着上边的链接直接打就行了
web3 我有一个数据库
扫一下路径,发现有phpmyadmin,还给了版本,找对应版本的洞打就好了
https://blog.vulnspy.com/2018/06/21/phpMyAdmin-4-8-x-LFI-Exploit/
这里一定要吐槽一下,一开始的flag{123456789}交了不对,还以为是假flag,然后搜了半天,下午顺手再交一遍就对了,真实
web4 warmup
给了个laravel,先扫一下路径,给了个robots.txt 然后发现是个逆向,逆一下得到了可以传参z,然后发现没有限制路径访问,可以翻到日志,看了一眼觉得可能是反序列化,搜一搜很容易找到漏洞,反序列化之后可以任意命令执行,于是弹个perl的shell,看了一眼/flag,是假的flag
一般这种情况都是想让你打内网了,在.2发现了一个密码题,给了两组nec,模不互素+共模攻击,但是e不互素,可以用中国剩余定理去解,之前hgame做过类似的题,脚本改一改就好了
1 | import gmpy2 |
#pow(key,e2,n2) == c2