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