感觉应该是有好几道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 许可协议。转载请注明出处!