type
status
date
slug
summary
tags
category
icon
password
这篇文章用于记录在平时做题时遇到的一下比较巧妙的办法。只因懒得给每一道题写wp。
 

特别的沙箱

关于沙箱在之前的文章中对基本的沙箱利用(orw)有详细的文章,可以自行查看。这里主要讲一下禁用程度高的沙箱的利用。
 
这里先放一篇文章,算是目前总结的比较好的沙箱利用
 
然后就是我之前遇到的一道比较逆天的题目,起基本逻辑很简单,就是一个64位的任意shellcode执行。我们输入什么,程序就执行什么,看起来不难但细看就会发现这里的对沙箱的禁用可谓达到了一个可怕的境地,几乎毫无办法。
 
这里就要用的 io_uring的办法对这沙箱进行绕过。
 
notion image
反正具体可以看这里的东西,然后这里可以直接套这道题的板子来就行
 
exp
奇妙的办法,看不懂具体过程,直接当板子用吧。
 
 

命令过滤

直接看这篇文章吧,写的巨好
 

printf函数劫持自己

这是一个比较奇妙的东西,反正就是程序中有一个fmt漏洞,然后紧接这个漏洞就会直接执行exit函数停止程序。
 
这里就可以考虑通过修改printf函数内部的返回地址从而不执行exit,重新执行fmt漏洞。
具体可以看这两篇文章
 
这篇文章对fmt漏洞有详细的利用
 
反正大致流程就是,找到printf函数内部的两个相互指着的链(A地址:B→C→D,B地址:C→D),先修改第一个链,在A处修改c位指向返回地址的E,使得B地址:C→E,然后之前B处修改E为重新开始要执行的地址,这里是两部但要在一个fmt中执行完。
 
写的太简陋了,具体的还是看上面两个大佬的吧
 
注意,在fmt的如果要先修改某一个地址,然后在修改刚刚修改的地址,就是上面的一个fmt执行两步,那有一个点就是不能出现两个($),只能有一个
就要像这里,先通过打印第一步要多少个%p到对应的地址,修改之后才能使用$进行定位。这样我们就可以先创造一个执行每一个命令的地址,然后再通过那个地址,修改命令。使得printf的返回值被我们修改。
 
之后还有一个点,就是如何使用%n修改一个比打印了的数小的数,简单来说就是,当fmt漏洞中,一开始已经打印了0x54个数,之后我要向某一个地方只输入0x32个数,就可以使用远大于一个字节所能表示的范围,从而形成截断的方式写进去。现在我就要再打印(0x100032-0x54),之后再使用%hhn ,程序就会只输入0x32进去。
 
这种方法之后可以使用ogg来得到程序的shell,就是要再printf函数的返回值的下一位上写入ogg,然后再把返回地址写入ret 指令,这样程序就会再执行完printf函数之后执行ret,然后往下执行ogg,拿到shell。
修改的办法反正就是不断的构造指针指向要修改的地址。
notion image
 
 

奇妙gadget

 
_do_global_dtors_aux,单看函数和汇编可能并不会觉得这能有什么用处,但是如果将汇编截断,你可以得到一个这样的 gadget:
 
 
反正就是再没有输出的栈题里如过有上面这个gadget,那就可以先把栈迁移到bss段上,然后执行__libc_start_main bss 中残留 libc
这里注意__libc_start_main 的参数,
read_it是漏洞函数,后面两个是他的参数。
 
然后就可以通过控制ebx的值,从而使bss上的libc 被修改为puts函数的地址,从而拿到libc地址。
这个gadget一般为特别存在的,因此看情况用。
 
奇怪,我当时有一个命令可以用来直接看有没有这gadget,不过我忘了。
 

libc-got劫持

 
这个手法简单来说就是修改libc文件中的got表的内容。
在程序中有的函数内部函数会调用libc文件中的got表的具体函数地址,这个地址所在位置到libc2.39及以下的程序中还是可以修改的RW的权限。
 
如果在程序中遇到可以修改任意地址的漏洞,可以修改libc里的got表里的具体函数的地址
 

docker

可以通过这个命令进入这个容器内部查看容器内部文件内容,
这样会使容器中/lib/libc.so.6 文件复制到当前目录下。
 
在有的题目中会把程序的dockerfile一起放入其中,可以通过这个创建一个docker容器,进入其中拿到远程的libc文件内容,从而拿到版本的具体内容。
 

原地跳转指令

jmp $-52 是一条 x86 或 x86_64 汇编指令,其意思是:
从当前指令位置(即 $)往回跳 52 字节。
如果这里是正的就是往前跳

✅ 分解解释
  • jmp:无条件跳转指令(jump)。
  • $:代表当前指令地址(当前位置)。
  • $-52:表示当前位置减去 52 字节的地址。
  • jmp $-52:也就是跳转到当前指令之前的第 52 字节处

✅ 它的作用
这种跳转通常用于:
用途
说明
🔁 死循环
jmp $ 会一直跳当前地址,而 jmp $-N 会跳到某个固定偏移,形成循环
💥 反调试
用于调试检测,干扰分析流程
🐚 shellcode 自我复制/跳转
很常见于 shellcode 中,将执行流跳回 payload 开始部分
🧪 调试打断点定位
临时代码位置标记

✅ 例子
假设当前地址为 0x401050,则:
等效于:
执行后,程序会无条件跳到地址 0x40101C 继续执行。
 
 
 
 
 
 
 
 
不同libc版本heap技巧patchelf大法通
Loading...
wgiegie
wgiegie
一个苦逼的ctf干饭人🍚
公告
🎉NotionNext 4.5已经上线🎉
-- 感谢您的支持 ---
👏欢迎更新体验👏