攻防世界[EASYHOOK]

阅读须知:

探索者安全团队技术文章仅供参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作,由于传播、利用本公众号所提供的技术和信息而造成的任何直接或者间接的后果及损失,均由使用者
本人负责,作者不为此承担任何责任,如有侵权烦请告知,我们会立即删除并致歉,创作不易转载请标明出处.感谢!

题目: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),并从新调用了该程序:
    安装hook的函数
  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}
  1. 根据逻辑可以知道首位的f不会影响flag,实测如下:

总结:最后来聊一下hook

  1. hook(钩子),就是在执行程序的时候在程序的某个位置(一般在开头位置),安装一个钩子(实际上就是段内跳转的jmp指令),这个钩子的作用时跳到去执行其他函数,从而对当前函数进行阻断。当然,也可以,另外加一个程序在执行完hook的目标函数后,可以对当前被hook的函数进行恢复(上面的题目就是这种),然后再调用它(即上面题目中的writefile函数)。
  2. 下面我给出一种简单的hook程序,对print_hello函数进行hook,不让其打印hello world,反而其打印我们指定的其他字符串:
#include <stdlib.h>
#include <stdio.h>
#include <cstring>
#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()函数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/790220.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32学习和实践笔记(4): 分析和理解GPIO_InitTypeDef GPIO_InitStructure (b)

继续上篇博文&#xff1a;STM32学习和实践笔记&#xff08;4&#xff09;: 分析和理解GPIO_InitTypeDef GPIO_InitStructure (a)-CSDN博客 往下写&#xff0c; 为什么&#xff1a;当GPIO_InitStructure.GPIO_PinGPIO_Pin_0 ; 时&#xff0c;其实就是将对应的该引脚的寄存器地…

Xxxxxx

数据库 1&#xff0c;B树与B树区别 1&#xff0c;B树每个节点存ID与其他数据字段&#xff0c;B非叶子结点&#xff0c;只存ID&#xff0c;叶子结点存完整数据 好处&#xff1a;每个层级B树&#xff0c;可以存储更多的额数据&#xff0c;层级更少&#xff0c;更扁平&#xff…

【语义分割实战(1)】U-Net语义分割:训练自己的数据集

一、U-Net图像语义分割原理 UNet最早发表在2015的MICCAI会议上&#xff0c;4年多的时间&#xff0c;论文引用量已经达到了9700多次。 UNet成为了大多做医疗影像语义分割任务的baseline&#xff0c;同时也启发了大量研究者对于U型网络结构的研究&#xff0c;发表了一批基于UNet…

Java中线程详解

文章目录 相关概念多线程概念实现方式继承Thread类实现Runnable接口比较 常用方法线程安全产生的原因解决思想同步同步代码块同步方法Lock锁机制 死锁概念避免 状态线程间的通讯介绍方法 相关概念 并行&#xff1a;在同一时刻&#xff0c;有多个任务在多个CPU上同时执行并发&a…

抖店新手从0-1起店教程:新手开抖店别乱操作!这才是正确流程!

哈喽~我是电商月月 新手开抖店为什么不好成功&#xff0c;那是因为你没接触过电商&#xff0c;不懂其中的步骤&#xff0c;一些细节没处理好&#xff0c;开店就已经注定失败&#xff01; 废话不多说&#xff0c;直接入正题 一&#xff0e;开店&#xff0c;入驻抖店 1&#…

韩顺平 | 零基础快速学Python

环境准备 开发工具&#xff1a;IDLE、Pycharm、Sublime Text、Eric 、文本编辑器&#xff08;记事本/editplus/notepad&#xff09; Python特点&#xff1a;既支持面向过程OOP、也支持面向对象编程&#xff1b;具有解释性&#xff0c;不需要编程二进制代码&#xff0c;可以直…

算法沉淀——动态规划篇(子数组系列问题(上))

算法沉淀——动态规划篇&#xff08;子数组系列问题&#xff08;上&#xff09;&#xff09; 前言一、最大子数组和二、环形子数组的最大和三、乘积最大子数组四、乘积为正数的最长子数组长度 前言 几乎所有的动态规划问题大致可分为以下5个步骤&#xff0c;后续所有问题分析都…

基于SSM+Jsp+Mysql的航空机票预订系统

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

小红数组操作(结构体模拟链表详细解析)(双向链表)c/c++

题目描述: 小红拿到了一个数组&#xff0c;初始数组为空&#xff0c;她希望你实现以下两种操作&#xff1a; 1. 输入x,y&#xff0c;将x插入在元素y的右边。保证此时数组中没有元素等于x&#xff0c;且数组中存在一个y。特殊的&#xff0c;如果将x插入在数组的最左边&#xff0…

hadoop在linux上启动成功了,但是浏览器访问不了

根据网上的资料进行安装hadoop的伪集群 都安装成功&#xff0c;并且启动也成功了&#xff0c;如下图所示&#xff1a; 2、但是在浏览器上确是怎么也访问不了&#xff0c; 解决思路&#xff0c; 2.1、根据网上的一些文章处理解决是关闭防火墙&#xff0c; 2.1.1、我根据操作步骤…

影视剪辑来这6个网站找视频素材~

影视剪辑&#xff0c;一般都是先找影视资源&#xff0c;保存百度云下载或者直接录屏&#xff0c;再进行二次创作&#xff0c;找影视资源可以到下面这个网站&#xff0c;绝对能找到90%的电视剧、电影。 茶杯狐 一个影视资源搜索网站&#xff0c;页面非常干净&#xff0c;提供了各…

Python基础之pandas:字符串操作与透视表

文章目录 一、字符串操作备注&#xff1a;如果想要全部行都能输出&#xff0c;可输入如下代码 1、字符检索2、字符转换3、字符类型判断4、字符调整5、字符对齐与填充6、字符检索7、字符切割8、字符整理 二、透视表1、pd.pivot_table2、多级透视表 一、字符串操作 备注&#xf…

[力扣]根据前中序构造二叉树--详细解析

根据前中序遍历顺序构建一个二叉树 力扣练习链接 过程 总体框架 设preorder的左边界为pleft,右边界为pright[注意这里是闭区间能取到]同时设inorder的左边界为ileft,有边界为iright[同样也是可以取到的索引区间]我们生成每一个区间的树的头结点,然后向上返回,对于他的父亲结点…

Python搭建编程环境—安装Python3解释器

✅作者简介&#xff1a;CSDN内容合伙人、阿里云专家博主、51CTO专家博主、新星计划第三季python赛道Top1&#x1f3c6; &#x1f4c3;个人主页&#xff1a;hacker707的csdn博客 &#x1f525;系列专栏&#xff1a;零基础学Python &#x1f4ac;个人格言&#xff1a;不断的翻越一…

Day18-【Java SE进阶】多线程

一、线程 1. 什么是线程? 线程(Thread)是一个程序内部的一条执行流程。程序中如果只有一条执行流程&#xff0c;那这个程序就是单线程的程序。 2. 多线程 多线程是指从软硬件上实现的多条执行流程的技术(多条线程由CPU负责调度执行) 3. 如何在程序中创建出多条线程? Ja…

数据文件大小扩容或缩容必备技能

欢迎关注“数据库运维之道”公众号&#xff0c;一起学习数据库技术! 本期将为大家分享“数据文件大小扩容或缩容必备技能” 。 关键词&#xff1a;Resize Datafile、ORA-03297、高水位线 表空间跟数据文件是一对多的关系&#xff0c;数据文件存放到磁盘或ASM磁盘组。当磁盘空间…

计算机视觉——图像金字塔理解与代码示例

图像金字塔 有时为了在图像中检测一个物体&#xff08;例如人脸、汽车或其他类似的物体&#xff09;&#xff0c;需要调整图像的大小或对图像进行子采样&#xff0c;并进行进一步的分析。在这种情况下&#xff0c;会保持一组具有不同分辨率的同一图像。称这种集合为图像金字塔…

人大金仓数据库介绍与使用指南

人大金仓数据库是一款强大的关系型数据库管理系统&#xff0c;具有简单易用、高性能和稳定可靠的特点。本文将介绍人大金仓数据库的安装方法、常用的SQL语法以及相关工具的使用。 一、安装方法&#xff1a; 1、下载人大金仓数据库安装程序&#xff1b; 2、运行安装程序&#…

自动驾驶之心规划控制笔记

Search-based Path Planning Methods Path Finding Problem 一般来说指标有距离,耗费时间,能量,或者多目标。 左图是拓扑地图,蓝色的点就是顶点,绿色的线是连接关系。最后得到的是一个从哪里走的一个最优,并非精细解。 右图是栅格地图,这个搜索出来的是在相对分辨率比…

SSL证书有哪些种类?有免费的吗?

SSL证书主要有以下几种类型&#xff1a; 1. 域名验证型SSL证书 (DV SSL)&#xff1a; - 仅对申请者的域名所有权进行验证&#xff0c;无需人工验证申请单位的真实身份。 - 审核快速&#xff0c;通常适用于个人网站、小型组织或各类加密应用。 2. 组织验证型SSL证书 (OV…