SWPUCTF_2020 Writeup
Web
一道也不会,我太难了
Misc
耗子尾汁
- 通过binwalk在gif中分离出视频:2^4_2^5_2^6.mp4
- 通过binwalk在上述视频中分离出压缩包。
- 通过肉眼看到视频中有一帧中有base64编码的文本 解密得到:sign_in
- 用解压密码解压压缩包,得到19_20.txt R1pCVE9OUlhHVTNES05SWkdZWVRNUVJYSEEzVEtOUlVHNFpUT09KWEdFM0RLTlJZRzRaVE9RSlhHRTNEUU5aWkdaQkRNTlpXRzQzVEdOWlpHNDRUTVFaV0lJM1RNTlpXR1k0UT09PT0=
//The last layer is the single table replacement password 5. base64解码 得到: GZBTONRXGU3DKNRZGYYTMQRXHA3TKNRUG4ZTOOJXGE3DKNRYG4ZTOQJXGE3DQNZZGZBDMNZWG43TGNZZG44TMQZWII3TMNZWGY4Q==== 6. base32解码 得到: 6C76756569616B7875647379716568737A7168796B67677379796C6B767669 7. 16进制转字符串 得到: lvueiakxudsyqehszqhykggsyylkvvi 8. 根据提示使用:quipqiup网站进行解码: 和题目要求flag格式:xxx_xxxx_xxxxxx_xx _xxxxxxxxxxxx进行比较,发现多了四位,猜测前四位内容为flag。 解密后得到flag为flag{you_have_signed_in_successfully}
套娃
- 下载得到文件,修改扩展名为zip
- 解压出RC4data.txt文件和swpu.xls文件
- RC4data.txt内容为:U2FsdGVkX19uI2lzmxYrQ9mc16y7la7qc7VTS8gLaUKa49gzXPclxRXVsRJxWz/p
- 把swpu.xls修改为swpu.zip
- 解压出RC4key.zip文件和easyrc4.xlsx文件
- 发现RC4key.zip文件有密码,在easyrc4.xlsx文件的末端找到密码,password:6e4c834d77cba03af41e1562a5bce84e
- 利用密码进行解压,得到RC4key.txt,内容为:ABCDEFGHIJKLMNOPQRSTUVWXYZ
- RC4解密,得到ef1a73d40977a49b99b871980f355757,flag{ef1a73d40977a49b99b871980f355757}
找找吧
- 下载得到压缩包find.rar
- 在压缩包的末尾找到内容,key is PPPaAaS
- 解压压缩包得到文件findme.mp3和secret.rar文件
- 修改findme.mp3文件名为findme.zip,解压得到采茶纪.mp3和哈哈哈.png文件
- 发现采茶纪.mp3末尾有一段莫斯密码,听取并记录
- 得到:-.. ….- …– —-. -…. …– . —-. ..— -… —– .—- ..— .- .- -…
- 解密得到:D43963E92B012AAB
- 在https://www.somd5.com/ 上搜索得到解密结果:n1ce_try
- 解压压缩包得到hint.png和is_this_the_flag.gif文件
- 提取gif文件中的每一帧,发现有一帧中有内容:bFyd_W1l3_Cah
- 修改hint.png的长度,发现提示Veni,Vidi,Vici,百度搜索得到此内容意思为凯撒。
- 对bFyd_W1l3_Cah依次进行移位,解密得到:sWpu_N1c3_Try
- flag{sWpu_N1c3_Try}
来猜谜了
- 使用Stegsolve工具对图片进行Data Extract处理,勾选0位,发现开头是PK,提取文件为压缩包。
- 使用WinRAR修复压缩包,得到压缩包文件内容。
- 提取出pcap文件中键盘输入的内容,得到内容
ag dx ag dx ag dx output :AG DX AG DX AG DX - AG DX AG DX AG DX,猜测是ADFGX密码,相关介绍可以看 https://xz.aliyun.com/t/3603 这个链接,中有详细介绍,但是这道题没有进行任何的移位操作。
- 我们利用下面的密码表进行解密,得到内容:gogogo
- 使用outguess对图片进行解密,key = gogogo outguess -k gogogo -r mi.jpg flag.txt 这正好也印证了题目来猜谜了。
- 解密得到flag{Out9uEsS_1s_V4rY_e4sy}
Crypto
happy
|
|
|
|
代码:
|
|
Yusa的密码学课堂—CBC第一课
|
|
CBC bit翻转攻击 CBC模式中,多了一个iv(Initialization Vector)变量。 在CBC模式下,明文分组并与前一组密文进行异或操作,第一组明文与IV变量进行异或操作。 这样异或操作后再进行加密,而我们利用的就是这个。 基础原理还是看一下其他地方的吧,我也算是略知一二,在表述上还是不太在行。
|
|
c是密文,m是明文,position传入要修改的位置,target传入要修改变成的内容。 这道题由于可以控制iv数组,而且在登录的时候也会把翻转过的内容后,内容不正确的明文显示出来。 这样我们可以再利用这个攻击技巧,计算出对应的iv数组,再次进行攻击!
|
|
Yusa的密码学课堂—ECB
|
|
ECB与CBC相比,每次加密都是按组加密的,这样的话,我们可以构造payload,按字节爆破并且验证是否正确。 看着脚本中输出的flag三角形,真的是成就感满满呢。
|
|
这个脚本只需要修改fun函数就可以用在其他地方,具有通用性。
PWN
shellco
- 当名字为8个字节的时候,可以栈溢出,溢出到一个偏移地址。
- 偏移地址指向的是接下来可以写入的次数,默认是0xA,也就是十次,但是我们的目的是利用不断的写入来最终覆盖掉结尾处的
jmp qword ptr unk_600489
- 写入读入了0x10个字节,但是只能实际只能写0x8个字节,但是每次堆栈都会往上抬0x10个字节,所以直接在栈上构造shellcode的话需要避免大于0x8个字节,否则就会去执行0x00对应的汇编,不过大概也可以把eax变成一个有效值执行。
- 写入shellcode后再不断写入,最后覆盖到返回地址。
- shellcode的参数可以利用程序开头的
mov r12, offset aBinSh ; "/bin/sh"
这样的话就可以构造很短的shellcode了
|
|
|
|
tnote
- 利用off by one修改size达到chunk overlapping的效果。
- Leak堆地址,利用这个计算出tcache struct的位置。
- 利用overlapping修改在tcache中的chunk的next指针指向到对应链表头部
- 修改头部指针为0x90 size的counts对应位置,修改为0xFF
- free 0x88大小的size,0x88是不能申请的,利用off by one来修改伪造出size位:0x91
- 由于counts对应0XFF > 0x7,所以不进入tcache,进入了unsorted bin
- unsorted bin attack得到main_arena + 96
- 计算出
__malloc_hook
的地址,利用LibcSearcher来计算得到libc基址。 - 计算出
__free_hook
,修改为system - free(sh) => system(sh)
|
|
得到flag:flag{heaP_Ee_equal_1sy} 待补充…
Reverse
RealEzRE main函数主要干了这几件事情:
- 创建互斥体:
|
|
- 检查是否有参数:
|
|
- 检查是否在调试
通过,
__rdtsc
取出时间运行周期,来判断是否有下断点调试,因为如果下断过的话,运行时间会较长。 绕过方法:直接在下面的部分下断。 - 解密shellcode,并用VirtualProtect修改权限。
- 执行shellcode 到这里的时候,我们可以尝试dump程序并对dump出的内容进行分析。
shellcode部分:
|
|
这里似乎是未优化过的,类似于下面的代码,把a1的内容赋值到了v11中,并且a1的下标从1开始。 a1的内容就是参数1的内容。
|
|
一个不会执行的int3断点
|
|
接下来是:
|
|
rc4_init是我分析后修改的,原因是里面的代码和rc4的初始化代码相似。
|
|
通过分析可知,v3为key内容。
|
|
可以看出,初始化代码对字符数组s进行了初始化赋值。且赋值分别递增,之后又对s进行了236次交换操作。通过识别初始化代码,可以判断为RC4算法。
网上常见的RC4算法初始化代码如下所示:
|
|
这里的区别就在于不把key储存在map中,而选择在超过key长度的时候让指针从头开始。
|
|
这里的a2就是key长度,v7可以理解为index。
又是一个debug检测,绕过即可(修改Z标志位)。
|
|
接下来就是加密的内容:
|
|
这里就是依次加密然后再进行比较,比较过程是。 前十三字节,后六字节,中间十三字节。 所以我们只需要把对应的内容提取出来,然后再对这个内容进行RC4解密即可。 调试过程中提取得到:
|
|
最后写程序RC4解密:
|
|
顺便一提RC4加密解密过程是一样的,所以如果你不会写这个解密程序,可以在调试过程中把输入的字节替换成最后比对的字节,然后让程序加密后(解密),得到的内容就是应该要输入的内容,这样的做法还可以解决少量魔改的问题。 运行程序得到解密结果。 把解密结果输入程序:
最终flag:flag{f379eaf3c831b04de153469d1bec345e} 比赛的时候还是来不及做了,这道题是今天早上花了两三个小时做出来的。 strangeapk
|
|
其中encryption为凯撒加密。 经过调试可知凯撒加密的key=8。 其中调用了两个native函数,stringFromJNI,getint 我们这里只关心前者,因为后者被调试输出了。
|
|
发现对我们传入的字符进行异或加密之后与一个数据进行比较,
a[i] ^ key == b[i]
经过调试可知,key = 40,编写程序。
|
|
得到输出为:
\R\U\_\Q\o\@\|\}\g\K\%\g\K\U\K\C\f\$\F\s\K\R\%\$\s\i
进行凯撒移位 (26 - 8 = 18)
得到:\Z\C\_\Y\w\@\|\}\o\S\%\o\S\C\S\K\n\$\N\a\S\Z\%\$\a\q
这道题我比赛的时候没做出来,因为我看到有个hook.so。而且在异或测试的时候,发现异或出来一个内容为。 然后我以为hook.so在运行的时候把这段内存修改掉了。结果之后调试才发现并不是(比赛的时候没发现查看log的方法)。 对了,查看log的指令:adb logcat