drinkSomeTea drinkSomeTea的附件.zip
看到题目盲猜一波TEA加密,果不其然。之前没好好学,这次至少会做题了,之后有空要好好再看看详细的加密流程。附件给了个tea.png.out,即需要解密图片。
32位exe,无壳
在一开始的sub_401000函数里面,应该是判断是不是调试器(我没仔细看),用调试器的时候会退出程序,直接把call sub_401000 nop掉即可。
应该是一个加密函数,点进去看发现加花了
去花,Create Function,F5,发现是TEA加密,关于TEA加密脚本可以参考这个
魔改一下TEA加密即可,要注意的是,加密的时候需要用int指针(保留符号位),否则加密/解密出来的数据会不对。(我在这个地方调了很久,照着还原一次加密过程,动调的时候发现加密出来的数据怎么都不对)
最后用解密函数解密tea.png.out,脚本如下
1 |
|
得到flag: DASCTF{09066cbb91df55502e6fdc83bf84cf45}
Enjoyit-1 Enjoyit-1的附件.zip
Exeinfope发现是c#写的,用dnspy32位打开
一开始定位加密位置的时候想了一会,emm我最后用Console.WriteLine定位的,其实好像点开就行…
发现应该先是base64验证,中间有Thread.Sleep,然后最后直接输出flag
打开class b的定义,base64换表了
1 | my_base64table = "abcdefghijklmnopqrstuvwxyz0123456789+/ABCDEFGHIJKLMNOPQRSTUVWXYZ" |
然后直接一次性把全部定义都复制到自己新建的一个c#程序,运行一次就跑出来了(而且当然要注释掉Thread.Sleep)
(代码篇幅有点长,抱歉)
1 | using System; |
输入,然后得到flag
flag{4645e180540ffa7a67cfa174cde105a2}
PS:其实这题可能能直接把flag输出出来,但我没试…flag出来了就行
replace replace的附件.zip
64位,无壳
这题一开始难点我预计错了…下次应该好好先把全部函数分析完先。在main可以看出是24位flag,然后sub_401550是验证输入是否为flag格式(即flag{xxxxxx})
sub_401AE7是假的加密函数,因为之后会在sub_401925再覆盖掉所需要验证的字符串
题外话:
把这个解出来之后是fakeflag,但其实出题人粗心了,就算这个题目是这个fakeflag,最后也不对,因为有一项是计算出来是f,但没在f前面加零,416f6b116549435c2c0f1143
再点进sub_401925函数,这里把IsDebuggerPresent hook了,下一次调用IsDebuggerPresent的时候会先调用sub_4015C3
加花了,去花
sub_4015C3开头把hook脱钩了,然后下面进行加密
加密后的byte_4080E0再和416f6b116549435c2c0f1143174339023d4d4c0f183e7828做比较
下面来分析一下加密流程,unk_404020是一个128位的数组,赋值给v0,v2[j] = v0[v2[j]]即换对照表,将对应的char值转成128位数组的 char值位置。for循环1到<=5,即换对照表五次
将换表完成的24个数据,分成六组数据,每一组中的每一位数据占八位bit,再用或运算拼一起,即一组数据为24+8=32bits。当中每一组数据当中的从左往右数前八位为flag[i],再数八位为flag[i+6],以此类推,循环六次。最后再将每一组合成的32bits用sprintf转成十六进制,即8个字符(两个字符占8bits,八个字符占32bits)
按照上述流程逆推即得flag,详细见如下脚本
1 | enflag = "416f6b11 6549435c 2c0f1143 17433902 3d4d4c0f 183e7828" |
得到flag{Sh1t_you_dec0d3_it},题目要求最后md5提交
最终输入4820904ccb9343f00fb7ddf8acc31e85提交
PS: 激动地就要猝死,最后半分钟成功提交flag