攻防世界 Reverse--EASYHOOK

拿到题目先查壳,可以发现无壳
在这里插入图片描述
直接拖进ida分析,搜索main函数
在这里插入图片描述
可以看到flag的长度为19,且有个写文件的操作。我们就运行程序看看,生成的文件长啥样。
在这里插入图片描述
生成了一个Your_input文件,用记事本打开发现里面的内容和我们输入的内容不一致,根据题目的名称提示,怀疑这个程序hook了WriteFile这个api。
在这里插入图片描述
在写入文件之前有一个可疑的函数sub_401220,我们跟进去分析一下.
在这里插入图片描述
可以看到这里获取了当前进程的id 还获取了当前进程的句柄,加载了一个模块,以及获取了一个地址.
在这里插入图片描述
可以看到这两个参数分别对应kernel32.dll,以及WriteFile,说明先去加载了这个kernel32.dll,然后去获取了WriteFile的函数地址.
在这里插入图片描述
后面有一个0xE9 对应的汇编指令为jmp,下面有一个计算偏移的操作。再看函数sub_4010D0()
在这里插入图片描述
是一个前面的byte_40C9BC开始的五个字节写入。对应的就是jmp 某个地址. 而写入的地址为WriteFile的函数地址.说明调用WriteFile后会jmp到sub_401080,即跳到我们自己函数来进行处理,因此对函数sub_401080进行分析.
在这里插入图片描述
也是有写文件的操作 但是前面有一个sub_401000函数 对我们输入的字符串进行了处理.所以最后输出文件的内容跟我们输入的值不一样.进入sub_401000函数进行分析.
在这里插入图片描述
可以看到是经典的异或加密,然后和一个字符串比较.
在这里插入图片描述
现在回到main函数,看下sub_401240函数
在这里插入图片描述
也是进行了一通操作,但是并不会将numberOfBytesWritten的值修改为0,所以真正验证的函数为sub_401000.至此此程序分析结束,开始写脚本.
在这里插入图片描述

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
    unsigned int cmpstr[]={
        0x61,0x6A,0x79,0x67,0x6B,0x46,0x6D,0x2E,0x7F,0x5F,0x7E,0x2D,0x53,0x56,0x7B,0x38,
        0x6D,0x4C,0x6E,0x00
    };
    char flag[20]={0};
    int v3;
    for(int i=0;i<19;i++){
        if(i==18){
            flag[i]=cmpstr[i]^0x13;
        }
        else{
            int v3=cmpstr[i]^i;
            if(i%2){
                flag[i]=v3+i;
            }
            else{
                flag[i+2]=v3;
            }
        }
    }
    for(int i=0;i<19;i++){
        cout<<flag[i];
    }
    system("pause");
    return 0;

    
}

最后结果:
在这里插入图片描述
在最前面补0后,即为结果:
flag{Ho0k_w1th_Fun}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值