前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ROP-Ret2reg详解

ROP-Ret2reg详解

作者头像
偏有宸机
发布2020-11-04 10:17:01
1.5K0
发布2020-11-04 10:17:01
举报
文章被收录于专栏:宸机笔记

利用原理

Ret2reg,即攻击绕过地址混淆(ASLR),返回到寄存器地址。

一般用于开启ASLR的ret2shellcode题型,在函数执行后,传入的参数在栈中传给某寄存器,然而该函数再结束前并为将该寄存器复位,就导致这个寄存器仍还保存着参数,当这个参数是shellcode时,只要程序中存在jmp/call reg代码片段时,即可拼接payload跳转至该寄存器

该攻击方法之所以能成功,是因为函数内部实现时,溢出的缓冲区地址通常会加载到某个寄存器上,在后在的运行过程中不会修改。

也就是说只要在函数ret之前将相关寄存器复位掉,便可以避免此漏洞。

利用思路

主要在于找到寄存器与缓冲区地址的确定性关系,然后从程序中搜索call reg/jmp reg这样的指令

  1. 分析和调试汇编,查看溢出函数返回时哪个寄存值指向传入的shellcode
  2. 查找call reg或jmp reg,将指令所在的地址填到EIP位置,即返回地址
  3. 再reg指向的空间上注入shellcode

例题

由于比较简单,这里就不再演示,需要复现,代码如下(具体步骤可参见底文链接)。

编译命令:

代码语言:javascript
复制
gcc -Wall -g -o ret2reg ret2reg.c -z execstack -m32 -fno-stack-protector

源代码

代码语言:javascript
复制
#include <stdio.h>    
#include <string.h>    
void evilfunction(char *input) {    
    char buffer[512];    
    strcpy(buffer, input);    
}    
int main(int argc, char **argv) {    
    evilfunction(argv[1]);    
    return ;    
}

参考文章:https://blog.csdn.net/sinat_35695255/article/details/52031813

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-02-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 利用原理
  • 利用思路
  • 例题
    • 编译命令:
      • 源代码
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档