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__