BeginCTF 2024冬
写的题不多,从师傅们写的特别好的wp们学到了很多,
以下是学习复现后的一些笔记
参考了很多师傅的文章:
RE
real checkin xor
这道题是,因为签到逆向题有点难,出题师傅又出的真真签到题,确实不难。
直接给的就是代码
1 | def verify_func(ciper,key): |
1 |
|
1 | def decrypt_func(encrypted, key): |
红白机
要注意下载的文件名呜呜
# 6502汇编码 直接编译运行
或者自己手搓
偏移为0x200,黑色地方提取画图
1 | screen = [[0] * 32 for _ in range(1000)] |
xor
upx壳+反调试
rdata段:用于从远程服务器获取当前日期和时间的命令行实用程序,通常用于UNIX类操作系统以将系统时钟与远程时间服务器同步。
走弯路做法:分析加密原理,找静态资源
1 |
|
简单粗暴法:异或是可逆的
但是得考虑反调试,要不然出不来,
superguesser(动态调试
a?静态猜测!牛
1 | data = bytearray.fromhex("5151525f59435d5f59495a59562e261d2a371a27291728242a3825213d0f323a3c3d36332a") |
俄语学习
IDA后发现答案都是明文,(但是好多题
最后的求flag才是正菜
flag输入后,内容是要去func2中的tmpStr(明文)比较的,所以需要运行并提取tmpStr加密前后的内容,还有两个盒子以及Str2_0
主要加密是rc4,而且str的加密结果和tmpStr的加密结果是相同的,间接的给出了str的结果
爆破rc4
#硬写。
1 |
|
rc4逆向
1 | t = b"5m5d5w5d5b5n5m5d5w5d5b5n5m5d5w5d5b5n\x8e" |
不经过rc4
对box进行交叉引用可以发现,box和box2其实是相同的
那么rc4加密在使用相同box的前提下,想要得到的密文相同,就必须保证明文在进行rc4加密之前就是相同的,即key和temStr在加密前就是相同的。
这样我们就可以简化成如下步骤:
key = 用户输入 + str2_0 - 112
temStr = +i&[@Y:g8[&l$f8S8v$Y&e>{
str2_0 = unk_6C8E68 - 114
unk_6C8E68就是俄文单词нечего重复3次
几个问答全都没用,看中间关键的几个加密函数
中间涉及到rc4,但是最后用于比对的key2和str1经过同一个S盒的RC4加密,等于没加密
几个长得像key的几个字符串是有用的,排除干扰之后逻辑非常简单
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main()
{
int i;
char rus[38] = "нечегонечегонечего";//37
char key2[26] = "+i&[@Y:g8[&l$f8S8v$Y&e>{";//25
char key1[38] = { 0 };//37
char flag[26] = { 0 };
for (i = 0; i <= strlen(rus); ++i)
key1[i] = rus[i] - 114;
printf("%s %d", key1, strlen(key1));//5m5d5w5d5b5n5m5d5w5d5b5n5m5d5w5d5b5n 37
for (i = 0; i <= strlen(key2); ++i)
flag[i] = key2[i] - key1[i] + 112;
printf("%s", flag);//flag{Russian_is_so_easy}
return 0;
}
Ezpython
考点:sm4,python
pyinstaller打包python生成的exe
pyinstxtractor工具拆包—ezpython.exe_extracted
里面找到ezpython.pyc文件,使用uncompyle6 反编译出源码
uncompyle6.exe .\ezpython.pyc
SM4加密
寻找密文和key进行解密
由于编码问题,使用uncompyle6.exe .\ezpython.pyc > ezpython.py会出现报错
于是将上述反编译出的源码贴进一个自己新建的ezpython.py文件中,把这个文件放进ezpython.exe_extracted文件里,用vscode打开这个文件夹
为了得到key和enc
需要在文件夹里面找到secret.pyc,然后对其进行反编译
uncompyle6.exe .\secret.pyc > .\secret.py
1 | key = 'BeginCTFBeginCTF' |
但是赛博厨子求不出,猜测魔改sm4算法
ezpython.py中导入了sm4库,于是将文件夹内的sm4.pyc进行反编译
uncompyle6.exe .\sm4.pyc > sm4.py
根据题目提示,魔改可能与密钥相关,于是直接查找key
容易发现CryptSM4类下的set_key方法存在魔改
将原始key值异或了37
出题人的密码是什么
#花指令
恢复main函数逻辑
主要加密是一个魔改crc64
通过和零比较,从而进行不同的加密,实际上是比较的最高位
看密文最低位,根据最低位,判断这个数在加密前最高位是1还是0
1 | key = 0x33077d |
同时这个题目里面还有简单的时间反调试
Arc(没学过的(会学的
z3?考点:单字节爆破,混淆
Not main
考点:TEA,XXTEA,VEH异常处理,反调试
veh反调试,全局变量初始化init(没学,继续
EZVM(不太会
vm题 c++
Goforfun(不会
考点:go语言,rc4魔改,单字节爆破
go语言编写的程序,go 1.21
可以装一个idagolanghelper插件帮助恢复符号表
恢复之后确定主函数就需要动调
Babyvm(不太会,留着
考点:vm,二进制文件读写,z3
主程序逻辑不难,难点在如何批量处理指令和数据,附上打印汇编语言的脚本
1 |
|
汇编有点长主逻辑就只是一个线性方程式,用z3一把梭,这个留给大家自己尝试了
stick game
修改得分(web题?
考点:Js,ob混淆
想法:https://linmur.top/post/beginctf-2024-reverse-writeup/
真龙之力(不会
java?贴个题解
https://www.yuque.com/u37581038/mrtw91/be9vb75fxnmah7s5?singleDoc#Fw1my
考点:XTEA,Mobile,Mobile调试
MISC
tupper
用这个网站讲附加拼接的字符串转化为图片,即得到flag https://tuppers-formula.ovh/
又学到了一种加密方式。。
devil’s word
看附件:
1 | leu lia leu ng leu cai leu jau leu e cai b cai jau sa leng cai ng ng f leu b leu e sa leng cai cai ng f cai cai sa sa leu e cai a leu bo leu f cai ng ng f leu sii leu jau sa sii leu c leu ng leu sa cai sii cai d |
看题目”魔鬼的语言”,搜一下猜想是温州话,其实就是温州话的0-9发音,单个字母就表示单个字母(无语了,当时没想到)。根据温州话的发音,得到这个对应关系:
1 | leng 0 |
赛博厨子解码得到flag
你知道中国文化吗1.0
文本24个字符分一组→base32解码→八卦转8进制→8进制转字符串→字符串转社会主义编码→社会主义解码→字符串栅栏解密得到最后的flag。
八卦对应数字:
☰ 0
☱ 1
☲ 2
☳ 3
☴ 4
☵ 5
☶ 6
☷ 7
其中base32解码脚本:
1 | import base64 |
这题麻烦的地方就是有的分组里面有特殊字符 $ & @,这些特殊字符需要替换成大写英文字母或者数字才能正确编码,这里的一个思路就是找有没有相似的分组,将特殊字符替换成对应位置的字符即可。(一个特殊字符替换成多个字符都有可能正确解码为八卦符,但是这样好像并不影响结果)
下一站上岸!
题目描述: 某同学在考公的时候看到这样一道题,发现自己怎么也找不到图形的共同特征或规律你能帮帮他吗?
给的图片:
zsteg图片,发现隐写内容:
即: 5o+Q56S6OuaRqeaWr+WvhueggQ==
base64解密得到(base64编码由a-zA-Z0-9+/组成):
根据每个图形的交点数得到: 221022201122120120111011110222012101
将0替换成’ ‘ 1替换成’.’ 2替换成’-‘再解码得到flag
(至于为什么这么替换一共6种情况可以fuzz一下)