软件漏洞分析入门(五)

突破SafeSEH机制之一——利用堆绕过SafeSEH 文章是发在吾爱破解的,这里直接转过来了 我也是个新手,刚学漏洞调试,发现要学的东西太多,想要把漏洞学好,必须精通各类系统底层机制,汇编,PE等等等等太多太多,所以不可能把这些东西都学会了,再去调试漏洞,只能一步步慢慢从简单开始,另外也要学会忽略那些你现在所力不能及的地方,如果实在不懂,就跳过,可能到哪一天你忽然就明白了。所以这里,也是希望同学们想学习的不要被这个东西吓到,静下心来慢慢看,如果有不 阅读详情

异常机制探索

异常实现机制

程序在运行的时候,经常会遇到各种各样的错误,为了程序以及系统遇到错误的时候也保持好的健壮性,异常处理机制应运而生

异常处理机制简单来说,就是当异常发生的时候,系统先抛出异常,程序先检查一遍,看看自己有没有能处理这种异常的函数,能处理固然好,如果不能处理的话就继续传给系统,即默认异常处理,随机终止进程

SEH,Structure Exception Handler,异常处理结构体,是一种 Windows 在异常处理中用到的一种数据结构。SEH 包含一个 SEH 链表指针以及应该异常处理函数句柄,栈中的多个 SEH 通过链表指针在栈内由栈顶向栈底串成单向链表,位于链表最顶端的 SEH 通过 TEB(线程环境块)0 字节偏移处的指针标识。下面我们分别实验几种不同的异常处理器的注册方式

使用C语言添加SEH

C语言中添加一个异常处理器非常简单,只用 __try 将要检查的代码包起来,在 __except 中编写异常处理代码,形如:

__try{
// 监控的代码
}	
__except ( expression ){
// 异常处理代码
}	

下面是使用C语言注册异常处理器的一个代码实例

#include <stdio.h> 
#include <windows.h> 
int main(){
int a =0, b =1, c =0;
 __try
{
  c = b / a;//触发除零异常
}

__except(EXCEPTION_EXECUTE_HANDLER)
{
  MessageBox(NULL, TEXT("integer divide by zero."),
  //弹窗提示除0异常
  TEXT("ERROR"), MB_OK);
   //scanf("%d",&a);;
   a =1; //修正除0错误
   c = b / a;
}
printf("b / a = %d\n", c);
printf("sucess\n");
system("pause");
return 0;
}

弹窗如图所示

image-20220604213204502

抛出异常之后自动处理异常,解决掉除0的问题

image-20220604213244880

使用内联汇编块注册SEH

下面是使用汇编嵌入式注册SEH的实例代码

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

char pw[10] = "SEH";
char input[1024] = {0};

//异常处理函数
EXCEPTION_DISPOSITION
__cdecl
_except_handler( struct _EXCEPTION_RECORD *ExceptionRecord,
                void * EstablisherFrame,
                struct _CONTEXT *ContextRecord,
                void * DispatcherContext )
{
	//异常处理函数逻辑
	if(strcmp(input, pw) == 0){
		printf("ok, you are here. Congratulation!\n");
		system("pause");
	    exit(0);//完成口令匹配后结束进程——否则因为没有对异常代码进行处理,所以该进程会一直在触发异常和异常处理之间循环。
	}
	else{
		printf("ok, you are here. But your pw is wrong!\n");
	}
	
	
	//返回,告知os继续执行异常代码
	return ExceptionContinueExecution;
}


int main(){

	int a = 1, c = 0;

	int res;

	printf("please input password : ");
	scanf("%s", input);

	DWORD handler = (DWORD)_except_handler;

	//注册异常处理函数
	__asm{
		push handler;
		push FS:[0];
		mov FS:[0], ESP;
	}

	//设计的除零异常
	res = a / c;

	//如果不处理异常则会运行至此
	printf("What a pity, you found a wrong way.\n");
	system("pause");
	return -1;
}

我们把汇编注册SEH的代码块拎出来

DWORD handler = (DWORD)_except_handler;
//注册异常处理函数
__asm{
	push handler;
	push FS:[0];
    mov FS:[0], ESP;
}

结合上面的完整代码,可以看出来,这段汇编的作用就是把 handler 这个 DWORD 数据类型给压入栈,也就是把我们上面写的异常处理函数地址先压入栈,然后把SEH链表的表头压入栈,然后再在把表头 FS:[0] 修改为当前ESP的地址 ,这个指针 FS:[0] 指向的位置就是 TEB(线程环境块) 的首地址,相当于是在SEH链表里面插入一个程序自定义的异常处理函数

实际上我们如果用 VS2010 编译这个代码,这个内联的SEH注册汇编代码块会注册失败,我们不管输入什么都会回显 What a pity, you found a wrong way.

image-20220604234536126

这是因为 VS2010 使用的平台工具集默认是 v100,就算往前选一个历史版本也是v90,而我们需要的编译器版本是 VC6.0,我们转到 VC++ 6.0 编译一下相同的代码

image-20220604235131012

运行编译好的程序,随便输入一个错误的 777777

image-20220604235624804

这里是因为进入异常处理函数里面的错误分支之后没有中断,所以一直循环,我们输入正确密码 SEH

image-20220604235838528

SetUnhandledExceptionFilter函数设置自定义的异常处理器

为了使程序逻辑比普通的反调试更加复杂,混淆,更难被调试,我们可以使用 SetUnhandledExceptionFilter() 函数设置自定义异常处理器,这个函数的作用是将默认异常处理器设置为自定义的异常处理器,而且只有在非调试状态下才会被调用,下面贴出实例代码

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

char pw[10] = "SEH";
char input[1024] = {0};

EXCEPTION_DISPOSITION
__cdecl
_except_handler( struct _EXCEPTION_RECORD *ExceptionRecord,
                void * EstablisherFrame,
                struct _CONTEXT *ContextRecord,
                void * DispatcherContext )
{
	if(strcmp(input, pw) == 0){
		printf("ok, you are here. Congratulation!\n");
	}
	else{
		printf("ok, you are here. But your pw is wrong!\n");
	}
	system("pause");
	exit(0);


	return ExceptionContinueExecution;
}

int main(){

	int a = 1, c = 0;

	int res;

	printf("please input password : ");
	scanf("%s", input);

	SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER )_except_handler);

	res = a / c;

	printf("What a pity, you found a wrong way.\n");
	system("pause");
	return -1;
}

同样使用 VC++ 6.0编译 输入错误的密码 777777 显示错误

image-20220605020410794

输入正确密码 SEH

image-20220605020455957

逆向SEH实例

上面我们复现了几种异常处理流程实现的机制,现在我们站到程序的对立面,假如我们不知道这个程序的正确密码,如何逆向破解出密码呢?

我们先用第二个实例编译程序尝试逆向,我们先把程序拖到 IDA 里面

image-20220605045616462

会发现默认主函数里面是不包含异常处理里面的函数的,而且主函数里面也没有跳转到其他代码块的控制流

我们尝试用 x32dbg 动态调试一下,一直运行到发生除0异常,程序中止

image-20220605204931568

这个时候看一程序的 SEH 链

image-20220605205715882

由于 SEH 链表是从表头开始添加的,所以这里的第一个 SEH 地址就是程序自定义的异常处理函数,我们直接进去看看,会发现这一段就是程序自定义的异常处理流程,其中 strcmp 函数比较的就是我们要找的密码 SEH

image-20220605210205338

接下来我们继续尝试逆向一下用 SetUnhandledExceptionFilter 函数反调试的程序

我们直接用 x32dbg 开始动态调试,同样一直运行到除0异常发生

image-20220605211007209

同样进入SEH链视角,但这次我们发现除了默认的异常处理 SEH,程序自己注册的 SEH 并没有出现在 SEH链里面,为什么呢?

image-20220605211549839

我们前文提到过,SetUnhandledExceptionFilter 函数只有在非调试状态下才会被调用,而我们用 x32dbg 进行调试,程序是以 debug 模式运行,自然也就不会转到用 SetUnhandledExceptionFilter 函数注册的异常处理函数里面

那么如何解决这一问题呢,我们可以用 release版本直接运行这个程序,然后手动给他加个 int 3 断点,再用动态调试的软件 ollydbg 或者 x32dbg attach 到程序上,这个时候就可以在触发异常的时候查看真正的SEH链了

不过这道题说实话用不到这一招,我们直接在 x32dbg 里面搜索密码错误的那个字符串 ok, you are here. But your pw is wrong!

image-20220605213018903

直接搜索到了这些字符串对应的位置

image-20220605213226250

我们直接进入这段隐藏起来的流程,依然能找到正确的密码

image-20220605213303144

既然都用了字符串搜索,IDA能不能也做到静态搜索密码呢?

答案是可以的,我们查看字符串,进入这段异常处理流程

image-20220605213523432

交叉引用一下找到对应的汇编位置

image-20220605213807332

由于这个程序设计的时候密码以明文存放,我们可以在内存里面轻松找到

image-20220605213822084

众所周知,SEH存放在栈中,也就是说,只要构造巧妙,我们可以设计一段数据恰好淹没SEH异常函数的调用地址,让地址指向ShellCode,当异常发生时程序会把ShellCode当初异常处理函数进行调用,这就是为啥SEH这么重要

NVD软件漏洞数据处理及分类方法总结 目录 一、前言 二、软件漏洞数据分析 三、软件漏洞分类实验流程 四、软件漏洞文本预处理 五、软件漏洞文本表示方法 六、软件漏洞分类模型构建 七、软件漏洞分类实验结果与分析 八、总结 一、前言 本人研究生期间的研究主方向为:网络空间安全方向,基于研究方向做过入侵检测实验、软件缺陷分类实验、软件安全漏洞分类管理实验等,网络安全方向相关数据集可参看个人总结:网络安全相关数据集介绍与下... 阅读详情

相关推荐

软件供应链安全——组件漏洞的治理

前 言 漏洞库:漏洞数据库,主要指大型的、公开的、业界公认的漏洞数据库。比如NVD、CNVD、exploit-db等。 CVE:给每个漏洞确定唯一名称,通过CVE可以帮助安全人员快速在漏洞数据库中找到相应的漏洞信息。 CPE:漏洞所关联的产品、版本、依赖路径或命名规范等信息,通过CPE信息,可以知道某个CVE所影响的组件版本和所在产品的依赖路径。 CWE:漏洞的类型,比如某3个组件都存在SQL注入漏洞,这3个漏洞的CVE并不相同,但CWE都可描述为CWE-89 SQL...

m0_50579386的博客 3758

[原创]windows-SEH详解

SEH是window操作系统默认的异常处理机制,逆向分析中,SEH除了基本的异常处理功能外,还大量用于反调试程序(这里SEH时保存在栈中的,漏洞利用的时候会用到) 1.SEH SEH是windows操作系统异常处理机制,在程序源代码中使用__try,__except,__finally关键字来具体实现。 2.OS异常处理的办法 2.1正常运行时候的异常处理方法 进程运行过程中若发生异常,OS会委托进程进行处理。若进程代码中存在具体的异常处理(如SEH异常处理器)...

whl0071的专栏 4834

Ubuntu操作系统漏洞扫描和分析

目录 1.介绍 2.Nessus简介 3. Nessus安装注册 3.1下载Nessus安装包     3.2 获取激活码     3.3 安装Nessus     3.4 激活Nessus及插件更新     3.5 添加用户   3.6 开启Nessus   3.7 启动Nessus 4. Nessus 漏洞扫描和分析 4.1 新建扫描策略 4.2 新建扫描 4.3 ...

lph-China的博客 7725

-异常处理-

简介: 异常分为俩种,CPU产生的异常(除0,缺页)和软件模拟产生的异常 来自《加密与解密》 SEH: SEH是Windows操作系统提供的异常处理机制,在程序源代码中使用_try、__except、_finally关键字来具体实现。 TEB/T: typedef struct _NT_TIB { struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList; //异常的链表 PVOID StackBase;

weixin_52369224的博客 826

Unity集成抖音小游戏:从IL2CPP配置到SDK接入全流程解析

本文详细解析了使用Unity开发抖音小游戏的完整流程。从关键的IL2CPP编译后端配置、PlayerSettings设置,到StarkSDK的接入与资源优化(如AutoStreaming),再到激励视频广告、录屏分享等核心功能的代码实现,提供了从环境准备到打包上传的全方位实战指南,帮助开发者高效完成技术适配。

weixin_27943395的博客 692

5个免费股票数据API实测对比:从AkShare到BaoStock,哪个最适合你的AI量化项目?

本文深度评测了AkShare、BaoStock、yfinance、Alpha Vantage和EOD Historical Data这五个免费股票数据API,从数据质量、覆盖范围、更新频率、稳定性及易用性进行对比。针对AI量化项目,文章提供了详细的选型策略,帮助开发者根据项目阶段与需求,精准选择最适合的数据源,并强调了多源验证与数据清洗的重要性。

weixin_29290947的博客 5101

一步一步教你加密解密技术——软件保护技术

 第二节 反跟踪技术1、Anti-Debug1.MeltICE子类型类型:检测SoftICE、TRW2000平台:Windows9x、Windows NT原理:用CreateFileA( )或_lopen( )函数试图获得SoftICE的驱动程序"//./SICE"(Windows9X版本)、"//./SIWDEBUG"、"//./NTICE"(Windows NT版本)、"//./S

魔拉宝 1520

手眼标定搞定了,手眼矩阵不知道怎么用?快戳!!

手眼标定得到手眼矩阵到底该咋用? 大家好,我是小鱼。上几期给大家分享了关于手眼标定的方法,如果还有不清楚如何让进行手眼标定的同学可以参考下面的文章: 机器人手眼标定都能搞不定?快戳,最好用的手眼标定库!!! 很多同学做完了手眼标定之后得到了手眼矩阵,但是不知道怎么用于程序当中去,还有很多同学搞不清楚各个坐标系之间的关系,今天小智就给大家讲讲手眼矩阵的使用问题。 一、手眼矩阵为什么会长的不一样? 做完手眼标定,得到的手眼矩阵,有可能会长的不一样,这是因为旋转变换是有很多种表示方法的。 1.旋转的表

生活不止眼前的苟且 5344

x32dbg动态调试--字符串搜索&修补程序

x32dbg调试入门——字符串搜索

工作学习笔记 6567

Carsim与AVL CRUISE联合仿真:从零搭建整车模型的实战指南

本文详细介绍了如何从零开始搭建Carsim与AVL CRUISE联合仿真整车模型,涵盖软件环境配置、接口设置、模型连接及调试技巧。通过联合仿真,可充分发挥Carsim在车辆动力学和AVL CRUISE在动力系统仿真方面的优势,为电动车和混合动力汽车的研发提供精准的整车模型分析。

weixin_29067143的博客 940

labview中DAQ采集多个数据通道(温度传感器)(TTL信号的曲轴位置传感器)总结

文章目录前言一、面对的问题篇二、问题解决篇三、后续工作总结 前言 我研一的项目利用labview软件和NI数据采集卡采集发动机传感器的信号然后进行采集,发动机传感器是有很多种的,所以难以避免的需要采集多个通道的传感器信号。 一、面对的问题篇 前篇已经写道我已经将温度传感器的信号采集出来,也可以将其数据进行信号处理,由电压信号转变为温度值。但是想要采集多个通道的信号,加上TTL信号的曲轴位置传感器,我模仿温度传感器采集的程序另加了一个DAQ助手进行采集。也就是如图所示的程序: 但是这个程序不能正常显

xiaobaiwsc的博客 1万+

软件漏洞概述

文章目录一、软件漏洞的概念1、信息安全漏洞简述2、软件漏洞3、软件漏洞概念4、软件漏洞的成因分析二、软件漏洞标准化管理1、软件漏洞分类2、软件漏洞分级3、安全漏洞管理规范 一、软件漏洞的概念 1、信息安全漏洞简述 信息安全漏洞是信息安风险的主要根源之一,是网络攻防对抗中的主要目标。由于信息系统漏洞的危害性、多样性和广泛性,在当前网路空间博弈中,漏洞作为一种战略资源被各方所积极关注。 对于信息安全漏洞的不同认识有以下三个主要的共同特点: 漏洞是信息系统自身的弱点或缺陷。 漏洞存在环境通常是特定的。 漏洞具有

W0ngk,一个安全菜鸡,一直在模仿,尚未有超越。 7813

疲劳容器的定义_FKM规范针对非焊接构件疲劳强度评估实例介绍(下篇)

一、写在前面FKM Inside ANSYS软件,该软件是在FKM 规范的基础上,在ANSYS Workbench内开发的进行非焊接构件及焊缝静强度和疲劳强度评估的工具包。基于ANSYS计算模型的信息,在图形用户界面定义相关设置,利用有限元分析计算结果,自动嵌入FKM规范要求的静强度计算和疲劳强度计算流程和方法,自动将应力结果和相关物理量传递给工具包,无须手动预先选择评估的热点区域,可以...

weixin_35925298的博客 1885

软件漏洞分析简述

软件漏洞 1.1漏洞的定义 漏洞,也叫脆弱性(英语:Vulnerability),是指计算机系统安全方面的缺陷,使得系统或其应用数据的保密性、完整性、可用性、访问控制等面临威胁。 漏洞在各时间阶段的名称 根据是否公开分为:未公开漏洞、已公开漏洞 根据漏洞是否发现分为:未知漏洞、已知漏洞 根据补丁和利用价值是否发布分为:0day漏洞、1day漏洞、历史漏洞 图1 漏洞在各时间阶段的名称 漏洞的特...

fufu_good的博客 8万+

【传感器模块项目实战】机器人/无人驾驶常用传感器模型、选型与安装

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!无人车&无人机导航合集本文先对机器人/无人驾驶常用传感器模型、选型与安装做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容分为位置式绝对型编码器增量式编码器打比赛的时候用过欧姆龙的增量式编码器,也用过待编码器的步进电机。【防盗标记–盒子君hzj】增量式编码器正交编码输出信号,用于识别正转和反转,通过微控制器(单片机)的片内外设硬件/软件解码(1)惯性器件-机械陀螺。

qq_35635374的博客 449

基于大语言模型的多轮对话系统优化研究

基于大语言模型的多轮对话系统优化研究 摘要 本研究针对大语言模型在多轮对话场景中的性能衰减问题,提出了一套系统优化方案。通过分层存储架构(短期记忆层、中期摘要层、长期知识层)和混合检索策略优化上下文管理,设计动态槽位填充框架增强对话状态跟踪,引入熵引导的重置算法改进生成策略,并采用双路径加载架构突破I/O瓶颈。实验表明,该方案使任务完成率提升28.6%,响应一致性提高41.2%,推理延迟降低35.8%,为构建高性能智能对话系统提供了实用技术路径。 关键词:大语言模型;多轮对话;上下文管理;状态跟踪~~~~~

huanghm88的专栏 663

软件漏洞分析入门

原帖链接:http://bbs.pediy.com/showthread.php?t=56445  1 引子 To be the apostrophe which changed “Impossible” into “I’m possible” —— failwest  凉风有讯,秋月无边。 您是否梦想过能够像电影上演的那样黑进任意一台机器远程操控?您的梦想是否曾经被书店里边满架子的反黑,

foolzhang的专栏 8684

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

论文精读(二)| 开源软件漏洞感知技术综述

本文综述了开源软件漏洞感知技术的研究进展。开源软件的透明性和协同开发特性虽促进了创新,但也带来了独特的漏洞防御挑战。文章从漏洞生命周期角度,系统梳理了三大类技术:1)基于代码分析的方法(包括机器学习、静态/动态分析和混合技术);2)基于社区讨论的文本挖掘技术;3)基于补丁分析的反向推理方法。研究指出,当前主流技术仍集中于代码层面(占比62%),而社区和补丁分析是新兴方向。挑战包括数据集质量、误报率和供应链安全等问题,未来需要融合AI与程序分析、构建全生命周期防御体系。该领域正转向多维度协同防御,以应对开源生

Pocker_Spades_A的博客 1万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Nessus 漏洞扫描与分析软件

最近攻击机一直无法成功利用靶机暴露出来的漏洞,怀疑是旧漏洞利用软件的问题,使用了当前流行的 Nessus 扫描软件,果然如此。本章介绍 Nessus软件的安装和使用。之前使用了大佬 21superman的漏洞利用软件扫描自己搭建的靶机,不确定是否有这个漏洞(毕竟github已经找不到该软件),攻击机一直无法成功。使用了本章介绍了 Nessus软件,确实很全面且一直在更新漏洞库,推荐给大家的同时也方便自己做记录。

cc123489ll的博客 1202

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

网络安全漏洞与修复 网络安全软件漏洞

给小伙伴们的意见是想清楚,自学网络安全没有捷径,相比而言系统的网络安全是最节省成本的方式,因为能够帮你节省大量的时间和精力成本。坚持住,既然已经走到这条路上,虽然前途看似困难重重,只要咬牙坚持,最终会收到你想要的效果。黑客工具&SRC技术文档&PDF书籍&web安全等(可分享)网络安全产业就像一个江湖,各色人等聚集。

Hacker_Nightrain的博客 1833

软件安全漏洞分析与发现 复习笔记

略。查ppt。修正:上图中的语句2 的可到达语句不包括4。定义集合我们先确定每个语句的 Gen 和 Kill 集合:路径分析接下来我们分析从入口到 [9] 的所有路径:在每个路径上,我们计算每个语句的 In 和 Out 集合。路径1: [0] -> [1] -> [2] -> [3] -> [4] -> [5] -> [9]In(0) = {}

skysys的研究小屋 1695

软件漏洞及检测技术概述

首席安全官Plus是一个围绕“大数据、云计算和人工智能”高技术领域,发布相关网络安全前沿技术和产业趋势的平台,努力打造“有特色、高水平、国际化”的网络安全思想高地。如投稿,请发送到:csoplus@163.com。 软件的质量是软件产品的生命线,其质量问题的根源在于软件设计的不合理以及...

网络空间发展与战略研究 3032

软件漏洞自动化利用,零基础入门到精通,收藏这篇就够了_漏洞利用

近年来软件漏洞数目急剧增加,漏洞危害也引起业界广泛关注. 准确、高效、快速地编写出漏洞利用代码是漏洞危害性评估和漏洞修复的关键. 当前漏洞利用代码主要依赖人工手动分析编写,效率较低. 因此,如何实现自动化的漏洞利用代码生成是该领域研究的热点和难点.

wananxuexihu的博客 1183
上一篇: nmap和nikto扫描
下一篇: Yii2反序列化漏洞复现
[l_l]
博客等级 码龄7年 3181粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值