攻防世界[EASYHOOK]

攻防世界 * 2

题目:EASYHOOK

题目地址:

  1. 拿到程序后无壳直接ida32打开,发现逻辑如下,输入长度为19的flag后经过一个sub_401220函数 ,然后创建一个文件并阿静flag写入这个文件:

  2. 进入sub_401220函数 一时间没看懂,也没有加密函数:

  3. 接着进入sub_401240函数 ,发现有点像比较函数,但看逻辑似乎是This_is_not_the_flag 自己作比较,当长度result为21时直接返回,但是This_is_not_the_flag的长度只有20,这个函数好像什么都没有做,但是程序里面已经没有多余的函数,去左边导航条去看函数:

  4. 左边导航条发现main函数前面还有若干函数,去注意观察一下,发现左边导航栏的函数在主程序里面的sub_401220函数里面都有调用过,下面去观察sub_401220函数的逻辑。

  5. 结合题目的提示,此题为hook题目,哪必须得右hook的函数和hook的目标函数,并且要具备hook的安装函数,保证被hook的函数在后面任然可以重新执行。仔细分析程序的逻辑,发现sub_401220函数时一个hook函数,里面执行了安装hook 的程序,而在hook的目标函数 中又执行了一个加密flag函数 (我们要找的目标函数),随后重新恢复了被hook的程序(writefile) ,并从新调用了该程序:

  6. 找到真正的加密函数后即可对flag进行解密,其中加密的逻辑比较简单:奇数进行异或,偶数的化将其后面两个位置出的字符拿出来并与当前下标异或后放在当前位置,最后一位(下标为18)与0x13异或,然后与内存中的数据进行比较:

  7. 解密脚本如下:

    flag=[0x61, 0x6A, 0x79, 0x67, 0x6B, 0x46, 0x6D, 0x2E, 0x7F, 0x5F,
    0x7E, 0x2D, 0x53, 0x56, 0x7B, 0x38, 0x6D, 0x4C, 0x6E]
    print(len(flag))
    res=[0]*22
    for i in range(len(flag)):
    if i%2==1:
    res[i]=(chr((flag[i]^i)+i))
    else :
    res[i+2]=(chr(flag[i]^i))
    for i in res:
    print(i,end="")
    #flag{Ho0k_w1th_Fun}

  8. 根据逻辑可以知道首位的f不会影响flag,实测如下:

总结:最后来聊一下hook

  1. hook(钩子),就是在执行程序的时候在程序的某个位置(一般在开头位置),安装一个钩子(实际上就是段内跳转的jmp指令),这个钩子的作用时跳到去执行其他函数,从而对当前函数进行阻断。当然,也可以,另外加一个程序在执行完hook的目标函数后,可以对当前被hook的函数进行恢复(上面的题目就是这种),然后再调用它(即上面题目中的writefile函数)。

  2. 下面我给出一种简单的hook程序,对print_hello函数进行hook,不让其打印hello world,反而其打印我们指定的其他字符串:

    #include <stdlib.h>
    #include <stdio.h>
    #include
    #include <windows.h>

    void print_hello()
    {
    printf("hello word!\n");
    }

    //hook的目标函数
    void hooked_function()
    {
    printf("what why how?\n");
    }

    // 安装钩子
    void niyaogansha()
    {
    unsigned char jmp_code[10] = {0};
    jmp_code[0] = 0xE9;
    long long offset = (long long)hooked_function - ((long long)print_hello + 5);
    *(long long *)&jmp_code[1] = offset;

    复制代码
     // 保留原有的权限
     DWORD oldProtect = 0;
     // 修改指令页面的权限
     VirtualProtect((void *)print_hello, 4096, PAGE_EXECUTE_READWRITE, &oldProtect);
     memcpy((void *)print_hello, jmp_code, 5);

    }

    int main()
    {
    niyaogansha();
    print_hello();
    printf("done");
    return 0;
    }

    !(https://img-blog.csdnimg.cn/direct/fd64c3e17ede4885ad7f0b4c8003f925.png#pic_center) 复制代码
    3. 上面我们对void print_hello()函数进行了hook,再其函数头部用jmp指令覆盖掉其原有的指令,转而去执行void hooked_function()函数。
相关推荐
龙仔7251 小时前
RustDesk 1.5.0 升级安装故障处理笔记
笔记
星恒随风1 小时前
Linux基础IO万字详解:从文件描述符fd到重定向、FILE缓冲机制及MiniShell升级
linux·运维·笔记·学习·状态模式
喜欢打篮球的普通人2 小时前
MiniMind 学习笔记(二十二):数学 Cookbook——把概率空间、期望、似然一次讲明白
人工智能·笔记·学习
乐橙开放平台2 小时前
通道国标 ID 贴反会串店:海康大华宇视摄像头怎么用 GB28181 统一接入?
网络·笔记·物联网·自动化·音视频·智能家居
ab1237684 小时前
Spring Integration 完整笔记 + 和 spring-integration-mqtt、Paho、EMQX 的关系
java·笔记·spring
ACP广源盛139246256734 小时前
Type-C 扩展坞方案选型笔记|国产 DP1.2 转 HDMI2.0 桥接芯片 GSV2201D@ACP 评估
开发语言·笔记·硬件架构·硬件工程·hdmi·国产芯片
旖旎夜光4 小时前
【LangGraph实战】LangGraph 学习笔记(四):持久化——从线程记忆到跨会话长期记忆
人工智能·笔记·python·学习·ai编程·langgraph
kdxiaojie5 小时前
MPU6050学习
笔记·学习·mpu6050
qq_2842740516 小时前
机械原理笔记:平面机构自由度计算(复合铰链、局部自由度、虚约束)与四杆机构入门(含考点)
笔记·学习·平面·自动化·制造
qq_2842740517 小时前
数控铣床与加工中心笔记:铣刀与刀柄系统、G54试切对刀、镜像加工指令、孔加工工艺(钻扩铰镗)与固定循环G73/G83/G81/G76/G87/G84
笔记·学习·自动化·制造