感觉应该是有好几道Pwn题的,但是只找到两道。
EasyWrite
程序分析
程序一开始给了Libc地址,存在一个任意地址修改漏洞。将第一次堆块的值赋给我们想要修改的地址,输入第二次堆块的内容,并释放它。
利用分析
对 tcache_perthread_struct 结构体指针的攻击,但是不知道怎么确定他的地址,查了一些题解,也没有说明这个地址是怎么确定的。这个值在源码里是一个全局变量,调试时发现这个值应该是存储在 fs寄存器里:如下所示。感觉这确实是一个自己不知道的知识点。

TIPS:
对之前写得 FSOP的payload生成函数,加强了一下:
1 | def pack_file(_flags = 0, |
EXP
1 | from pwn import * |
SignIn
程序分析

New函数能够申请两种堆块。两种堆块各有一个结构体,形式如下:
1 | begin_ptr, cur_ptr, end_ptr |
cur_ptr控制当前写入的地址,当 cur_ptr和 end_ptr想等后,再写入时就会先申请一个大一点的堆块,再释放当前堆块。
Delete函数,会将当前 cur_ptr的值减去8,并且并没有对 cur_ptr做检测,导致可以一致相减,使 cur_ptr上溢,达到任意地址写的目的。
利用分析
- 首先要不断申请,实现申请一个大于
0x420的堆块,再将其释放到unsortebdin来泄露libc地址 - 随后利用
delete,将cur_addr不断上溢到 第一个0x20的tcahce的next指针处,修改该指针指向free_hook的地址; - 随后分配第2种堆块,此时会再次分配第一个
0x20的tcache,在其中布置/bin/sh。然后再次分配第2种堆块,会先申请free_hook所在伪造tcache,然后修改free_hook为system,再释放之前的堆块即0x20的tcache。达到getshell的目的。
EXP
1 | from pwn import * |
- 本文作者: A1ex
- 本文链接: http://yoursite.com/2020/11/04/N1CTF/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!