攻击GLIBC的TLS结构体,覆写Canary。
快速学习了一下Pthread,大致知道了多线程的用法。
starctf2018/pwn-babystack at master · sixstars/starctf2018 (github.com)
GLIBC 不仅把 Canary 放在 TLS(Thread Local Storage)中,还把 TLS 放在线程栈顶上(与线程栈有固定的偏移)。这就出现了覆写 Canary 的可能。
漏洞分析
程序逻辑很简单,就是开一个线程,然后这个线程里存在一个超大的栈溢出。
程序会用寄存器 fs 来存储 TLS 的位置,而 canary 就在 fs+0x28 的地方,如下结构体定义所示:
1 | typedef struct |
为了栈溢出覆盖 canary,可以用 pwndbg 调试查看 TLS 的位置,计算 BUFFER 与其偏移:
1 | pwndbg> thread |
漏洞利用
由于第二次进入函数的时候总会发生奇怪的问题,这里使用了stack pivot,通过ret2csu调用read往bss段读入one_gadget地址,并leave;ret把栈换过去,执行one_gadget。
1 | #!/usr/bin/python3 |