攻防世界Reverse进阶区-流浪者-writeup

本题为较为基础的Hook题,通过本writeup来整理一下思路。

main函数

image-20220122143740757

进入程序,首先确定flag字符串长度为19

然后发现程序会将输入内容写入文件名为文件Your_input的文件;

最后通过核验NumberOfBytesWritten变量是否为1来控制输出;

此时,若进入sub_401240函数就会中计,需手动进行测试。

image-20220122144439005

手动测试后发现输出文件中的内容和输入完全不同,推测可能在sub_401220函数中对输入进行了加密。

sub_401220函数:

进入sub_401220函数:(为hook关键函数)

image-20220122144907695

其主要内容如下(1~14行):

获取当前进程号,打开进程到hprocess,libfilename为一常量kernel32.dll,procname为一常量writefile,故dword_409c4(*WriteFile_0位置)、lpaddress所存为writefile的地址,然后程序复制了lpaddress的地址到unk_40c9b4。

然后开始hook操作(15、16行):

可以看到第15行有一常量被存入地址40C9BC,H键转化为十六进制 0xE9

然后在地址40C9BD存入了函数sub_401080与IpAdress的距离再减去5,即sub_401080与WriteFile函数的距离。

总结来说,将writeFile函数的前五个字节替换为了跳转到sub_401080的语句。

回到main函数后,在调用WriteFile函数时,实际调用的是sub_401080,因此进入sub_401080

sub_401080函数:

image-20220122152116398

可以看到,此函数内容为,先调用sub_401000,返回值V5;

然后再在内部调用WriteFile函数;

最终根据V5的值,判断第四个指针参数lpNumberOfBytesWritten的值,此处的lpNumberOfBytesWritten参数,即对应main函数中的NumberOfBytesWritten关键参数。

因此,推测sub_401000函数为对于输入的核心判断函数,步入查看:

sub_401000函数:

image-20220122153313662

输入为a1;a2为固定值19;

然后下面的逻辑简单的说就是先加密a1,然后比较数组a1每一位的值和储存在 byte_40A030处每一位的值。

直接逆向分析函数思路,发现奇数位是通过本位推导,但偶数位是通过高位推导,因此第0位是无法被推导出的,而18位可以被推导出两次:

image-20220122164546365

脚本如上:猜测第一位是f字符,最终正确。

汇编跳转函数的总结:

https://lhl7.github.io/2022/01/22/%E6%B1%87%E7%BC%96%E8%B7%B3%E8%BD%AC%E6%8C%87%E4%BB%A4%E6%80%BB%E7%BB%93/