该文从91ri.org转载,原文链接:http://www.91ri.org/7857.html
一、PE文件各区段解释(区段名称跟功能没有必然关系,这里只是说明常见的定义):
- .code或.text段:存放程序的代码数据。
- .data段:存放程序运行使用的数据。
- .rdata或.idata段:程序的导入表数据。
- .edata段:程序的导出表所在的节。
- .rsrc段 :程序资源节,为多层的二叉排序树,节点指向PE文件的各种类型资源(图标、对话框、菜单等)。
- .reloc段:重定位表所在的节,当程序的加载基址被占用时,要重新分配加载基址,重定位表就用来处理由此产生的问题,加载基址改变之后,程序里的有些数据(如部分全局变量等)地址是写死的,程序加载时将这些数据的地址更新,重定位表就用来存放需要重定位的数据信息。
二、Windbg界面虽然不怎么友好(看雪提供有Windbg高亮插件),偶尔也是可以用来分析应用层程序的,但是Windbg刚加载程序时是在系统断点处断下的,可以载入程序之后在命令行设置断点bp $exentry,再运行就会在程序的入口点断下的。
三、将Windbg设置为默认调试器的方法为在命令行转到Windbg程序的目录下,输入Windbg –I,如果Windbg.exe的目录已经添加到了系统环境变量里,就不用再Cd进Windbg程序的目录了。设置默认调试器可以在程序出现异常时自动挂载程序到出异常的位置,在调试漏洞Poc时非常有用,如果Poc触发了异常就会自动调用Windbg到出问题的代码处。
四、Windbg进行本地调试时需要将系统的调试开关打开,命令为:bcdedit -debug on ,重启生效,同理:bcdedit -debug off为关闭调试开关。
五、使用Windbg进行源代码调试驱动程序时必须首先安装与系统相对应的符号文件,如果驱动程序对应的源码名称为QS2HU4.c,在驱动的入口设置断点的命令为bp QS2HU4!DriverEntry,其中QS2HU4为源码文件名、DriverEntry为驱动的入口函数名(相当于C程序中的Main函数),使用WinDbg打开QS2HU4.c文件之后再加载驱动,就会在源码中DriverEntry函数哪一行断下。(Windbg根据符号文件找出DriverEntry函数位置~)。
六、Windbg调试驱动程序出现蓝屏时,可以根据提示输入并执行!analysis -v,查看系统崩溃的详细信息,比如错误码C0000005代表非法内存访问等,虽然也能将定位到出现错误的源代码中的行或具体的某句汇编指令,但是情景复杂的情况往往需要进行栈回溯等等方法寻找出错的根源。
七、Windbg中查看错误码含义的指令为!error 错误码。例如!error 2。
八、栈溢出主要有覆盖返回地址、覆盖虚表指针、覆盖SEH异常处理链表等形式。
九、堆溢出一般发生在指针拆卸出错,可造成固定地址写任意数据、任意地址写固定数据、任意地址写任意数据等,目前此类型漏洞在Windows系列操作系统中发生的不多,在xp sp2之前的操作系统可以通过向系统关键地址处如进程控制块中的指针等。Ps:路由器操作系统中利用堆溢出漏洞进行拒绝服务攻击甚至是远程代码执行还很常见。
十、为了绕过Windows xp sp2及以上操作系统的dep保护机制,可以利用Immunity Debugger调试器的mona插件可以自动生成Rop链(好像是findantidep插件的升级版),当然可能还需要进行手工调试修正,首先把mona插件的python脚本下到手之后放到Immunity Debugger的plugin目录下即可。
十一、在Immunity Debugger的命令行输入!mona rop -m msvcr71.dll -n(前提是笔记十)。-m选项代表从后面的msvcr71.dll中获取rop链,-n代表过滤掉null byte,也就是“X00″,避免Rop数据被类似strcpy的字符串拷贝函数拷贝时被截断出错,命令执行之后就可以得到ruby、python等各种语言格式的Rop链啦~
十二、在使用Immunity Debugger的mona插件时,注意生成的Rop链中如果带有Ascll字样,代表构成Rop的这些数组的每一个字节的十六进制值都是小于0×80(128)的,也就是在Ascll字符表示范围内,使用这种Rop链的一个好处就是可以避免MultiByteToWideChar和WideCharToMutiByte函数对输入数据的ANSIC与宽字符之间的转换,如果漏洞利用调试过程中自己的利用代码出现了类似的小意外不妨从这里找找原因。
十三、IDA:有时候感觉用IDA的图形视图看汇编代码真是一种享受,不过IDA的强大之处还不止此,不仅可以对字符串、函数找到其交叉参考(查看该字符串或函数的调用情况,便于追根溯源),还有出色的代码标注功能及N多强大的插件(⊙o⊙)哦,比如:hexray……
十四、IDA的hexray插件功能非常强大,可以将汇编代码反编译成的类c语言的伪代码,用法也非常简单:在某调用函数反汇编代码的图形视图按下F5键就有惊喜(⊙o⊙)哦(在反汇编代码视图中光标选定位置F5之后就会得到光标所在函数的反编译代码),这技术还不是非常成熟,但是IDA反编译出的结果还算准确,测试时可以把int 3指令反编译成debugbreak()。(最好不要滥用该技能,建议老老实实的看汇编代码,慢慢打基础)。
十五、IDA以静态反汇编出名,也可以进行调试分析的,看菜单工具栏选项或F9快捷键体验一下吧,个人感觉效果、功能虽不如od的动态调试,图形视图下的调试还算不错的,结合Windbg调试就更爽了。。。
十六、如果一些窗体程序使用起来不合你的胃口,比如说对话框太小了、图片太丑了,先不用考虑放弃这个程序,试试ResHacker、eXeScope等资源编辑工具吧,操作简单,还能将一些灰色按钮的限制功能取消掉(找到相应的属性,修改之后再Rebuild),也是进行汉化操作等的利器。
十七、程序加载到内存时需要根据导入表的结构将程序运行所需要的API函数地址填充到IAT(导入函数地址表)的地址,程序运行时导入表的结构是用不到的,所以一些外壳程序会把导入表结构销毁掉,如果在脱壳过程中对其进行Dump内存镜像的操作之后,得到的程序就没有导入表结构,无法提供程序运行时的API地址信息,导致出错。这也就是为什么Dump内存镜像之后要进行导入表修复操作。
十八、硬件断点:常用的CPU都有8个调试寄存器Dr0-Dr7,其中Dr0-Dr3用于存放设置硬件断点的地址(所以硬件断点最多只能设置四个),Dr4-Dr5一般用于保留,Dr6-Dr7用于指示硬件断点的设置个数及属性(读、写中断)等。