RE套路/从EASYHOOK学inline hook

本文通过攻防世界Reverse答题进阶区的一道EASYHOOK,大致了解一下inline hook的流程。

P.S. 查了一下wp大多是直接动态调试看的= =,感觉并不能很深刻地理解hook。看流程其实有两个方法,除了动态识别流程以外,还可以静态分析流程(虽然比较麻烦但能更容易理解?实战的时候还是直接动调吧)。

P.S.S. 本文并非wp,只是记录关键hook部分罢了。

例题:EASYHOOK

环境及工具:win10 + IDA pro

IDA打开,查看主函数流程。

(这里sub_401370可以猜测是输出函数,改名为itsPrint)。

流程大致是:判断输入字符串Buffer长度是否为19,然后走sub_401220(),一路走下来,最后要令NumberOfBytesWritten==1,那么输入就是flag。

一般静态看的话很容易忽略前面的处理函数直接去看sub_401240(),然后发现一无所获(sub_401240()是个烟雾弹函数hhh)。

回头,从sub_401220()看起,发现另有乾坤。

我们可以关注到这个dword_40C9C4和lpAddress

实际上是用来存储WriteFile()的地址,就是即将被hook的函数地址(主函数中这个函数在烟雾弹函数sub_401240()前面一行)。

然后看到下面

-23转成十六进制是0xE9,敏感地注意到这个为jmp的机器码。

而dword_40C9BD的计算方式跟jmp偏移地址的计算方式十分类似。

偏移地址=目标地址-当前地址-5。(5为E9 xxxxxxxx这条指令的长度)

同时!这两个关键变量在内存上还是连续的!

这说明这里很有可能存放着用来hook的跳板指令,用于跳转到sub_401080()。

我们将这里改成aHook1和aHook2。

继续往下走,是return语句调用的sub_4010D0()函数。

在这里我们可以看到,对lpAddress所存储的地址处进行了5字节的权限修改操作,先改成读写再往此处写入以aHook1开头的5个字节(即上面的跳板指令),最后恢复权限,完成修改。

现在程序流程就很明朗了,粗略来看程序流程是CreateFileA->(lpAddress里存的指令)WriteFile->sub_401240,但是在经过sub_401220()的处理以后,变成了CreateFileA->(lpAddress里存的指令)sub_401080->sub_401240。

所以!真正的加密函数,其实是——sub_401080()!

于是exp就可以写出来啦

1
2
3
4
5
6
7
8
9
10
dst=[0x61, 0x6A, 0x79, 0x67, 0x6B, 0x46, 0x6D, 0x2E, 0x7F, 0x5F, 0x7E, 0x2D, 0x53, 0x56, 0x7B, 0x38, 0x6D, 0x4C, 0x6E]
flag=list("-------------------")
flag[-1]=chr(dst[18]^0x13)
for i in range(17,-1,-1):
tmp=dst[i]^i
if i%2==1:
flag[i]=chr(tmp+i)
else:
flag[i+2]=chr(tmp)
print(''.join(flag))

只看加密函数的话第一位其实是被丢失了的(。),可能是在哪里有保存吧没看到,不过很容易猜到是’f’啦。

文章作者: c10udlnk
文章链接: https://c10udlnk.top/2020/12/16/reSkillsOn-Inline-hook/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 c10udlnk_Log