EasyHook
攻防世界Reverse三星题EASYHOOK Wirteup
解题过程
IDA F5看下main函数伪代码
代码中的两个关键部分,输入字符串长度=19,让NumberOfBytesWritten=1
但是根据前面WriteFile的Windows API,NumberOfBytesWritten的值为写入的字节数,我们输入的Buffer长度必须为19,NumberOfBytesWritten也为19肯定不能为1,这个条件冲突了,在之前的过程中肯定有东西可以修改这个NumberOfBytesWritten的值
继续看下前面的函数,sub_401240看起来像一个算法,先放着等待进一步分析
1 | sub_401240(Buffer, &NumberOfBytesWritten); |
sub_401220(),这个函数先调用GetProcAddres获取了WriteFile函数的地址lpAdress,再去Hook这个WriteFIle的函数
分析过后该函数被修改为
再继续看新的WriteFile的Hook后的函数
其中sub_401140为UninstallHook,否则再调用WriteFile函数会陷入死循环
上面还有个函数sub_401000为Hook部分加密算法内容
先对该函数的传参类型内容进行修改,其中有两个条件能使nNumberOfBytesToWrite返回1,反回1则v5不等于0,则*lpNumberOfBytesWritten = 1,根据前面分析则判定输入了正确的flag
第一个条件,不可能实现,因为nNumberOfBytesToWrite长度需要等于19
1 | if ( nNumberOfBytesToWrite <= 0 ) |
第二个条件,需要和这个数组相等
1 | while ( byte_40A030[v5] == Buffer[v5] ) |
1 | unsigned char byte_40A030[19] = { |
借助AI编写算法的逆算法,成功获得flag
__END__