__fini_array劫持

博客介绍了如何利用x64静态编译程序的fini_array进行漏洞利用。首先劫持fini_array以实现任意地址写升级,接着在特定地址构造ROP链,最后修改fini_array来触发栈迁移,从而达到exploit的目的。
摘要由CSDN通过智能技术生成

3×17

x64静态编译程序的fini_array劫持

1 劫持fini_array,循环写

劫持fini_array[1]为main函数地址,fini_array[0]为__libc_csu_fini,将长度为18的任意地址写升级为长度无限制的任意地址写

2 栈迁移,构造ROP chain

在0x4b40f0+0x10地址处构造ROP chain

ROP chain:

#syscall('/bin/sh\x00',0,0)
pop_rax
0x3b		;syscall入栈
pop rdi
addr of "/bin/sh\x00" ;参数一
pop rsi
0					;参数二
pop rdx
0					;参数三
syscall
在这里插入代码片

3 再次修改fini_array,exploit

构造完ROP chain之后,将fini_array[0]改为’leave;ret’,将fini_array[1]改为’ret’。这样,在执行完main函数(即fini_array[1])之后,程序去执行位于fini_array[0]的’leave;ret’,执行完之后,rip=fini_array[1],rsp=0x4b40f0+0x10。此时,fini_array[1]存放着我们放入的ret,这样,eip的值就被修改为了0x4b40f0+0x10。这也就是上一步我们将ROP链放在这个地址的原因。
leave指令做以下操作

mov rsp,rbp
pop rbp

DASCTF Memory_Monster_II

查看保护

在这里插入图片描述

IDA查看

调试

用gdb将程序运行起来,发现__fini_array地址处可写
在这里插入图片描述
ex

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值