堆的数据结构
前言这里整理一下堆有关的学习笔记,因为我在学习过程中经常苦于网上的讲解大多都直接放源码,让我苦于读枯燥的代码,所以我想把这些知识点用我自己的话表达出来(当然,为了严谨也会贴些源码),用以促进自己的理解,如果能帮到其他人那就更好了。 堆的初始化首先来讲解一下堆的初始化和一些基础知识。 堆并不是程序运行时就存在的,而是在程序第一次进行堆块申请的时候(也可以先视为第一次调用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...




