buu page5 [SUCTF2019]Akira Homework
查壳不说了,ida开64位,进入main,里面已经手动改了一些函数名字
进入func1看一下
好了都看不明白,上动调。这个时候习惯看一下导出,发现tls
知识点搜搜就知道了,直接改一下执行流跳转绕过就行
有虚函数表
能发现三个虚函数:
其中一个的密钥脚本解出,另外两个题目告诉我们了,106和0
1 | data1=[0x11, 0x45, 0x14, 0x49, 0x86, 0x64, 0x40, 0x50, 0x60, 0xC1, 0x39, 0x2D, 0x00, 0x00, 0x00, 0x00] |
这时候往下跟进,StartAddress里面的一个作为参数的函数
创建共享内存(CreateFileMappingW 函数用于创建一个内存映射文件对象,MapViewOfFile 函数用于将内存映射文件对象映射到当前进程的地址空间),给了一堆数据,然后有“MZ”的格式判断。生成dll文件。
脚本dump一下dll:
1 |
|
dll的逻辑很简单,上python解aes:
1 | from Crypto.Cipher import AES |
flag{Ak1rAWin!}
总结:
最开始有tls反调试,改一下执行流,然后main函数逐一分析
第一个是虚函数表的三个函数,指向Protector::ProcessCheckHandler` 类的虚函数表的指针,三个虚函数均对长度为19456的一大串数据进行了修改
第二个是创建线程函数beginthreadex,跟进StartAddress,有一个函数编号10001函数(发现sub_7FF6EB3B8300和sub_7FF6EB3B6C10两个成对出现)前面虚函数有三个,所以猜测一下另两个虚函数也有这两个函数的调用,对6C10交叉引用发现符合猜想,三个虚函数的密钥分别是106 0 Akira_aut0_ch3ss_!
StartAddress往下跟进函数,发现向apc队列添加函数,跟进这个函数,发现了里面有创建共享内存+写入密文+PE格式判断(文件头MZ)。生成dll后就是一个标准的aes,密钥给了,密文在原来的文件内存有写
感觉这道题就是函数要一个个看,一个函数有一个逻辑,最后串在一起。难点一个是过反调试;一个是要看出虚函数表那几个函数做了什么操作,那一大串数据是一个文件,共享内存的函数,apc队列;最后就是怎么写脚本把dll文件dump出来
题外话:
写wp的时候已经做完这道题好久了,只是简单复制一下当时做完题的思路总结,并没有写的很详细(懒得放图了),可以结合网上其他师傅的wp食用
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 大鹅のBlog!
评论