感谢师傅的文章!但是好像漏洞原因不是很对。malloc(): corrupted top size 的报错我没记错的话应该是溢出的问题,而不是空指针问题。我用 gdb 简单跟了一下,第一次打过去能够把 top chunk 的 size 修改成如下大小:

Top chunk | PREV_INUSE
Addr: 0x555555559df0
Size: 0x4141414141414141

之后再打的话才会因为检测到顶部信息被修改而被杀。这也就解释了为什么 poc 要跟 b'\x41'*50 和为什么需要打两次才能造成程序拒绝服务~

站在程序设计的角度分析 poc 的话,可以理解成申请大空间和往大空间放内容,但程序因为整数溢出的漏洞会开辟一块很小的内存空间,之后往堆块里写,先吞一部分 poc,之后剩下的 poc 才会溢出起作用。

来自几年没打 pwn 的人的看法,不知道对不对,Orz