为了与驱动程序达成交互,我们需要来回地切换于用户态与内核态之间,在windows下我们通过IOCTL(输入/输出控制系统)传送数据信息来实现这一过程。IOCTL充当着用户态下的应用程序与内核态下设备驱动之间沟通的桥梁
几乎每一个windows驱动都在操作系统中注册有一个特定的设备名称以及一个符号链接、用户态下的应用程序为了与某个驱动程序达成通信,首先需要通过符号链接来取得与之相应的句柄
NTFS文件系统有一个遗留特性-ADS(数据交换流)。ADS最初作为与苹果系统的HFS(分层式文件系统)的一种通信手段而被引入。ADS允许我们在一个磁盘主体文件所附带的流中存储额外的数据,比如一个DLL文件。这里所谓的流本质上无非是依附于某个磁盘文件的一条隐藏文件通道
Fuzzer有两种基本形式:生成型fuzzer和变异型fuzzer。生成型fuzzer充当着一切测试用例的始作俑者,这意味着一切发送目标程序的测试数据皆出自其手。变异型fuzzer更倾向于拦截现有通信渠道中的数据并加以部分篡改。
栈溢出:
引发栈上数据遭受污染,为攻击者接管后续的代码执行流创造了绝佳机会。恶意攻击者可能会通过重写当前函数栈帧中的返回地址,或者改写存于栈上的函数指针,或者篡改栈上变量的取值,或者修改当前的异常处理例程执行链等各种手段来设法掌控后续的代码的执行方式。通常在栈溢出发生不久,系统就会抛出一个非法内存访问异常。
堆溢出:
发生在称之为“堆”的进程区段之中。这个区段是进程在运行时分配动态内存的所在之地。堆由一系列相互紧邻的“块”数据组成,这些“块”数据结构之中,除了动态内存数据本身之外还存储着元数据,元数据扮演着连结这些“块”状结构的纽带。发生“堆”溢出时,紧邻溢出现场的“块”中数据将被重写,,这自然会殃及元数据。恶意攻击者通过精心构造元数据的重写内容,便可实现对任意内存位置进行写操作、这可能包括变量值、某一函数指针、安全令牌,或者其他溢出发生时存于堆中的重要数据。堆溢出由于受污染的块数据不一定立刻被用到,所以堆溢出的发生可能会有延迟效应。
windows提供了一组用于控制调试与诊断功能的系统标志变量,称之为全局标志(Gflag),用户一旦激活这组标志,便能以细粒度的方式跟踪,记录与调试软件的行为。
格式化串攻击:
值得特别留意的格式说明符%s和%n.%s将指使格式化串例程开始大量地扫去内存数据,知道第一个字符串收尾符NULL值出现为止。恶意攻击者注入这一说明符,以窃取存于目标程序特定位置的私密数据,或者用于致使目标程序读取超出访问权限之外的内存数据而导致崩溃。%n允许你向内存写入数据,而非用于一般的格式化输出的目的。这为恶意攻击者覆写函数的返回地址或者重写某个现有函数例程的指针提供了潜在渠道。
段(segment):一个二进制文件通常由数个段组成,每个段属于某一特定类型(CODE,DATA,BSS,STACK,CONST,XTRN)
代码交叉引用和数据交叉引用提供了一种绝佳的途径来帮助你探明二进制文件重化工途经某处的数据流向和代码执行流向
几乎每一个windows驱动都在操作系统中注册有一个特定的设备名称以及一个符号链接、用户态下的应用程序为了与某个驱动程序达成通信,首先需要通过符号链接来取得与之相应的句柄
NTFS文件系统有一个遗留特性-ADS(数据交换流)。ADS最初作为与苹果系统的HFS(分层式文件系统)的一种通信手段而被引入。ADS允许我们在一个磁盘主体文件所附带的流中存储额外的数据,比如一个DLL文件。这里所谓的流本质上无非是依附于某个磁盘文件的一条隐藏文件通道
Fuzzer有两种基本形式:生成型fuzzer和变异型fuzzer。生成型fuzzer充当着一切测试用例的始作俑者,这意味着一切发送目标程序的测试数据皆出自其手。变异型fuzzer更倾向于拦截现有通信渠道中的数据并加以部分篡改。
栈溢出:
引发栈上数据遭受污染,为攻击者接管后续的代码执行流创造了绝佳机会。恶意攻击者可能会通过重写当前函数栈帧中的返回地址,或者改写存于栈上的函数指针,或者篡改栈上变量的取值,或者修改当前的异常处理例程执行链等各种手段来设法掌控后续的代码的执行方式。通常在栈溢出发生不久,系统就会抛出一个非法内存访问异常。
堆溢出:
发生在称之为“堆”的进程区段之中。这个区段是进程在运行时分配动态内存的所在之地。堆由一系列相互紧邻的“块”数据组成,这些“块”数据结构之中,除了动态内存数据本身之外还存储着元数据,元数据扮演着连结这些“块”状结构的纽带。发生“堆”溢出时,紧邻溢出现场的“块”中数据将被重写,,这自然会殃及元数据。恶意攻击者通过精心构造元数据的重写内容,便可实现对任意内存位置进行写操作、这可能包括变量值、某一函数指针、安全令牌,或者其他溢出发生时存于堆中的重要数据。堆溢出由于受污染的块数据不一定立刻被用到,所以堆溢出的发生可能会有延迟效应。
windows提供了一组用于控制调试与诊断功能的系统标志变量,称之为全局标志(Gflag),用户一旦激活这组标志,便能以细粒度的方式跟踪,记录与调试软件的行为。
格式化串攻击:
值得特别留意的格式说明符%s和%n.%s将指使格式化串例程开始大量地扫去内存数据,知道第一个字符串收尾符NULL值出现为止。恶意攻击者注入这一说明符,以窃取存于目标程序特定位置的私密数据,或者用于致使目标程序读取超出访问权限之外的内存数据而导致崩溃。%n允许你向内存写入数据,而非用于一般的格式化输出的目的。这为恶意攻击者覆写函数的返回地址或者重写某个现有函数例程的指针提供了潜在渠道。
段(segment):一个二进制文件通常由数个段组成,每个段属于某一特定类型(CODE,DATA,BSS,STACK,CONST,XTRN)
代码交叉引用和数据交叉引用提供了一种绝佳的途径来帮助你探明二进制文件重化工途经某处的数据流向和代码执行流向
可执行文件加壳器又称压缩器,逐渐演变为主要的代码混淆手段。一款典型的加壳器会试图压缩目标二进制文件中原有的代码段与数据段,并将程序入口点替换为脱壳例程的所在位置。
任何一个PyCommand的实现过程应当满足两个基本的条件,首先必须定义一个main函数,这个函数继续接受一个python列表对象作为参数,我们向pycommand所输送的参数将经由这一列表对象传入。其次,这个main函数必须在执行完相关任务之后返回一个字符串值,这个字符串将在脚本执行完毕之后被显示在调试器界面的状态栏上。
假设发现了一个由字符串复制例程strcpy()所引发的栈溢出漏洞,我们最终的exploit将无法直接包含一个NULL字符(0x00),因为strcpy()函数将此字符视为字符串的收尾符,函数将就此停止复制数据。
4字节值0xcc相当于一个软断点,这将使得调试器停于此处(0xcc是指令int3的操作码)
DEP是微软的windows系统为了防止位于某些内存区域中的数据被视作代码执行而实现的一种安全机制