欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

180826 逆向-巅峰极客第二场(Reverse)

程序员文章站 2022-03-09 21:05:27
...

打开以后只有start函数,找不到main函数
但是看得到一个StartAddress
根据经验可以知道这个命名通常是指CreateThread的入口函数
进去看可以发现它设置了一个事件Hook
SetWinEventHook(1u, 0x7FFFFFFFu, 0, pfnWinEventProc, 0, 0, 2u);
查了一下手册,前两个参数表示Hook的消息ID范围,从1~0x7fffffff也就意味着这个pfnWinEventProc会处理所有消息,基本上也就等同于瞬间的死循环了
通常这种线程会作为反调试,来保证进程全程无被附加

180826 逆向-巅峰极客第二场(Reverse)
调用了两个GetWindowLongA,不知道是干啥的,去查一下
-16 GWL_STYLE 得到窗口风格
-20 GWL_EXSTYLE 得到扩展的窗口风格

进一步加反调试加入关键字
找到了如下示例代码

LONG mStyle = GetWindowLongA(hwnd,GWL_STYLE);
LONG ExtStyle=GetWindowLongA(hwnd,GWL_EXSTYLE);
if(mStyle==0x57c70000&&ExtStyle==0x140)
{
    printf("find od 1 %08x %s\r\n",dwEventThread,name);
}
if (mStyle==0x56CF0000&&ExtStyle==0x140)
{
    printf("Find od 2 %08x %s\r\n",dwEventThread,name);
}

可以看到,是通过窗口风格来针对OD的反调试

而里面的值设置暂时不知道是做什么的,可以先放着不管,标识一下他们的变量名

然后回头通过交叉引用看一下CreateThread的调用者,就能找到main函数
除了这种方法以外,还可以通过字符串索引
虽然运行一下即可发现没有提示字符
180826 逆向-巅峰极客第二场(Reverse)
但是下面这个标志性的内容,很明显是由System(“pause”)造成的
那么我们就可以对system和”pause”这两个东西查看交叉引用,最终同样能找到main函数

这个函数初始是不能F5的,报栈指针错误,实际上是可以通过调整Stack pointer来修复的,当然硬怼汇编也没什么问题
180826 逆向-巅峰极客第二场(Reverse)
可以看到,只是每个输入字符的十位数和个位数分别通过二级指针进行比较

调整Stack pointer的方法则是找到其报错的位置,将其的Stack pointer通过ctrl+k调整至合适的值,通常是0
具体还是要根据它上下代码和栈帧的关系来理解的233
修复以后比较清晰
180826 逆向-巅峰极客第二场(Reverse)
值得注意的是这里第一个dword数组点过去看一下可以发现
180826 逆向-巅峰极客第二场(Reverse)
这个数组的几个值会根据反调线程而被修改,所以求解的时候要注意一下

这里静态dump相对麻烦一些,因为v3v4v5v6v7分别是不同的变量,需要自己合并起来
动态调试的时候可以直接通过下标连续取值,一次到位

在这里下断以后通过脚本即可处理出flag:

Python>for i in range(42):print(chr(((Byte(Byte(0x1092178+i)*4+0x1093018)<<4)+ (Dword(4*Byte(0x1afea8+i)+0x1092138)&0xf)))),
f l a g { 0 6 b 1 6 a 7 2 - 5 1 c c - 4 3 1 0 - 8 8 a b - 7 0 a b 6 8 2 9 0 e 2 2 }