格式化字符串漏洞printf机制理解
前言这篇文章是,neise1群聊里的paradox师傅写的,我觉得不错的,在师傅的强烈要求下,neise1就把这篇文章发在了本人的博客上 格式化字符串漏洞偏移——在printf机制下的理解参数传递规则:在 x86 (32位) 中,所有参数都压入栈 (Stack) (64位下)前 6 个参数通过寄存器(rdi, rsi, rdx, rcx, r8, r9)传递,剩下的才压入栈 参数是如何传递的: 32位下,依照 从右向左 的压入规则, printf(“%d %x”, a, b) 如上述代码,当执行此段代码时 会将 b,a,指向”%d %x”的地址依次压入栈中 内存地址 存储 内容备注 高 0xffffff10 0x00000002 参数 b 0xffffff0c 0x...
NCTF 2026 WP (ezheap)
前言通过这道题,新学到不少知识点,所以neise1觉得有必要单独写一篇来讲这道题,本来neise1想打IO的(毕竟当时刚学完,嘻嘻),结果完全没有能正常调用的IO函数,于是就懵了,这还是经大佬指点才搞明白的。 漏洞分析堆题常见的保护全开,那让我们来看一下程序萝莉,找一下漏洞。 嗯,非常经典的笔记系统类型的题目。 neise1这里发现,漏洞在edit_chunk功能中,在写完数据后,程序会直接把read函数的返回值(也就是读取的数据的字节数)作为索引,在该处写入0,那么在刚好输入了同堆块大小一样的数据时,这个0就会直接写入下一个堆块中,也就是off-by-null。 同时,这里对申请的堆块大小也有限制,这里只能申请1104~1360大小的堆块,这代表着我们在一开始申请的堆块在被free后只能放进unsortbin和largebin中。 利用思路off-by-null的利用思路就是House Of Einherjar,利用这一位的溢出,覆盖后一堆块的prev_inuse位为0,使得后者在被释放后触发向前合并,让仍在使用中的前一堆块也被放进bin中,由于libc版本是2.39,会有很多...
NCTF 2026 WP(前两题)
前言这场比赛真是打爽了,4道题做出了3道,且每道都让neise1有所思考,没有一眼秒的情况,总之,这场比赛让本人收获颇丰,所以想着一定要好好地整理,于是就有了这篇博客。我会尽量把学到的东西写的细一点,希望读到我文章的人也能有所收获。 VFS_stack题目说,这是一个基于栈的文件管理系统,什么都先别说,checksec一下。 可以看到几乎没什么保护。 再丢进ida里看下。 seccomp这里发现有seccomp,看一下是禁用了什么。 发现是白名单,只让用这几个函数的系统调用,所以我们只能打orw了。 初始化这里是在栈上开辟了0xDE8大小的缓冲区,用来放置文件,根据函数名,我们也大致能猜到各个函数的功能,我们这里先从初始化函数开始看。 发现这里会初始化创建两个文件,“user_readme”和“/dev/stack_core”,这里管理文件选择了文件结构体和内容分开储存的形式。 文件结构体的前16字节用来放文件名,后面跟着的四个4字节数字依次代表该处是否被占用(0=空闲,1=占用),文件读取权限(0=普通用户可访问,1=...
数字中国keep_stack'sWP以及pwntools和缓冲区相关知识
前言其实neise1没去打这个比赛,主要是知道这个比赛的时候,报名已经截止了[遗憾],不过群里有人参加了,拿了这个题来问我,一开始都以为开了影栈和IBT,一直做不出来,绞尽脑汁也完全没有任何思路,绝望之下群友跟比赛大佬求来的exp后发现,远程环境根本没开这俩保护![绝望],那这题其实就是一个利用起来稍微麻烦一些的栈溢出,还是不难做的,不过从大佬的exp中学到了很多,所以写了这篇wp。 exp改自雾島风起時这里,neise1这里直接挂的大佬博客主页,可以去看一下。 分析依旧先checksec一下。 虽然程序这里确实标着这两个保护,但估计是远程那边硬件不支持,所以实际上打远程的时候是没有的。 所以保护非常简单,我们接下来看ida。 这个就是主要函数了。 其中,sub_4014A8这个函数纯是用来进行混淆的,行为萝莉特别复杂,但是返回值完全没有被用到,所以咱们直接看后面几个函数。 neise1感觉这几个函数放在一起比较好讲,索性一次性全贴出来了。 前两个函数,主要行为是对一个全局变量进行了一系列运算,这个变量初始是0,经过两个函数运算后变为2,随后进入第三个函数的判断,如果为2,则v1...
堆的数据结构
前言这里整理一下堆有关的学习笔记,因为我在学习过程中经常苦于网上的讲解大多都直接放源码,让我苦于读枯燥的代码,所以我想把这些知识点用我自己的话表达出来(当然,为了严谨也会贴些源码),用以促进自己的理解,如果能帮到其他人那就更好了。 堆的初始化首先来讲解一下堆的初始化和一些基础知识。 堆并不是程序运行时就存在的,而是在程序第一次进行堆块申请的时候(也可以先视为第一次调用malloc)才开始堆的初始化。 堆初始化时,会调用sbrk()申请一块内存,在这块内存用完前,你申请的堆块都会从这块内存中分割。随后会从这块内存中分出你malloc的堆块给你,剩下的就是top chunk。之后在你再次malloc的时候,如果没有空闲的堆块或者空闲的堆块大小不够的话,就会从top chunk的低地址割下来一块给你。因此,你获得的堆块都是物理相邻的。 堆块的数据结构这里先贴一段源码 1234567891011121314151617/* This struct declaration is misleading (but accurate and necessary). It declares a...
BSidesSF CTF 2026 WP
嗯嗯,虽然都已经学了很久的堆,堆题都做不少了,但这次比赛属实是有点没时间打,所以只做了三道简单的栈题,其中第一道有些过于简单了,所以就不再写,这里写一下后两道。其实也不是为了写答案,主要是为了分享一下我出错的地方。 readwriteme首先是readwriteme 可以看到,这里是几乎没有开保护的 丢进ida里看一下 分析123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263int __fastcall main(int argc, const char **argv, const char **envp){ unsigned int v3; // ebx int v4; // eax char v6[32]; // [rsp+10h] [rbp-190h] BYREF char nptr[32]; // [rsp+30h] [rbp-170h] BYREF char s[32];...
第一届BLP's WP
前言这是我们群聊第一次举办比赛,虽然参与人数不多,但考虑到目前群聊一共也没有多少人,所以也情有可原,本次比赛一共五道题,接下来我会详细的写一下各道题的wp,以及涉及的知识点。 Format String这题取自前两天刚结束的春秋杯的签到题,非常简单,甚至不用checksec,好的,接下来咱们进入题目。 分析1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556__int64 __fastcall main(int a1, char **a2, char **a3){ unsigned int v3; // eax int v4; // r12d int v5; // r13d __int64 v6; // rax char v7; // dl char *v9; // rbx char s[168]; // [rsp+10h] [rbp-D0h] BYREF unsigned __int64 v11; /...
flag-market's WP
第九届强网杯PWN题目flag-market前言我说这题真挺绕吧[手动滑稽],我最后费劲想出来的这个解法相当麻烦,反手搜了下其他人的wp,发现原来是有我不会的知识点[哭笑不得],总之,第二种解法比我这种简洁明了的多,我在文章最后会稍微说一下。 分析 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364__int64 __fastcall main(__int64 a1, char **a2, char **a3){ int i; // [rsp+Ch] [rbp-84h] int fd; // [rsp+14h] [rbp-7Ch] FILE *stream; // [rsp+18h] [rbp-78h] char filename[9]; // [rsp+27h] [rbp-69h] BYREF char s[16]; // [rsp+30h] [rbp-60h] BYREF...








