攻防世界Reverse进阶区-BABYHOOK-writeup
攻防世界Reverse进阶区-流浪者-writeup
本题为较为基础的Hook题,通过本writeup来整理一下思路。
main函数
进入程序,首先确定flag
字符串长度为19;
然后发现程序会将输入内容写入文件名为文件Your_input的文件;
最后通过核验NumberOfBytesWritten变量是否为1来控制输出;
此时,若进入sub_401240函数就会中计,需手动进行测试。
手动测试后发现输出文件中的内容和输入完全不同,推测可能在sub_401220函数中对输入进行了加密。
sub_401220函数:
进入sub_401220函数:(为hook
关键函数)
其主要内容如下(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函数:
可以看到,此函数内容为,先调用sub_401000
,返回值V5;
然后再在内部调用WriteFile函数;
最终根据V5的值,判断第四个指针参数lpNumberOfBytesWritten的值,此处的lpNumberOfBytesWritten参数,即对应main函数中的NumberOfBytesWritten关键参数。
因此,推测sub_401000
函数为对于输入的核心判断函数,步入查看:
sub_401000函数:
输入为a1;a2为固定值19;
然后下面的逻辑简单的说就是先加密a1,然后比较数组a1每一位的值和储存在 byte_40A030处每一位的值。
直接逆向分析函数思路,发现奇数位是通过本位推导,但偶数位是通过高位推导,因此第0位是无法被推导出的,而18位可以被推导出两次:
脚本如上:猜测第一位是f
字符,最终正确。