当前位置: 首页 > 编程日记 > 正文

20154312曾林 - Exp1 PC平台逆向破解

1.逆向及Bof基础实践说明

1.1-实践目标

  • 对象:pwn1(linux可执行文件)
  • 目标:使程序执行另一个代码片段:getshell
  • 内容:
    • 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
    • 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
    • 注入一个自己制作的shellcode并运行这段shellcode。

1.2-基础知识

  • 熟悉Linux基本操作
  • 能看懂常用指令,如管道(|),输入、输出重定向(>)等。
  • 理解Bof的原理。
  • 能看得懂汇编、机器指令、EIP、指令地址。
  • 会使用gdb,vi。

2.直接修改程序机器指令,改变程序执行流程

  • 知识要求、学习目标等指导书中已经写得很清楚了,就不再赘述

2.1-反汇编查看函数地址

对pwn1文件进行反汇编,得到如下结果
906866-20180317234107200-1149910960.png

906866-20180317234120245-726227506.png

中80484b5中的指令为“call 8048491”,具体含义为:

  • 本条指令将调用位于地址8048491处的函数,即foo函数。
  • 本条指令对应机器指令“e8 d7 ff ff ff",可以推测出e8即为跳转之意。

2.2-vi中修改地址,反汇编查看结果

  • 这样的话,d7 ff ff ff肯定对应着8048491,而且明显是通过和另一个值加减运算得到8048491这个地址,利用实验指导书里的计算方法,则可以计算出getshell函数的地址,并将d7 ff ff ff替换成为getshell函数地址相对的值即可。
    906866-20180317234253419-1988808298.png

    root@Zenglin:~/exp1# cp pwn1 20154312
    root@Zenglin:~/exp1# vi pwn2
    1.按ESC键
    2.输入如下,将显示模式切换为16进制模式
    :%!xxd
    3.查找要修改的内容
    /e8d7
    4.找到后前后的内容和反汇编的对比下,确认是地方是正确的
    5.修改d7为c3
    6.转换16进制为原格式
    :%!xxd -r
    7.存盘退出vi
    :wq
    8.再反汇编看一下,call指令是否正确调用getShell
    root@KaliYL:~# objdump -d pwn2 | more
    ...
    080484af <main>:80484af: 55                      push   %ebp80484b0: 89 e5                   mov    %esp,%ebp80484b2: 83 e4 f0                and    $0xfffffff0,%esp80484b5: e8 c3 ff ff ff          call   804847d <getShell>80484ba: b8 00 00 00 00          mov    $0x0,%eax
    9.运行下改后的代码,会得到shell提示符#
    root@Zenglin:~/exp1# ./pwn2
    # ls
    pwn1 20154312

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

3.1 反汇编,了解程序的基本功能

906866-20180317234309835-971831995.png

其实主要是三段函数getshell foo main只要搞清楚三段函数之间的跳转关系,很容易改变函数的执行顺序。

3.2 确认输入字符串哪几个字符会覆盖到返回地址

这主要是一个不断尝试的过程(在不看指导书的情况下),当然如果你看了指导书就可以直接知道哪几个字符会覆盖到返回地址上(我是自己尝试了几遍不同长度的字符串)
906866-20180317234345224-2129913289.png

这张图可以看到eip被0x35353535覆盖了,查ASCII表就可以知道35对应着十进制的5,大概可以猜测是最后的几个5覆盖到了eip上。
906866-20180317234325545-748234820.png

这张图就很明显可以看出来覆盖eip的是1234,现在我们知道字符串中哪几个字符会覆盖eip了,接下来我们就要把字符串中会覆盖eip的字符替换成getshell的地址

3.3 确认用什么值来覆盖返回地址

getShell的内存地址,通过反汇编时可以看到,即0804847d。

接下来要确认下字节序,简单说是输入11111111222222223333333344444444\x7d\x84\x04\x08。

3.4 构造输入字符串

由为我们没法通过键盘输入\x7d\x84\x04\x08这样的16进制值,所以先生成包括这样字符串的一个文件。\x0a表示回车,如果没有的话,在程序运行时就需要手工按一下回车键。

  • 使用16进制查看指令xxd查看input文件的内容是否如预期

906866-20180317234400969-1814558547.png

  • 将input的输入,通过管道符“|”,作为pwn1的输入

906866-20180317234413531-1973845710.png

4. 注入Shellcode并执行

4.1 准备一段Shellcode

shellcode就是一段机器指令(code)

  • 通常这段机器指令的目的是为获取一个交互式的shell(像linux的shell或类似windows下的cmd.exe),
  • 所以这段机器指令被称为shellcode。
  • 在实际的应用中,凡是用来注入的机器指令段都通称为shellcode,像添加一个用户、运行一条指令。

实践采用老师推荐的shellcode。如下:

\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\

4.2 准备工作

  • 先利用apt-get install execstack命令安装execstack软件包

906866-20180317234430914-1576265781.png

  • 进行如下设置

906866-20180317234444751-1479659290.png

4.3 构造要注入的payload

这一部分两种方法我都尝试了,先说第一种

906866-20180317234457810-1711306052.png

先注入这一段字符串,然后利用另一个终端跟踪执行

906866-20180317234512549-2074331706.png

906866-20180317234536740-1685307707.png

906866-20180317234549225-1328991606.png

这一部分是坑,我也就没打算跳,接下来是成功的anything+retaddr+nops+shellcode结构的注入模式。

906866-20180317234559375-1165984783.png

906866-20180317234610179-2096654197.png

到这里注入就已经完成了,nc模拟远程攻击和Bof防御还没完成,完成了的话再上传上来吧。

转载于:https://www.cnblogs.com/zl20154312/p/8593650.html

相关文章:

web App libraries跟referenced libraries的一些问题

该博文内容经参看网上其他资料归纳所成&#xff0c;并注明出处&#xff1a; 问题一&#xff1a;myeclipse中Web App Libraries无法自动识别lib下的jar包&#xff08;http://blog.csdn.net/tiancai1202000/article/details/49178721&#xff09; myeclipse&#xff0c;lib中的ja…

无法在数据库 'ycmis2' 中运行 BEGIN TRANSACTION,因为该数据库处于回避恢复模式。...

alter database ycmis2 set EMERGENCY alter database ycmis2 set online 转载于:https://www.cnblogs.com/qanholas/archive/2011/08/03/2126347.html

exchange2003备份与恢复

exchange2003备份与恢复owa 访问的是在线访问方式。连接到服务器里的访问邮箱&#xff0c;操作邮件是在服务器上.先发一邮件永久删除&#xff0c;直接从服务器里把此邮件删除掉。删除之后。服务器里已没有此邮件。下面就是来恢复邮件临时位置随便写一个存在的路径。恢复之后装载…

入门Promise的正确姿势

Promise是异步编程的一种解决方案&#xff0c;从语法上说&#xff0c;Promise是一个对象&#xff0c;从它可以获取异步操作的消息。 Promise的基本用法 Promise构造函数接受一个函数作为参数&#xff0c;该函数的两个参数分别是resolve和reject。它们是两个函数&#xff0c;由J…

雪花算法 Java 版

雪花算法根据时间戳生成有序的 64 bit 的 Long 类型的唯一 ID 各 bit 含义&#xff1a; 1 bit: 符号位&#xff0c;0 是正数 1 是负数&#xff0c; ID 为正数&#xff0c;所以恒取 041 bit: 时间差&#xff0c;我们可以选择一个参考点&#xff0c;用它来计算与当前时间的时间差…

【matlab】第二次上机课

1、采用complex建立一个复数数组和直接创立一个复数数组&#xff0c;并计算它们的幅度。 代码实现&#xff1a; a complex(1,2);b 1 3i;length1 abs(a)lengthe abs(b)重点&#xff1a; 使用comlex创建复数 用abs求幅度&#xff08;模长&#xff09; 2、将A[0.8147, 0…

运行代码功能尝试

首先定义个文本域并且给个ID <textarea id"O_txt_1" rows"8" cols"80"> <!--要运行的代码--> </textarea> 然后定义个按钮 <input type"button" value"运行代码" οnclick"runCode(O_txt_1)&qu…

删除当前及子文件夹中的空目录

在对文件进行操作的工程中不免会出现空目录的情况&#xff0c;你想怎么去删除那些空目录一个一个去找&#xff0c;然后删除&#xff1f;不会吧&#xff0c;这也太累了&#xff0c;用批处理吧&#xff0c;帮你提高工作效率的&#xff0c;它会准确的判断然后进行删除。 echo off …

基于WebSocket实现聊天室(Node)

基于WebSocket实现聊天室(Node) WebSocket是基于TCP的长连接通信协议&#xff0c;服务端可以主动向前端传递数据&#xff0c;相比比AJAX轮询服务器&#xff0c;WebSocket采用监听的方式&#xff0c;减轻了服务器压力 本文作为学习websocket的练习&#xff0c;实现在线聊天的功能…

Ruby 之 Block, Proc, Lambda 联系--区别,转载

Ruby 之 Block, Proc, Lambda Block Block 不是对象&#xff0c;是Ruby的语言特性&#xff0c;近似于闭包&#xff08;Closure&#xff09;。 范例&#xff1a; def meth res yield "Block called returns #{res}"endputs meth do next “next_value” end #…

【java】牛客网刷题

1、 给出以下代码 public class TestObj{public static void main(String[] args){Object onew Object(){public boolean equals(Object obj){return true;}};System.out.println(o.equals(“Fred”));}}答案&#xff1a; true 总结&#xff1a; 知识点&#xff1a; &…

Winder摆杆不稳除了PID还可能的原因

1.卷径计算有问题。 2.速度限制住了。 转载于:https://www.cnblogs.com/Lion-Ming/p/11104972.html

javascript断点调试方法

http://www.blogguy.cn/show-728-1.html

Python爬虫案例-获取最新的中国行政区域划分

源网页&#xff1a;中国统计局标准 http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2016/ 打开网页后可以分析出行政区域划分共分为5层 根据传入参数&#xff0c;生成网页地址时需要1-3层的只传本身以及 4层及以后的增加当前省份的前缀。 #生成实际需要解析的页面地址 def …

管理分布式session的四种方式。

应用服务器的高可用架构设计最为理想的是服务无状态&#xff0c;但实际上业务总会有状态的&#xff0c;以session记录用户信息的例子来讲&#xff0c;未登入时&#xff0c;服务器没有记入用户信息的session访问网站都是以游客方式访问的&#xff0c;账号密码登入网站后服务器必…

【matlab】第三章数组和数组的运算

&#xff08;一&#xff09;操作练习 1、构建等差数列的方法 代码实现 //方法1A 5:1:10//输出结果A 5 6 7 8 9 10//方法2 A linspace(1,10,3) //输出结果 A 1.0000 5.5000 10.0000 //注意最后的3指的是一共三个元素//等比数列A logspace(0,2,5)//输…

用PHP生成等比图像的方法

PHP代码 <?php /************************************************************************ * 函数名称&#xff1a;createSmallImg() * 函数说明&#xff1a;创建等比例图片 * 输入参数&#xff1a;$dir 保存路径$source_img 原图片名称$small_ex 缩率图文件名后缀$maxw…

ARM7启动代码

1:PRESERVE8: Reguire8和Preserve8 C和汇编有8位对齐的要求&#xff0c;这两个伪指令可以满足此要求&#xff0c;存在REQUIRE8<——> PRESERVE8的对应关系&#xff0c;但不是说有一个REQUIRE8就要有一个 PRESERVE8&#xff0c;如果是一个c文件和一个汇编文件的调用&#…

一次完整请求的日志

一次完整请求的日志&#xff1a;各种配置文件&#xff1a;spring-mvc.xml<?xml version"1.0" encoding"UTF-8"?><beans xmlns"http://www.springframework.org/schema/beans" rel"nofollow"" target"_blank"…

Aveva Marine C# 二次开发入门001

1# 引用 C:\AVEVA\Marine\OH12.1.SP4\Aveva.ApplicationFramework.dll C:\AVEVA\Marine\OH12.1.SP4\Aveva.ApplicationFramework.Presentation.dll 2# 引用命名空间&#xff0c; using Aveva.ApplicationFramework.Presentation;using Aveva.ApplicationFramework; 3# 继承接口…

搜集《ASP.NET中常用的26个优化性能方法》

1. 数据库访问性能优化    a.数据库的连接和关闭    访问数据库资源需要创建连接、打开连接和关闭连接几个操作。这些过程需要多次与数据库交换信息以通过身份验证&#xff0c;比较耗费服务器资源。ASP.NET中提供了连接池(Connection Pool)改善打开和关闭数据库对性能的影响…

【matlab】我要自学网笔记总结 1.3

1.3 1、在matlab的命令行窗口可以直接进行数学运算 2、π 和平方的使用 S pi*r^2 3、如果输入一个多位小数&#xff0c;输出时只显示小数点后四位&#xff0c;但计算的时候使用的是真实值。 如果要改变显示的位数 &#xff08;1&#xff09;可以在 预设 - 命令行窗口 - 数值…

IT规划的企业应用实践(6)研究背景 之 企业信息化建设的诉求

研究背景 之 企业信息化建设的诉求 从实践角度看&#xff0c;企业信息化建设的诸多问题和诉求&#xff0c;可以归纳为以下几个方面&#xff1a; 1. IT系统本身&#xff1a; l 面对成本的压力和客户的要求&#xff0c;在流程方面、运作方面离不开IT支持&#xff0c;IT系统如何支…

Codeforces Gym100812 L. Knights without Fear and Reproach-扩展欧几里得(exgcd)

补一篇以前的扩展欧几里得的题&#xff0c;发现以前写错了竟然也过了&#xff0c;可能数据水&#xff1f;&#xff1f;&#xff1f; 这个题还是很有意思的&#xff0c;和队友吵了两天&#xff0c;一边吵一边发现问题&#xff1f;&#xff1f;&#xff1f; L. Knights without F…

Tarjan无向图连通性

割点&#xff1a;去掉某点x&#xff0c;该无向图分割成两部分&#xff08;及以上&#xff09; 割边&#xff1a;去掉某条边x&#xff0c;该无向图分割成两部分&#xff08;及以上&#xff09; 时间戳&#xff1a;在搜索树上的遍历序号dfn 追溯值&#xff1a;subtree子树和非搜索…

php去除字符串首尾空格(包括全角)(转)

<? $str" dfdfdf曊壷顳 道德观第三附属 "; $str mb_ereg_replace(^( | ), , $str); $str mb_ereg_replace(( | )$, , $str); echo mb_ereg_replace( , "\n ", $str); ?>转载于:ht…

【单片机】写电子钟时遇到的问题

1、<> 与""的区别 1、<> 先去系统目录中找头文件&#xff0c;如果没找到再去当前目录下找。 所以一般用于向标准的头文件如 studio.h 和 stdlib.h 等方法。 2、"" 首先在当前目录下寻找&#xff0c;如果找不到在去系统目录下寻找。这个用于自…

什么是业务组件?

海浪给大家分享了一些关于业务组件的文章&#xff0c;但是什么是业务组件呢&#xff1f;海浪转载了yongtree写的这篇文章。业务组件是一系列不可分割的业务活动&#xff0c;是构建专业化企业的功能模块。业务组件的优势在很大程度上来源于其具备两个相关但截然不同的特性&#…

3.3.2 函数参数不得不说的几件事

函数定义时圆括号内是使用逗号分隔开的形式参数列表&#xff08;parameters&#xff09;&#xff0c;一个函数可以没有参数&#xff0c;但是定义和调用时一对圆括号必须要有&#xff0c;表示这是一个函数并且不接受参数。函数调用时向其传递实参&#xff08;arguments&#xff…