-
-
[原创]第十三届信安大赛部分题目WP
-
发表于: 2020-10-12 14:19 3999
-
这个帖子的格式出了问题,改起来麻烦了,可以参考我博客相同的文章
根据这道题给出的文件查看其16进制即可得到flag。
点击下载题目从这道提给出的文件中可以看出,存在一个flag.txt文件,但是被删除了,且在trashinfo可以看到删除之前在misc01目录下
所以使用工具恢复即可。但是根据题目,这个应该是一个linux的磁盘dump文件,所以先挂载到虚拟机中查看本身存在哪些文件,挂载后有三个文件,一个是提示flag被删掉的图片,一个是假flag文件,还有一个demo文件,使用extundelete工具恢复后可以得到被删除的flag.txt。不过该文件内容应该是被加密过的,和demo有关,分析demo,其中核心逻辑比较简单就是从文件中读取字符,然后进行异或和加操作,其中v4和v5的初值是34和0,文件中要求打开一个名为deom的文本,但该文本不存在,所以根据flag.txt中的16进制逆出算法即可。
下面为python编写的解密脚本
分析程序后可以看到有大量的多项式运算,且根据题目名称提示,使用z3编写脚本计算出解即可得到flag。
hyperthreading
这道题代码比较简单,创建了三个线程,执行了连个函数,其中一个线程执行的函数是一个简单的反调试,其处理方法是把其最后执行的exit函数nop掉或者把test ax,ax
改为xor ax,ax
,让其函数返回值恒为0即可。
处理过反调试后,观察另一个线程函数,这个函数中存在一定的干扰,有混淆和异常,单步调试会走到有一步存在空地址,直接执行会崩掉,所以这里找到存放输入字符串的地址,在存放输入flag的内存处加一个内存断点,让程序执行,根据断点程序停到了真正的主要逻辑部分,其分析如下
因为算法涉及到移位,不能逆算法,但是由于是单表加密,所以爆破起来也比较简单,下面是解密脚本,运行后根据flag格式加上{}即可。
把程序放进idapro中分析,程序结构相对比较复杂,但其实逻辑还是比较简单的。动态调试后何以找到主要逻辑所在的函数,其主要在图中所示的函数中。
进入函数后,在这里可以看出flag长度的要求,是38位,不是则会直接跳过flag处理部分
接着往下分析,可以看到执行了malloc函数开辟了一块内存空间,然后把地址给了ax,再赋给dx
然后对输入字符串进行遍历,并讲结果存放在分配好的内存dx中
接着往下分析,下面的分析如图
在遍历了输入字符串后,与内存中给定的数据进行异或,然后把异或运算的结果存入上面dx的下一位,也就是输入字符串的后面,然后把上一次运算的地址在dx后偏移4位存入,再把上面分配额地址dx放入到变量var30中,进行下一次遍历,所以上面变量var30中赋给ax的地址就是上一次遍历分配的内存地址,即上一次的存储地址,最后把这一次的地址赋给上面备份的var30(上一次的地址)后偏移8位,也就是说整个再内存中存储额是一个双向链表结构,首先存储输入字符串的其中一位,下一位是异或运算后的字符串,接着存储上一个模块的地址和下一个模块的地址。
截止到这里程序的运算逻辑就结束了,所以只要把内存中运算后的flag数据和上面用来异或的数据运算即可的到flag。解密脚本如下
把题目放进ida中分析,通过字符串可以直接找到主要逻辑所在的位置,在输入了字符串后,程序对比了输入字符串的长度,要求其长度为32位,否则直接输出错误。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)