EasyHook

攻防世界Reverse三星题EASYHOOK Wirteup

解题过程

IDA F5看下main函数伪代码

image-20240918191658086

代码中的两个关键部分,输入字符串长度=19,让NumberOfBytesWritten=1

image-20240922220946414

但是根据前面WriteFile的Windows API,NumberOfBytesWritten的值为写入的字节数,我们输入的Buffer长度必须为19,NumberOfBytesWritten也为19肯定不能为1,这个条件冲突了,在之前的过程中肯定有东西可以修改这个NumberOfBytesWritten的值

image-20240922221140896

继续看下前面的函数,sub_401240看起来像一个算法,先放着等待进一步分析

1
sub_401240(Buffer, &NumberOfBytesWritten);

image-20240922221355659

sub_401220(),这个函数先调用GetProcAddres获取了WriteFile函数的地址lpAdress,再去Hook这个WriteFIle的函数

image-20240922221617459

image-20240922221723398

image-20240922221743971

image-20240922222846999

image-20240922222908048

分析过后该函数被修改为

image-20240922223650294

再继续看新的WriteFile的Hook后的函数

image-20240922223919435

其中sub_401140为UninstallHook,否则再调用WriteFile函数会陷入死循环

image-20240922224128618

上面还有个函数sub_401000为Hook部分加密算法内容

image-20240922224401672

先对该函数的传参类型内容进行修改,其中有两个条件能使nNumberOfBytesToWrite返回1,反回1则v5不等于0,则*lpNumberOfBytesWritten = 1,根据前面分析则判定输入了正确的flag

image-20240922224628758

image-20240922225804708

第一个条件,不可能实现,因为nNumberOfBytesToWrite长度需要等于19

1
2
if ( nNumberOfBytesToWrite <= 0 )
return 1;

第二个条件,需要和这个数组相等

1
2
3
4
5
6
while ( byte_40A030[v5] == Buffer[v5] )
{
v5 = ++v4;
if ( v4 >= nNumberOfBytesToWrite )
return 1;
}

image-20240922224900630

image-20240922224922938

image-20240922225246234

1
2
3
4
unsigned char byte_40A030[19] = {
0x61, 0x6A, 0x79, 0x67, 0x6B, 0x46, 0x6D, 0x2E, 0x7F, 0x5F, 0x7E, 0x2D, 0x53, 0x56, 0x7B, 0x38,
0x6D, 0x4C, 0x6E
};

借助AI编写算法的逆算法,成功获得flag

image-20240922232425549

image-20240922232453028

__END__