#20212303 2023-2024-2 《网络与系统攻防技术》实验1实验报告

# 20212303 2023-2024-2 《网络与系统攻防技术》实验1实验报告

## 1.实验内容

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

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

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

--

  • 三个实践内容如下:

    • 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
    • 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
    • 注入一个自己制作的shellcode并运行这段shellcode。
  • 这几种思路,基本代表现实情况中的攻击目标:

    • 运行原本不可访问的代码片段
    • 强行修改程序执行流
    • 以及注入运行任意代码。


## 2.实验过程

###2.1下载目标文件pwn1,反汇编。

objdump -d pwn1 | more

###2.2

  • "call 8048491 "是汇编指令
    • 是说这条指令将调用位于地址8048491处的foo函数;
    • 其对应机器指令为“e8 d7ffffff”,e8即跳转之意。
      • 本来正常流程,此时此刻EIP的值应该是下条指令的地址,即80484ba,但如一解释e8这条指令呢,CPU就会转而执行 “EIP + d7ffffff”这个位置的指令。“d7ffffff”是补码,表示-41,41=0x29,80484ba +d7ffffff= 80484ba-0x29正好是8048491这个值,
  • main函数调用foo,对应机器指令为“ e8 d7ffffff”,

    • 让它调用getShell,修改“d7ffffff”为,"getShell-80484ba"对应的补码。
    • 用Windows计算器,47d-4ba得到补码,是c3ffffff。
  • 修改可执行文件,将其中的call指令的目标地址由d7ffffff变为c3ffffff。

  • 进入vim模式

找到d7ff

修改d7为c3 查看汇编后的pwn2,修改成功,再反汇编,查看是否修改成功

分别执行pwn1和pwn2

###2.3通过构造输入参数,造成BOF攻击,改变程序执行流

  • 当程序调用时,会形成自己的栈帧,但是foo函数的缓冲区具有Bufferoverflow漏洞,即向这个缓冲区填入超出长度的字符串,多出来的内容会溢出并覆盖相邻的内存,当我们专门设计好一段字符串后,就有可能会覆盖返回地址,使返回地址指向getShell,达到攻击目的。

    foo函数读入字符串,但系统只预留了28字节的缓冲区,超出部分会造成溢出,我们的目标是覆盖返回地址,所以需要确定那几个字符会覆盖到。

    正常时call调用foo,同时在堆栈上压上返回地址值0x80484ba

  • 确认输入字符串哪几个字符会覆盖到返回地址,先用gdb调试程序,输入32个有规律的字符(1111111122222222333333334444444455555555),发现产生错误溢出,这里可以看到eip的值是5,说明在29-32个字符的范围已经覆盖到堆栈上的返回地址。

对比之前 ==eip 0x34333231 0x34333231== ,正确应用输入 ==11111111222222223333333344444444\x7d\x84\x04\x08==。

构造输入字符串

由为我们没法通过键盘输入\x7d\x84\x04\x08这样的16进制值,所以先生成包括这样字符串的一个文件。\x0a表示回车,如果没有的话,在程序运行时就需要手工按一下回车键。

###2.4

注入Shellcode并执行
  • shellcode就是一段机器指令(code)

    • 通常这段机器指令的目的是为获取一个交互式的shell(像linux的shell或类似windows下的cmd.exe)
    • 所以这段机器指令被称为shellcode。
    • 在实际的应用中,凡是用来注入的机器指令段都通称为shellcode,像添加一个用户、运行一条指令。
  • 对pwn1进行复制,然后关闭堆栈保护,关闭堆栈执行保护(execstack -s),最后关闭地址随机化 (/proc/sys/kernel/randomize_va_space=0)

####构造要注入的payload。

结构为:nops+shellcode+retaddr。
nop一为是了填充,二是作为“着陆区/滑行区”。
我们猜的返回地址只要落在任何一个nop上,自然会滑到我们的shellcode。

  • 选择retaddr+nops+shellcode结构来攻击buf,在shellcode前填充nop的机器码90,为了猜测返回地址填充1234:

    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"' > 20212325_input_shellcode

    \x4\x3\x2\x1将覆盖到堆栈上的返回地址的位置,参考刘老师提供的指导网页上的错误,此处直接使用正确结构(retaddr+nops+shellcode)来进行猜测和覆盖。

  • 注入这段攻击buf:

再开启一个终端 输入shell指令就可以了 ls

## 3.问题及解决方案
- 问题1:由于地址空间随机化(ASLR),导致搜索不到e8d7 或 d7ff

地址空间随机化:

Linux地址空间随机化是一种安全措施,旨在增加系统的安全性,防止恶意攻击者利用已知的漏洞进行攻击。它通过在系统启动或程序运行时随机化内存地址空间的布局,使得攻击者更难以准确定位和利用系统中的关键代码或数据结构。

具体来说,Linux地址空间随机化包括两种主要形式:

  1. 地址空间布局随机化(ASLR):ASLR通过在系统启动或程序加载时随机化内存区域的地址位置,如堆、栈、共享库等,使得攻击者无法准确预测这些区域的位置,从而增加了攻击的难度。

  2. 栈随机化:除了ASLR外,栈随机化是另一种重要的随机化技术,它通过在每次函数调用时随机调整栈的布局,使得攻击者难以准确控制并利用栈上的关键数据结构,如返回地址、局部变量等。

- 问题1解决方案(最后使用kali系统):
- 问题2:文件在UbuntuLinux下不能执行,更换kali系统


- 问题2解决方案:安装kali系统

-问题3:Kali中无法安装软件包。执行不了execstack

问题3解决方案:

第一步:打开sources.list文件

sudo vim /etc/apt/sources.list


第二步:在文件中添加以下内容

deb http://http.kali.org/kali kali-rolling main contrib non-free
deb http://http.kali.org/kali sana main non-free contrib
deb http://security.kali.org/kali-security sana/updates main contrib non-free
deb http://old.kali.org/kali moto main non-free contrib


然后保存退出,再进行更新

sudo apt-get update


## 4.学习感悟、思考等

在进行缓冲区溢出实验时,我深刻体会到了安全漏洞利用的潜在危害以及攻击者可能利用的手段。通过实际操作,我对缓冲区溢出攻击的原理和实现机制有了更深入的理解。这种实验不仅让我认识到了软件系统中存在的安全风险,也提醒了我在编写代码时应该注意避免缓冲区溢出漏洞。例如堆栈保护、堆栈执行保护和地址随机化等技术可以有效防止缓冲区溢出攻击。了解这些防御机制对于提高软件系统的安全性至关重要。

## 参考资料
- [《Java程序设计与数据结构教程(第二版)》](https://book.douban.com/subject/26851579/)
- [《Java程序设计与数据结构教程(第二版)》学习指导](http://www.cnblogs.com/rocedu/p/5182332.html)
- ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值