• # 《网络对抗》Exp1 PC平台逆向破解20155337祁家伟


    《网络对抗》Exp1 PC平台逆向破解20155337祁家伟

    实践目标

    本次实践的对象是一个名为pwn1的linux可执行文件。
    该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。

    该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。

    一、基础知识学习

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

    • NOP:NOP指令即“空指令”。执行到NOP指令时,CPU什么也不做,仅仅当做一个指令执行过去并继续执行NOP后面的一条指令。(机器码:90)

    • JNE:条件转移指令,如果不相等则跳转。(机器码:75)

    • JE:条件转移指令,如果相等则跳转。(机器码:74)

    • JMP:无条件转移指令。段内直接短转Jmp

    • CMP:比较指令,功能相当于减法指令,只是对操作数之间运算比较,不保存结果。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。

    2、管道的基础学习

    管道的概念:

    管道是一种最基本的IPC机制,作用于有血缘关系的进程之间,完成数据传递。调用pipe系统函数即可创建一个管道。有如下特质:

    其本质是一个伪文件(实为内核缓冲区)

    由两个文件描述符引用,一个表示读端,一个表示写端。

    规定数据从管道的写端流入管道,从读端流出。

    管道的原理: 管道实为内核使用环形队列机制,借助内核缓冲区(4k)实现。

    管道的局限性:

    ① 数据自己读不能自己写。

    ② 数据一旦被读走,便不在管道中存在,不可反复读取。

    ③ 由于管道采用半双工通信方式。因此,数据只能在一个方向上流动。

    ④ 只能在有公共祖先的进程间使用管道。

    常见的通信方式有,单工通信、半双工通信、全双工通信。

    3、管道常用命令

    1、cut,将一行内的数据进行分解

    cut -d '分隔符' -f fields

    cut -c 字符范围

    -f 取出第几段的意思 ,从1开始

    2、grep 分析一行数据

    grep [-acinv] [--color=auto] 'string' filename

    -c 计算找到string的次数

    -i 忽略大小写

    -n 顺便输出行号

    -v 反向选择,输出没有string的行

    --color=auto 将找到的string加上颜色显示

    3、uniq去重

    uniq [-ic]

    -i:忽略大小写

    -c:计数

    4、tee双重重定向,将数据传送到文件和屏幕

    tee [-a] file

    -a 已累累加的方式添加到文件

    4、输出重定向(>)

    linux shell下常用输入输出操作符是:

    标准输入 (stdin) :代码为 0 ,使用 < 或 << ; /dev/stdin -> /proc/self/fd/0 0代表:/dev/stdin

    标准输出 (stdout):代码为 1 ,使用 > 或 >> ; /dev/stdout -> /proc/self/fd/1 1代表:/dev/stdout

    标准错误输出(stderr):代码为 2 ,使用 2> 或 2>> ; /dev/stderr -> /proc/self/fd/2 2代表:/dev/stderr

    二、实验内容

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

    下载目标文件pwn1,输入objdump -d pwn1反汇编得到下图代码(部分)。

    然后为了直接执行getshell部分的功能,我们需要把call的地址进行修改,经计算,需要把d7改成c3,修改指令比较简单,具体详细指令如下:

    1.输入如下,将显示模式切换为16进制模式
    :%!xxd

    2.查找要修改的内容
    /e8 d7

    3.找到后前后的内容和反汇编的对比下,确认是地方是正确的

    4.修改d7为c3

    修改后运行成功截图如下:

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

    这一实验操作需要用到gdb,来进行调试,从而达到找到具体需要修改的地址的目的。

    首先构造输入字符串

    因为我们没法通过键盘输入x7dx84x04x08这样的16进制值,所以先生成包括这样字符串的一个文件。x0a表示回车,如果没有的话,在程序运行时就需要手工按一下回车键。

    关于Perl: Perl是一门解释型语言,不需要预编译,可以在命令行上直接使用。 使用输出重定向“>”将perl生成的字符串存储到文件input中。

    可以使用16进制查看指令xxd查看input文件的内容是否如预期。

    然后将input的输入,通过管道符“|”,作为pwn1的输入。

    运行成功如图:

    3、注入Shellcode并执行

    首先准备一段Shellcode

    shellcode就是一段机器指令(code) 通常这段机器指令的目的是为获取一个交互式的shell(像linux的shell或类似windows下的cmd.exe), 所以这段机器指令被称为shellcode。 在实际的应用中,凡是用来注入的机器指令段都通称为shellcode,像添加一个用户、运行一条指令。

    先安装execstack

    然后进行配置

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

    构造要注入的payload。

    Linux下有两种基本构造攻击buf的方法:

    retaddr+nop+shellcode

    nop+shellcode+retaddr。
    我们这个buf够放这个shellcode了

    结构为:nops+shellcode+retaddr。

    nop一为是了填充,二是作为“着陆区/滑行区”。 我们猜的返回地址只要落在任何一个nop上,自然会滑到我们的shellcode。

    输入命令gdb进行调试 通过设置断点,来查看注入buf的内存地址

    所以计算出地址应为0xffffd330

    修改地址后进行攻击,攻击成功:

  • 相关阅读:
    mac os programming
    Rejecting Good Engineers?
    Do Undergrads in MIT Struggle to Obtain Good Grades?
    Go to industry?
    LaTex Tricks
    Convert jupyter notebooks to python files
    How to get gradients with respect to the inputs in pytorch
    Uninstall cuda 9.1 and install cuda 8.0
    How to edit codes on the server which runs jupyter notebook using your pc's bwroser
    Leetcode No.94 Binary Tree Inorder Traversal二叉树中序遍历(c++实现)
  • 原文地址:https://www.cnblogs.com/Twe1vE/p/8603661.html
Copyright © 2020-2023  润新知