攻防世界re EASYHOOK

 什么是hook? https://www.cnblogs.com/ArsenalfanInECNU/p/12871887.html

查壳

无壳,ida

发现很多对文件的操作。分析一下

如果输入的长度为19,那么就创建一个文件,然后写入文件。如果NumberOfbytesWritten的值为1的话,就说明flag是对的了。进入sub_401240

这里似乎有一个坑,把"This_is_not_the_flag"赋给v4,如果v4里面前21字符的内容和"This_is_not_the_flag"一样,那么就将指针的值变为1,也就是证明flag是正确的。

这里的a1数组即为buffer数组,就是用来存放我们输入的数组,但是注意在main函数中,只有a1数组长度为19时,才会进行下一步,而这里的长度是21,自相矛盾,所以姑且认为这里就是一个干扰项。

然后就得关注到之前被我跳过的一个函数,sub_401220

在这个函数中

于是我们知道IpAddress精确获得了writefile函数的地址,而byte_40C9BC中存储的-23,0-23 = FFFF FFFF FFFF FFE9,E9是jump的字节码,jump指令占5个字节。

所以dword_40C9BD中存放的就是sub_401080到IpAddress加上jmp指令的距离。

jmp指令见:https://www.cnblogs.com/czlnb/p/14618272.html

进入其返回值,sub_4010D0

WriteProcessMemory(hProcess, lpAddress, &byte_40C9BC, 5u, 0);这行把jmp指令写进了write file函数的起始位置,此步就是HOOK.

进入sub_401080

sub_401000加密IpBuffer,sub_401140解密IpBuffer

进入sub_401000

写出解密代码

res = [0x61, 0x6A, 0x79, 0x67, 0x6B, 0x46, 0x6D, 0x2E,
       0x7F, 0x5F, 0x7E, 0x2D, 0x53, 0x56, 0x7B, 0x38,
       0x6D, 0x4C, 0x6E, 0x00]

flag = [0] * 20  # 初始化一个长度为20的列表

for i in range(len(res)):  # 使用 len(res) 遍历所有元素
    if i == 18:
        flag[i] = res[i] ^ 0x13
    elif i % 2:
        flag[i] = (res[i] ^ i) + i
    else:
        if i + 2 < len(flag):  # 确保不越界
            flag[i + 2] = res[i] ^ i
        else:
            print(f"Index {i + 2} is out of range for flag list.")

result = ""
for i in range(1,19):
    result += chr(flag[i])
print(result)

得到flag

参考链接:https://www.cnblogs.com/onequiz/articles/15987439.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值