首先看下保护措施,那我们就可以写shellcode了
1 | gdb-peda$ checksec |
这个题目在新建note的时候和删除note的时候都会新建线程,这就有可能存在条件竞争了,
1 | __int64 newNote() |
当然delete的时候也会创建线程
1 | __int64 delete() |
删除的时候会睡眠两秒,usleep的单位是微秒(microseconds:即百万分之一秒)
1 | void *__fastcall deleteThread(void *a1) |
可以看到delete的sleep之前会不断将head指针减8,那我们可以让head指针减到指向free

这时候我们再malloc,就可以控制got表的地址,从而执行我们设定好的shellcode
首先head指针初始值为c0结尾

有malloc的时候head+8,所以我们将c0减到0x10,0x18执行free

所以减22次

最终

payload
1 | from pwn import * |
