基本原理:
1:把我们的shellcode提供给他,让他可以访问shellcode。
2:修改他的返回地址为shellcode的入口地址。
编写一个开启Shell的函数:
shellcode.c ------------------------------------------------------------------------ #include void main() { char *name[2]; name[0] = "/bin/sh" name[1] = NULL; execve(name[0], name, NULL); }
|
利用他人使用strcpy等无边界检查的函数,将这段shellcode.c的二进制数据保存到拥有SID程序的buffer内,使包含buffer的函数返回地址被覆盖,指向buffer中的shellcode入口地址,这样我们就获得了一个拥有root权限的Shell。
我们知道,对于操作系统来说,一个shell下的每一个程序的堆栈段开始地址都是
相同的
。我们可以写一个程序,获得运行时的堆栈起始地址,这样,我们就知道了目标程
序堆栈
的开始地址。
下面这个函数,用eax返回当前程序的堆栈指针。(所有C函数的返回值都放在eax
寄存器
里面):
------------------------------------------------------------------------
------
unsigned long get_sp(void) {
__asm__("movl %esp,%eax");
}
------------------------------------------------------------------------
------
我们在知道了堆栈开始地址后,buffer相对于堆栈开始地址的偏移,是他程序员自己写出来的程序决定的,我们不知道,只能靠猜测了。
对于远程使用者,我们传过去的shellcode就必须负担起打开一个socket,
然后
listen我们的连接,给我们一个远程shell的责任。
如何开一个远程shell呢?我们先申请一个socketfd,使用30464(随便,多少都行
)作为
这个socket连接的端口,bind他,然后在这个端口上等待连接listen。当有连接进
来后,
开一个子shell,把连接的clientfd作为子shell的stdin,stdout,stderr。这样,
我们
远程的使用者就有了一个远程shell(跟telnet一样啦)
原文地址:
阅读(3952) | 评论(0) | 转发(0) |