关于libc-got hijack
0x00在湾区杯2025的题目 digtal_bomb 中,除了复现过的house of cat打法,还有另一种打法:libc-got hijack,学习一下参考博客 https://veritas501.github.io/2023_12_07-glibc_got_hijack%E5%AD%A6%E4%B9%A0/ https://github.com/n132/Libc-GOT-Hijacking 0x01 libc-got关于got表和plt表的组合机制我们已经了解,其在可执行文件的作用往往就是解析libc函数的加载地址,然而,libc共享库文件本身也是存在got表和plt表的就以Ubuntu GLIBC 2.35-0ubuntu3.11来调试;这里有一个小插曲:我们使用 gdb 调试libc.so.6时候,发现运行会有 12345678910111213pwndbg> rStarting program: /home/r3t2/ctf/pwn_demos/libc-got/libc.so.6warning: Unable to find...
黄鹤杯2025
0x00黄鹤杯也是光荣爆0,师傅们都卡在同一步了(悲)拖到现在复现了一下 0x01 题目分析逆向后的源码如下 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980void __fastcall __noreturn main(int argc, char **argv, char **envp){ int n1131796; // [rsp+14h] [rbp-Ch] int instruction_pointer; // [rsp+18h] [rbp-8h] n1131796 = 0; init_vm(); puts("Please input your op:"); read(0, vm_context->instruction_buffer, 0x100uLL); while...
关于house of corrosion
0x00网谷杯没报名上没打成,但是题目不算难,其中一道堆题用到了house of corrosion,学习一下参考博客https://xz.aliyun.com/news/6458https://www.anquanke.com/post/id/263622源码分析为glibc2.35这个手法也有针对tcache的变体,这里姑且先只分析针对fastbins的手法,后续再说(咕咕)到 glibc2.37 之后,global_max_fast 的类型被修改为 int8_t,使用该技巧可以控制的地址范围大大缩小。 0x01 global_max_fast 与 fastbinsY在malloc的初始化时,会设置全局变量global_max_fast的值 123456789101112131415161718192021222324252627282930/* Initialize a malloc_state struct. This is called from ptmalloc_init () or from _int_new_arena () when...
记栈上格式化字符串漏洞利用
0x00上次仅仅有栈地址的低两字节,一次非栈上格式化字符串利用的比较极限的题打完,现在又碰到一个啥都不给的栈上格串题,但好在静态链接,有后门函数,分析一下参考博客 https://bbs.kanxue.com/thread-281920.htm 0x01 只有一次机会的栈上fmtstr题目 ida 看一眼 12345678910111213141516int __fastcall main(int argc, const char **argv, const char **envp){ int v3; // edx int v4; // ecx int v5; // r8d int v6; // r9d char buf[104]; // [rsp+0h] [rbp-70h] BYREF unsigned __int64 v9; // [rsp+68h] [rbp-8h] v9 = __readfsqword(0x28u); init_0(argc, argv, envp); puts("one printf"); ...
关于house of cat
0x00湾区杯被堆题斩于马下,赛后找到powchan的exp,利用堆风水打house of cat,并且相比于板子,更特殊的点就是打stdout并修改mode为**-1**,不需要__malloc_assert、exit或者是fflush来触发。另一个题解则是打libc-got姑且先学习一下常规的house of cat参考博客 https://bbs.kanxue.com/thread-273895.htm https://nicholas-wei.github.io/2022/08/02/house-of-cat/ https://zikh26.github.io/posts/7de5a5b7.html 本文贴出源码无特别提及皆为glibc2.35 0x01 __malloc_assert正常情况下,glibc 的断言失败会走 __assert_fail(在 <assert.h> 里定义)。而在 malloc 的时候,它单独定义了一个版本,走 __malloc_assert,这样方便在 malloc...
关于ret2dlresolve
0x00时值 moectf2025 ,出了一题打ret2dlresolve(虽然仍然可以打ret2libc),回想起自从学习了re2dlresolve后几乎没碰到过只能打这个的题,所以也没有记录,于是借此机会记录一下参考博客https://xz.aliyun.com/news/17612 0x01 延迟绑定流程 PLT与GOT炒炒冷饭( 延迟绑定流程初次调用 解析完成后,后续调用 我们简单验证一下,调用前 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667pwndbg> pltSection .plt 0x401020 - 0x401070:No symbols found in section .pltSection .plt.sec 0x401070 - 0x4010b0:0x401070: write@plt0x401080: strlen@plt0x401090:...
从一个问题出发的关于printf中处理fmtstr部分源码分析
0x00在第六届强网拟态线下赛的一道格式化字符串漏洞题目中,遇到了一个情况没有想通,找了个时间分析了一下 printf的源码(glibc2.31),分析清楚原因了 0x01 issue奇怪合理的现象 123payload = '%{}c'.format(printf_ret).encode() + b"%11$hn" + \ '%{}c'.format(0x10000 - printf_ret + 0x23).encode() + b"%39$hhn"io.send(payload) 最初我是这样写的,调试发现仅仅成功修改了跳板,而目标,也就是printf的返回地址却没有修改到 123payload = b'%p'*9 + '%{}c'.format(printf_ret - 90).encode() + b"%hn" + \ ...
关于house of botcake
0x00在tcache_key的引入后,tcache poisoning的利用不再那么方便,我们如果想继续利用 Tcache Double Free 的话,一般可以采取以下的方法: 破坏掉被 free 的堆块中的 key,绕过检查(常用) 改变被 free 的堆块的大小,遍历时进入另一 idx 的 entries House of botcake(常用) 以下就以how2heap的源码(glibc2.35)来调试分析一下house of botcake这个手法 0x01 house of botcake 原理调试用的源码 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687#include <stdio.h>#include <stdlib.h>#include...
在heap中进行ROP
0x00堆题开沙箱,越做越心慌前文 0x01 利用 setcontextsetcontext函数是libc中一个独特的函数,它的功能是传入一个 SigreturnFrame 结构指针,然后根据 SigreturnFrame 的内容设置各种寄存器。 因此从 setcontext+53(不同 libc 偏移可能不同)的位置开始有如下 gadget,即根据 rdi 指向的 SigreturnFrame 结构设置寄存器 123456789101112131415161718//glibc2.270x7ffff7852085 <setcontext+53> mov rsp, qword ptr [rdi + 0xa0]0x7ffff785208c <setcontext+60> mov rbx, qword ptr [rdi + 0x80]0x7ffff7852093 <setcontext+67> mov rbp, qword ptr [rdi + 0x78]0x7ffff7852097...
关于SROP
0x00想起来好像没学,学一下 0x01 前置知识 signal机制signal机制是类 unix 系统中进程之间相互传递信息的一种方法。一般,我们也称其为软中断信号,或者软中断。比如说,进程之间可以通过系统调用 kill 来发送软中断信号。一般来说,信号机制常见的步骤如下图所示: 内核向某个进程发送 signal 机制,该进程会被暂时挂起,进入内核态。内核会为该进程保存相应的上下文,主要是将所有寄存器压入栈中,以及压入 signal 信息,以及指向 sigreturn 的系统调用地址。此时栈的结构如下图所示,我们称 ucontext 以及 siginfo 这一段为 SignalFrame。需要注意的是,这一部分是在用户进程的地址空间的。之后会跳转到注册过的 signal handler中处理相应的 signal。因此,当 signal handler 执行完之后,就会执行 sigreturn 代码。 对于 signal Frame 来说,会因为架构的不同而有所区别,这里给出 x64 的...