Shellcode注入

基础知识

  • Shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中,并将堆栈的返回地址利用缓冲区溢出,覆盖成为指向 shellcode的地址。

实践过程

  • shellcode的生成方法指导书上已经写得很详细了,在做实验时我直接用的是老师上课用的shellcode:

  • 将环境设置为:堆栈可执行、地址随机化关闭

  • 选择anything+retaddr+nops+shellcode的结构构造攻击buf,先猜测返回地址所在位置,并且找到shellcode所在地址

  • 在终端注入这段攻击buf:

  • 先不输入“回车”,在后面的调试过程中需要继续运行的时候再回车,此时再打开另外一个终端,用gdb来调试20145234pwn1这个进程,先找到该进程的进程ID,再打开gdb,用attach指令对该进程进行调试:

  • foo函数进行反汇编:

  • ret处设置断点,接着继续运行到断点处,显示当前esp的值并依照此位置显示接下来的内存地址内容,来分析我们之前猜测的返回地址位置是否正确以及shellcode的地址:

  • 由上图可以推断出shellcode地址为:0xffffd384
  • 继续运行,可以确认返回地址是被我们之前输入的\x01\x02\x03\x04所覆盖的:

  • 将返回地址修改为0xffffd384,重新注入,可以发现已经成功了!

Return-to-libc攻击深入

基础知识

  • Return-into-libc攻击方式不具有同时写和执行的行为模式,因为其不需要注入新的恶意代码,取而代之的是重用漏洞程序中已有的函数完成攻击,让漏洞程序跳转到已有的代码序列(比如库函数的代码序列)。攻击者在实施攻击时仍然可以用恶意代码的地址(比如 libc 库中的 system()函数等)来覆盖程序函数调用的返回地址,并传递重新设定好的参数使其能够按攻击者的期望运行。这就是为什么攻击者会采用return-into-libc的方式,并使用程序提供的库函数。这种攻击方式在实现攻击的同时,也避开了数据执行保护策略中对攻击代码的注入和执行进行的防护。
  • 攻击者可以利用栈中的内容实施return-into-libc攻击。这是因为攻击者能够通过缓冲区溢出改写返回地址为一个库函数的地址,并且将此库函数执行时的参数也重新写入栈中。这样当函数调用时获取的是攻击者设定好的参数值,并且结束后返回时就会返回到库函数而不是 main()。而此库函数实际上就帮助攻击者执行了其恶意行为。更复杂的攻击还可以通过 return-into-libc的调用链(一系列库函数的连续调用)来完成。

实践过程

    • 添加用户:
    • 转换用户,进入32位linux环境,将地址随机化关闭,并且把/bin/sh指向zsh

    • 将漏洞程序保存在/tmp目录下:

    • 编译该代码,使用–fno-stack-protector来关闭阻止缓冲区溢出的栈保护机制,并设置给该程序的所有者以suid权限,可以像root用户一样操作:

    • 创建读取环境变量的程序并编译:

    • 将攻击程序保存在/tmp目录下:

    • 用刚才的getenvaddr程序获得BIN_SH地址:

    • 利用gdb获得systemexit地址:

    • 将上述所找到的三个内存地址填写在20145234exploit.c中:

    • 删除刚才调试编译的20145234exploit程序和badfile文件,重新编译修改后的20145234exploit.c

    • 先运行攻击程序20145234exploit,再运行漏洞程序20145234retlib,攻击成功,获得了root权限:

最新文章

  1. SharePreferences的DB实现
  2. Linux内核零碎知识
  3. [NOIP2014]解方程
  4. python引入导入自定义模块和外部文件
  5. sharepoint 2010 如何使用sharepoint多媒体视频播放media webpart功能
  6. Meth | 安装Linux Mint 18以后grub2 win10启动引导项丢失??!!
  7. altium designer 原理图复制出错
  8. phpcms 一些bug
  9. SQL 数据类型、约束、索引及视图
  10. [SinGuLaRiTy] 高精度算法代码库
  11. 皮尔逊相关系数与余弦相似度(Pearson Correlation Coefficient & Cosine Similarity)
  12. PHP swoole实现redis订阅和发布
  13. IDEA中Git更新合并代码后,本地修改丢失
  14. 如何用Caffe训练自己的网络-探索与试验
  15. [译]Golang中的优雅重启
  16. ElasticSearch 2 (3) - Breaking Changes
  17. POJ 3579 median 二分搜索,中位数 难度:3
  18. Django 内置模板标签和过滤器
  19. HTML基础part1
  20. chromium源码阅读--V8 Embbeding

热门文章

  1. Android Studio 学习之 Android SDK快速更新
  2. 根据自增ID生成不重复序列号
  3. Microsoft visual c++ 14.0 is required问题
  4. 如何转换Xcode里打印的unicode编码日志
  5. ASP.NET Core MVC中Controller的Action如何直接使用Response.Body的Stream流输出数据
  6. 客户端对象模型之列表数据导出到Excel
  7. 用JavaScript编写简单斗地主效果Es6
  8. JQuery中ajaxSubmit,在ie或360兼容,提交后台不能获得参数
  9. redis学习笔记(三)
  10. php设置文件类型content-type