flag0073
1. 从靶机服务器的FTP上下载flag0073,分析该文件,请提交正确flag的长度。提交格式:XXXX。
进到main函数
可以看到输入不等于38个,就会跳转到wrong flag,所以正确flag的长度为38个
2. 提交程序所使用的算法的名称。提交格式: 0xXXXX。
md5,第五题有讲怎么知道是md5
3. 提交flag正确时的输出。提交格式: 0xXX。
shift+f12可以看到well done!
4. 请用程序所使用的算法计算112233的值,并提交其结果。提交格式: XXXX。
用md5sum计算112233的值即可
5. 提交flag的值。提交格式:XXXX。
在主函数里sub_40182f函数对sub_401864进行了加密操作,长度为0x1061也就是4193
密钥为0x11
可以通过idc脚本进行解密
解密后我们可以看到多了一段汇编语言
我们可以看到汇编语言当中,还call了一次sub_40182f函数来进行解密,而参数是word_40157A的地址以及0x2B5的长度
所以我们解密完第一个函数后,先在函数入口用U转换为数据段,然后再用C转换为汇编,要注意i下面还有一大串的数据段也要用C来转换成汇编代码,然后再在入口按P定义为函数
sub401864函数解密成功,但此时我们并不能反编译40157A我们之前看到汇编里还call了一次解密函数来对word_40157A进行解密,所以我们再次使用IDC脚本以0x40157A作为地址,然后进行解密
再通过上述 同样的操作转换为函数后就可以进行正常反编译了,点进sub40157A函数,可以看到开头就有四个值
这个就是md5算法的特征,所以第三题是md5
而我们看到代码上面有一大串的md5值,众所周知,md5不可逆,只能通过碰撞来解密,那我们在省赛kali下该怎么解这个东西呢?答案是用python3 的hashlib模块加密一个flag的可能组成列表来与里面的md5的值进行碰撞,我们可以将小写a-z和大写a-z以及花括号和0123456789都写进一个字符串里,然后将字符串用hashlib来进行md5加密,加密后再与程序里的md5值一一碰撞。
写出脚本进行解密,hashlist即程序里的那一大串md5值,而list即为我们a-z A-Z 0-9 {} _组成的hash列表,通过两边的值来进行碰撞,确定这些md5原本的值即可,运行脚本即可得到flag