首页
社区
课程
招聘
[原创] ctf2017第5题分析
2017-6-11 10:25 3014

[原创] ctf2017第5题分析

2017-6-11 10:25
3014

1. 确定大概流程

OD启动,发现有反调试,直接尝试先屏蔽驱动相关的,

运行起来后,断在GetWindowTextA,可以得到输入字符串,然后通过内存访问断点,可以定位到字符串处理和最后的比较点.


 

因为屏蔽了驱动,可以对照IDA看看这个函数流程。

这里是通过WriteFile传入倒序后的字符到驱动,然后通过ReadFile读取返回数据.

可以直接跳过驱动操作,直接跳到401E78,看看对返回数据的处理

先是对驱动返回的0x10数据转字符串,然后再进行MD5,再转字符串,取第3个字符开始的10个字符和目标串比较.

这里,根据传入数据和输出数据,就可以猜测是MD5了,可以直接验证下,都不用具体看算法了,当然里面也有比较明显的特征

 

 

2.  分离驱动文件

通过断在DeleteFileA,或者通过找驱动加载相关的字符串引用点,得道驱动文件vmxdrv.sys

IDA分析,确定主要的处理点

直接看WriteFile的处理,关键点sub_104B6

dword_114D8是操作码222004会影响的变量,交叉引用就可以看到对应设置。

这里是对传入字符串各个字符加了对应增量,如654321变为766666,然后MD5后返回.

 

 

3. 枚举

 

最近对node.js有点兴趣,尝试写了个函数跑了下

 

var fs = require('fs');

var path = require('path');

var Crypto = require('crypto');

const util = require('util');

function ctf_5() {

    var patternBuf = new Buffer("pqrstuvwxyzabcdefghijklmno0123456789");

    var strIn = "123456"; 

    var buf = new Buffer(7);   

    var iLen = patternBuf.length;

    console.log("iLen: " + iLen);

 

    for (var a1 = 0; a1 < iLen; a1++) {

        for (var a2 = 0; a2 < iLen; a2++) {

            for (var a3 = 0; a3 < iLen; a3++) {

                for (var a4 = 0; a4 < iLen; a4++) {

                    for (var a5 = 0; a5 < iLen; a5++) {

                        for (var a6 = 0; a6 < iLen; a6++) {

                            var buf = new Buffer([patternBuf.readUInt8(a1)+1, patternBuf.readUInt8(a2)+1,

                                patternBuf.readUInt8(a3)+2, patternBuf.readUInt8(a4)+3

                                , patternBuf.readUInt8(a5)+4, patternBuf.readUInt8(a6)+5]);

 

                            strIn = buf.toString();

          

                            var md5sum = Crypto.createHash('md5');

                            md5sum.update(strIn);

                            var str = md5sum.digest('hex');

    

                            //对结果串再MD5

                            var md5sum2 = Crypto.createHash('md5');

                            md5sum2.update(str);

                            var str2 = md5sum2.digest('hex');

                        //从第3个字符开始的10个字符,和字符串 ASCII "888aeda4ab" 比较

                            var subStr = str2.substring(2, 2 + 10);

         

                            if (subStr == "888aeda4ab")

                            {

                                console.log(str2);

                                console.log("result" + strIn);

                                return;

                            }                            

                        }

                    }

                }

           

            }

        }

    }

 

    console.log("done");

}

ctf_5();

 

运行结果:

result79;4yx

对应原输入6891us ,倒序就是su1986

 想快点,可以开多个终端分段跑。



[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
点赞2
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回