太菜了,后面学一学llvm
pwny
第一步需要把文件描述符改成0:
先通过write部分,读一个随机值到文件描述符处,此时的文件描述符已经被更改为一个随机值,再次通过write向文件描述符处读数据就会失败,从而保存栈上的默认值0到文件描述符处,这样read就可以读取输入了,也就是说实现了任意读写,泄露libc,栈地址,然后改返回地址
1 | from pwn import * |
lonelywolf
只有一个chunk的uaf,需要注意的是这个版本的glibc2.27的tcache有key值,可以改size大小整出来unsorted bin,当然也可以跟我这样改tcache struct,话说这题做得不太好导致我的下一题完成的比较艰难了
1 | from pwn import * |
silverwolf
在上一题的基础上加了沙箱,我用的setcontext,接着上一题改的,导致我的写入堆块大小有限,所以一些细节需要精心构造一下,上一题方法太别扭导致这一题做的有些吃力了。。。
1 | from pwn import * |
channel
漏洞点在于unregister里面,只要free链表非头部的元素,就是一个uaf
1 | from pwn import * |
game
漏洞点在于最后四个函数写入数据的时候存在越界,可以实现单个字节溢出的效果,这样就类似于off-by-one,溢出改掉size,最后造成堆块重叠
程序还开了沙箱,远程堆地址试了一下跟本地有区别,改了一会儿也没成功,但libc基地址肯定没错,所以将orw写到libc上即可
1 | from pwn import * |