zoukankan      html  css  js  c++  java
  • 2017-2018-2 《网络对抗技术》 20155310 第二周 Exp1 PC平台逆向破解(5)M

    2017-2018-2 《网络对抗技术》 20155310 第二周 Exp1 PC平台逆向破解(5)M

    一、实践目标

    1.1实践介绍

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

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

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

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

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

    反汇编指令:objdump -d xxx

    将显示模式切换为16进制模式:%!xxd

    转换16进制为原格式:%!xxd -r

    实验一:

    将目标文件20155310pwn1,反汇编。

    1.用反汇编指令

    objdump -d 20155310pwn1
    

    指令查看20155310pwn1文件即pwn1的副本的反汇编结果;

    2.打开20155310pwn1文件;

    vi 20155310pwn1
    

    3.将文件转换为十六进制显示;

    :%!xxd
    

    4.查找需要修改的内容;

    /e8d7
    

    5.将d7改为c3;

    6.修改完毕后改回原格式;

    :%!xxd -r
    


    7.保存并退出;

    8.运行20155310pwn1.

    实验二:

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

    2.1确认输入字符串哪几个字符会覆盖到返回地址

    如果输入字符串1111111122222222333333334444444412345678,那 1234 那四个数最终会覆盖到堆栈上的返回地址,进而CPU会尝试运行这个位置的代码。那只要把这四个字符替换为 getShell 的内存地址,输给pwn1,pwn1就会运行getShell

    2.2 确认用什么值来覆盖返回地址

    getShell的内存地址,通过反汇编时可以看到,即0804847d。

    接下来要确认下字节序,简单说是输入11111111222222223333333344444444x08x04x84x7d,还是输入11111111222222223333333344444444x7dx84x04x08。
    对比之前 == eip 0x34333231 0x34333231== ,正确应用输入 ==11111111222222223333333344444444x7dx84x04x08 ==。

    2.3构造输入字符串

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

    实验三

    注入Shellcode并执行

    3.1 准备一段Shellcode

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

    3.2 准备工作

    修改些设置。这部分的解释请看第5小节Bof攻击防御技术.

    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
    

    3.3 构造要注入的payload。

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

    ◦retaddr+nop+shellcode

    ◦nop+shellcode+retaddr。

    因为retaddr在缓冲区的位置是固定的,shellcode要不在它前面,要不在它后面。
    简单说缓冲区小就把shellcode放后边,缓冲区大就把shellcode放前边

    --
    我们这个buf够放这个shellcode了

    结构为:nops+shellcode+retaddr。

    ◦nop一为是了填充,二是作为“着陆区/滑行区”。

    ◦我们猜的返回地址只要落在任何一个nop上,自然会滑到我们的shellcode。

    打开一个终端注入这段攻击buf:

    root@KaliYL:~# (cat input_shellcode;cat) | ./pwn1
    ������1�Ph//shh/bin��PS��1Ұ
                               �
    

    再开另外一个终端,用gdb来调试pwn1这个进程。

  • 相关阅读:
    自动刷新页面
    超链接<A>链接到某个文档
    JS脚本的对话框
    表最后更新的标识列
    c#对象私有属性在重载Equals中的使用
    一个关于在Fedora下安装jdk的问题
    表格的行转列
    UNION和UNION ALL的区别
    关于使用存储过程的一些好处以及注意事项[转]
    SQL 外链接操作小结
  • 原文地址:https://www.cnblogs.com/m20155310/p/8602880.html
Copyright © 2011-2022 走看看