20145231熊梓宏《网络对抗》逆向及Bof基础
20145231网络对抗《逆向及Bof基础》
实验目的与要求
1.本次实践的对象是一个名为pwn1的linux可执行文件。
2.若该程序正常执行,则main函数会调用foo函数,foo函数会简单回显任何用户输入的字符串。
●该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。
3.本次实践主要是学习两种方法:
●利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
●攻击目标:
运行原本不可访问的代码片段
强行修改程序执行流
以及注入运行任意代码。
实验内容
直接修改程序机器指令,改变程序执行流程
●在正式开始实践之前,先对pwn1文件做个备份,以便修改后可以及时恢复到初始状态:

●使用指令objdump -d 20145231 | more对目标文件进行反汇编,查看三个核心函数的反汇编结果:


●程序正常运行时是不会执行getShell函数的,而我们的目的就是想让程序调用getShell,因此就要想办法让call指令跳转到getShell的起始地址执行,只要修改“d7ffffff”为"getShell-80484ba"对应的补码就行。用Windows计算器,直接47d-4ba就能得到补码,是c3ffffff。

●接下来就对可执行文件进行修改,先输入指令vi 20145231,用vim编辑器查看可执行文件20145231;接着输入:%!xxd,将显示模式切换为16进制模式;输入/e8 d7查找要修改的内容:


●按i键将模式改为插入模式,修改d7为c3;输入:%!xxd -r转换16进制为原格式,然后存盘退出
此时再反汇编看一下,发现原汇编指令已经被成功修改:


●运行下改后的代码,得到了shell提示符
●通过构造输入参数,造成BOF攻击,改变程序执行流
●通过对foo函数进行分析,可以发现系统只预留了一定字节的缓冲区,超出部分会造成溢出,因此这个函数存在BOF漏洞,而我们的目标就是覆盖它的返回地址。
●进过尝试发现,当输入达到28字节时产生溢出Segmentation fault:

●接下来我们通过gdb调试来确认输入字符串的哪几个字符会覆盖到返回地址,输入info r查看各寄存器的值:

●查看eip的值,是ASCII 1234,也就是说我们输入的“1234”覆盖了它的地址,所以我们只需要将getshell的内存地址替换这4个字符,就可以达到程序向getshell函数转移的目的。
●我们要构造一串特殊的输入,由于getShell的内存地址是0x0804847d,而其对应的ASCII没有字符,所以我们通过一个简单的perl脚本语言来构造输入值,输入:perl -e 'print "12345678123456781234567812345678\x7d\x84\x04\x08\x0a"' > input,使用16进制查看指令xxd查看input文件的内容是否如预期:


然后将input的输入,通过管道符“|”,作为可执行文件20145231的输入:

相关知识总结
●Linux相关指令
●管道命令
管道就是将输出在标准输出中的信息一次次处理最终打印在标准输出中,所以管道命令必须是接受标准输出的命令,cp、mv、ls都不是管道命令。
用法: command 1 | command 2,它的功能是把第一个命令command 1执行的结果作为command 2的输入传给command 2。
举例:
ls -l | more:该命令列出当前目录中的任何文档,并把输出送给more命令作为输入,more命令分页显示文件列表。
●重定向操作符
>:将命令输出写入文件或设备,而不是命令提示符或句柄
<:从文件而不是从键盘或句柄读入命令输入
>>:将命令输出添加到文件末尾而不删除文件中已有的信息
>&:将一个句柄的输出写入到另一个句柄的输入中
<&:从一个句柄读取输入并将其写入到另一个句柄输出中
●常用汇编指令
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指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。
●常用寄存器
EAX:通用寄存器。相对其他寄存器,在进行运算方面比较常用。在保护模式中,也可以作为内存偏移指针(此时,DS作为段 寄存器或选择器)
EBX:通用寄存器。通常作为内存偏移指针使用(相对于EAX、ECX、EDX),DS是默认的段寄存器或选择器。在保护模式中,同样可以起这个作用。
ECX:通用寄存器。通常用于特定指令的计数。在保护模式中,也可以作为内存偏移指针(此时,DS作为 寄存器或段选择器)。
EDX:通用寄存器。在某些运算中作为EAX的溢出寄存器(例如乘、除)。在保护模式中,也可以作为内存偏移指针(此时,DS作为段 寄存器或选择器)。
ESI:通常在内存操作指令中作为“源地址指针”使用。当然,ESI可以被装入任意的数值,但通常没有人把它当作通用寄存器来用。DS是默认段寄存器或选择器。
EDI:通常在内存操作指令中作为“目的地址指针”使用。当然,EDI也可以被装入任意的数值,但通常没有人把它当作通用寄存器来用。DS是默认段寄存器或选择器。
EBP:这也是一个作为指针的寄存器。通常,它被高级语言编译器用以建造‘堆栈帧'来保存函数或过程的局部变量,不过,还是那句话,你可以在其中保存你希望的任何数据。SS是它的默认段寄存器或选择器。
注:
●保护模式下分段机制的内存寻址:
保护模式下,分段机制是利用一个称作段选择符的偏移量,从而到描述符表找到相应的段描述符,而这个段描述符中就存在着真正的段的物理首地址,加上偏移量。
●EAX表示16位寄存器
●EIP寄存器总是指向下一条要执行的指令
●ALU逻辑计算单元
●机器指令与汇编语言存在对应关系(每组二进制数代表相应的指令)
●缓冲区溢出攻击是针对返回地址的攻击
心得体会
通过此次实验,了解了缓冲区溢出的基本原理,知道了如何实现缓冲区溢出,如何利用缓冲区溢出改变程序的执行,同时复习了汇编语言,复习了Linux的管道等指令,知道了ASC码转16进制的指令,颇有收获,再接再厉。
20145231熊梓宏《网络对抗》逆向及Bof基础的更多相关文章
- 20145231熊梓宏 《网络对抗》 实验9 Web安全基础实践
20145231熊梓宏 <网络对抗> 实验9 Web安全基础实践 基础问题回答 1.SQL注入攻击原理,如何防御? •SQL注入攻击就是通过把SQL命令插入到Web表单递交或输入域名或页面 ...
- 20145231熊梓宏 《网络对抗》 实验8 Web基础
20145231熊梓宏 <网络对抗> 实验8 Web基础 基础问题回答 ●什么是表单? 表单是一个包含表单元素的区域,表单元素是允许用户在表单中输入信息的元素,表单在网页中主要负责数据采集 ...
- 20145231熊梓宏 《网络对抗》 实验5 MSF基础应用
20145231熊梓宏 <网络对抗> 实验5 MSF基础应用 基础问题回答 1.用自己的话解释什么是exploit,payload,encode? exploit就相当于是就是渗透攻击,其 ...
- 20145231熊梓宏 《网络对抗》 Bof逆向基础.shellcode注入
20145231网络对抗<逆向及Bof基础>shellcode注入 实验目的与要求 1.本次实践的对象是一个名为pwn1的linux可执行文件. 2.若该程序正常执行,则main函数会调用 ...
- 20155222卢梓杰 实验一 逆向及Bof基础
实验一 逆向及Bof基础 1.实验对象为32位可执行文件pwn1,这个程序主要有main.foo.getshell这三个函数,其中foo函数功能为输出输入的字符串,getshell函数功能为打开一个s ...
- 20155311高梓云《网络对抗》逆向及Bof基础
20155311高梓云<网络对抗>逆向及Bof基础 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任 ...
- 网络对抗实验一 逆向及Bof基础实践
网络对抗实验一 逆向及Bof基础实践 一.实验目的 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. ...
- 20145203盖泽双 《网络对抗技术》实践1—— MAL_逆向与Bof基础
20145203盖泽双 <网络对抗技术> MAL_逆向与Bof基础 实践目标 (1)我们要通过修改程序代码,使得程序运行其自身中本不该运行的代码片段. (2)在这里,我们有一个名为2014 ...
- 20155201 李卓雯 《网络对抗技术》实验一 逆向及Bof基础
20155201 李卓雯 <网络对抗技术>实验一 逆向及Bof基础 一.实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,f ...
随机推荐
- 使用ganymed工具调用ssh2
需要引入ganymed-ssh2-build210.jar包. 其实很简单.所以直接贴代码,代码说话. package com.eshore.framework.util; import java.i ...
- 【Python算法】渐进记法 与 性能测量工具cProfile
对于某个比较简单的算法,我们有时候确实能够精确地分析出算法的复杂度. 比如算法复杂度为5n^2+10n+6,但是事实上并不需要这样,因为当n足够大时,可以忽略掉低阶项和最高次项的系数,因此就引出了“渐 ...
- TabBar变透明
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackTranslucent animated:YES];
- 剑指Offer——合并两个排序的链表
题目描述: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 分析: 苦力活,使用两个指针分别指向未被合并的两个链表的首部,比较两个首部数值的大小,合并数值 ...
- 永久解决delphi 2010不能2次启动问题
由于在Windows安装了最近的更新(KB2982791, KB2970228)后,Delphi的IDE需要创建的一个文件%TEMP%\EditorLineEnds.ttr会被系统锁定,导致除非重新启 ...
- LInux中ThreadInfo中的preempt_count字段
最近看各种上下文,发现和ThreadInfo中的preemption字段密切,于是便调查了下. 看下Linux源码中的注释: /* * We put the hardirq and softirq c ...
- 分类,logistic回归
1. 使用回归进行分类 机器学习中分类是指输入一个样本点,输出这个样本点所属的类别,预测的是一个离散值,如类别(1,2). 而回归问题是输入一个样本点,预测一个值,这个值是连续值,可以介于\([1,2 ...
- freemarker学习#1
在工作的过程中遇到了.ftl文件.打开发现里面是一些类似于html的代码,非常好奇这是一种什么样的文件,于是去网上搜了一下,了解到.ftl是Freemarker模板的文件后缀名.将问题转移到了Free ...
- mysql 数据库查询最后两条数据
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u011925175/article/details/24186917 有一个mysql数据库的 ...
- G729 详细使用文档
https://tools.ietf.org/html/rfc4749 git://git.linphone.org/linphone-android.git http://stackoverflow ...