-
-
[原创] ctf2017第5题分析
-
发表于: 2017-6-11 10:25 3673
-
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++) {
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课