逆向工程
文章平均质量分 80
hustd10
这个作者很懒,什么都没留下…
展开
-
kmdf驱动教程2——驱动程序与应用程序通信
1 简述作为写在最前面的话,我不会在本教程中专门去介绍KMDF框架、对象、方法等基础知识,因为相关资料已经不少,而且文档中都有,如果读者不了解,应该先去看看相关内容。驱动程序作为内核模式的一部分,都是为我们的应用程序服务的。而我们在教程1中编写的HelloWord不仅没有为我们服务,而且我们还难以控制,除了在设备管理器中操作,连打印出来的信息都要特殊的工具才能看得到。所以,一方面我们要让驱动程序为我原创 2016-01-26 20:49:26 · 8406 阅读 · 5 评论 -
栈溢出笔记1.11 SafeSEH
在上节写示例的过程中,我把要用到的POP+POP+RET指令写在了自己的一个DLL中。POP+POP+RET指令是很常见的指令,一般函数的末尾都是这种形式,因此,系统DLL中应该是有该指令的,比如ntdll.dll中就有: 图73我们把上节示例中的地址改成这个地址试试,没有弹出MessageBox,说明Shellcode失效了,在调试器中看看: 图74提示说无法处理异常,说明改了地址后的原创 2016-04-16 21:00:40 · 1068 阅读 · 0 评论 -
栈溢出笔记1.9 认识SEH
从本节开始,我们就要研究一些稍微高级点的话题了,如同在1.2节中看到的,Windows中为抵抗栈溢出做了很多保护性的检查工作,编译的程序默认开启了这些保护。如果我们不能绕过这些保护,那么我们的Shellcode也就是一个玩具而已,什么都做不了。我们从SEH(结构化异常处理)开始。这篇文章讲SEH简洁易懂:http://www.securitysift.com/windows-exploit-deve原创 2016-04-16 14:16:54 · 4867 阅读 · 3 评论 -
栈溢出笔记1.12 栈Cookie
栈Cookie,也叫安全Cookie。我们先来看一看栈Cookie的实现机制,使用的程序为1.2节中的example_2,重点在函数get_print()部分。还记得在1.2节中我们为了演示栈溢出,去掉了编译设置中的“缓冲区安全检查(GS)”选项,我们先看看未启用该选项时的get_print()函数代码: 图78 未启用GS的get_print()函数代码然后,启用该选项,看启用该选项之后的g原创 2016-04-19 22:52:30 · 1567 阅读 · 0 评论 -
DUMP文件分析3:用任务管理器采集的DUMP
看完前一节,你可能会说,所谓的DUMP分析毫无技术含量啊,直接一个 !analyze -v就搞定了啊。不错,第一条输入的命令一般都是!analyze -v,但不代表着自动分析可以解决所有的问题。有时候,!analyze -v出来的结果会将你带入歧途,如果你不抱着怀疑态度的话。本节的示例依然是前一节中的,但是我们不自动保存DUMP,而是在程序崩溃之后,从任务管理器中手动保存。操作很简单,我就不演示了。原创 2016-07-30 22:02:51 · 3493 阅读 · 1 评论 -
DUMP文件分析1:DUMP文件简介
1.1 DUMP文件类型Windows下Dump文件分为两大类,内核模式Dump和用户模式Dump。内核模式Dump是操作系统创建的崩溃转储,最经典的就是系统蓝屏,这时候会自动创建内核模式的Dump。用户模式Dump进一步可以分为完整Dump(Full Dump)和迷你Dump(Minidump)。完整Dump包含了某个进程完整的地址空间数据,以及许多用于调试的信息,而Minidump则有许多类型,原创 2016-07-30 21:42:57 · 15405 阅读 · 0 评论 -
DUMP文件分析2:一个最简单的DUMP分析示例
本节开始,我将在示例中给大家讲述基本的DUMP文件分析方法。读者应该对Windows系统比较了解,同时比较熟悉Windbg。 本节的示例非常简单,也非常经典,就是常常会遇到的访问空指针。Windows将进程内存空间的一段范围设置为NULL(64KB),这段空间禁止访问。一旦我们在程序中不小心访问了这段地址(通常是指针未初始化),就会引起访问越界异常,造成程序崩溃,例如本示例: 这是一个简单的原创 2016-07-30 21:53:55 · 28857 阅读 · 0 评论 -
DUMP文件分析4:栈溢出
前面说到过,栈溢出类型的异常通过编程的方式获取DUMP可能不成功,因为栈溢出会破坏SEH(结构化异常处理)框架。实际上,通过DUMP文件来调试栈溢出同样是困难的,因为栈溢出本身一般不会造成异常,异常往往发生在栈溢出破坏栈上的数据之后,同时,由于栈溢出破坏了栈上的数据,使得我们无法对函数调用进行回溯,从而难以定位问题的发生位置。 本节的示例是经dump1简单修改而来,在Crash Me!按钮的消息处原创 2016-07-31 20:52:44 · 6335 阅读 · 0 评论 -
DUMP文件分析5:Windows中malloc和free的实现
本来,本节应该是继续典型的DUMP分析的,但由于后面我准备说到堆损坏(Heap Corruption)所导致的程序崩溃,而堆相对于栈来说要复杂的多,所以,有些基础知识必须得清楚,才能定位堆损坏的原因。 本节,我们从表面开始,即new/delete和malloc/free,这两套API(简单的当作API吧)一个用于C++,一个用于C,面试题中常常拿来进行比较。事实上,它们有本质上的区别,new/de原创 2016-08-02 18:23:42 · 3740 阅读 · 0 评论 -
栈溢出笔记1.10 基于SEH的栈溢出
上节中简单地讲述了SEH的原理及逻辑结构。本节,要继续讲述SEH的物理结构及如何利用它进行栈溢出。先来看SEH的物理结构。先回想上节中的图51,我们在程序停在gets函数输入的时候查看SEH链,看到了一大堆异常处理器,而当我们把断点设置在gets函数下一条语句的时候,其中很多没有了,这给我们一个直观的感觉:SEH链保存在栈上。下面,我们就来看看栈上的SEH链。我们使用的是example_10,即添加原创 2016-04-16 14:27:22 · 8833 阅读 · 2 评论 -
栈溢出笔记1.8 字符串问题
在前面编写Shellcode的过程中,我们用到的字符串要么直接使用DB定义,要么通过PUSH直接压入栈上(相当于定义局部变量),这样的话,如果一个Shellcode中的字符串多一点的话,仅字符串就要占用不少空间。而且,在1.7节中,我们在kernel32.dll的导出表中查找函数名称的时候,有一个字符串比较的过程,要将我们指定的函数名(如LoadLibraryA)与导出表中的函数名比较,这样一方面我原创 2016-04-10 16:54:56 · 903 阅读 · 0 评论 -
OllyDbg消息断点(unable to read memory of debugged process...)
在OllyDbg给窗口设置消息断点的时候遇到unable to read memory of debugged process...错误,无法设置xi原创 2015-12-25 22:25:59 · 4057 阅读 · 0 评论 -
栈溢出笔记1.1 函数调用过程
选择从栈溢出开始学习Shellcode的编写,是因为在没有保护机制(栈Cookie,ASLR,DEP,SafeSEH)的系统中使用栈溢出是一件很简单的事情。栈区随着函数调用动态变化,每个函数调用时在栈上占用的空间称为栈帧。用一个示例来说明栈上保存的内容及动态变化的过程。 下面是一个程序,生成一个对话框显示一条“Hello World!”消息。下面是该程序的C代码: 在VS2008中用Debu原创 2016-04-09 23:04:35 · 4674 阅读 · 0 评论 -
栈溢出笔记1.2 覆盖EIP
1.1节中我们说到可以利用栈溢出来破坏栈中原有的内容,这一节中,我们就来看看如何争夺到返回地址(EIP),使得我们可以随意控制它的值,这样我们就可以控制程序。来看一个经典的程序:这个程序的get_print函数中定义了一个大小为11个字节的数组,正常情况下我们的输入应该最多为10个字符(还有一个\0结束符),而gets函数没有明确定义输入的大小,因此,我们可以输入超过10个字符,从而造成栈溢出。如下原创 2016-04-09 23:14:34 · 4864 阅读 · 0 评论 -
栈溢出笔记1.3 准备Shellcode
经过1.1和1.2节的讲述,我们已经知道了如何更改EIP的值。程序执行函数之后将跳转到我们设定的位置开始执行,因此,我们需要准备一个自己的程序,接手后面的工作。这是一个什么样的程序?是一个C语言编写的代码?是一个可直接调用的exe?肯定不是,因为EIP所指的地址保存的内容为指令的操作码,CPU读取该操作码执行相应的操作。所以我们要准备的程序也应该是一段“操作码”。继续写1.1中的Hello Worl原创 2016-04-09 23:24:19 · 3396 阅读 · 0 评论 -
栈溢出笔记1.4 黑掉example_2
在1.2节中我们编写了一个有漏洞的程序,通过输入可以控制其EIP,本节,我们要让example_2运行我们的MessageBox。再看看example_2:/*****************************************************************************/// example_2: 演示栈溢出#include <stdio.h>void原创 2016-04-09 23:32:42 · 2867 阅读 · 0 评论 -
栈溢出笔记1.5 换一个汇编工具
前面的内容中我们使用VC++内联汇编,虽然很方便,但是无法定义字符串常量,导致我们需要把字符串的ASCII码找到,再一个一个压入栈中,比较繁琐,本节,我们换一个汇编工具——nasm,选择它是因为它可以跨平台使用。有了这个汇编工具,我们就可以定义字符串常量了,例如:/********************************************************************原创 2016-04-09 23:37:40 · 827 阅读 · 0 评论 -
栈溢出笔记1.7 地址问题(2)
1.6节中找到了kernel32.dll的基地址,这一节,来解决第二个重要问题,即解析kernel32.dll的导出表,找到LoadLibraryA和GetProcAddress的地址。DLL导出的函数信息位于导出表中,因此,首先,要在PE文件中找到导出表(IMAGE_EXPORT_DIRECTORY)的地址,这位于数据目录(IMAGE_DATA_DIRECTORY)中。而数据目录位于PE扩展头(I原创 2016-04-09 23:49:55 · 1006 阅读 · 0 评论 -
栈溢出笔记1.6 地址问题(1)
前面的Shellcode中,我使用的都是自己XP机器上的硬编码地址。任何时候在Shellcode中使用硬编码地址都不是个好主意,这一点与动态库的重定位类似,一旦系统环境和程序编译设置发生变化,Shellcode几乎肯定会失效。因此,我们要找到更好一点的方法。前面的Shellcode中,我用到了如下几个硬编码地址,它们的含义如下: 其中,LoadLibraryA的作用比较特殊,我们用它来加载us原创 2016-04-09 23:45:51 · 4180 阅读 · 0 评论 -
DUMP文件分析6:简单的堆破坏示例
本节,我们来看一个简单的堆破坏示例,程序依旧来自前面的示例,Crash Me!按钮的消息函数如下:void Cdump3Dlg::OnBnClickedButton1(){ int* a = new int[1000]; for( int i = 0; i < 1005; i++ ) a[i] = i; printf("%d\n", a[0]); dele原创 2016-08-03 10:58:02 · 2912 阅读 · 0 评论