canary爆破原理
对于Canary,虽然每次进程重启后Canary不同,但是同一个进程中的不同线程的Cannary是相同的,并且通过fork函数创建的子进程中的canary也是相同的,因为fork函数会直接拷贝父进程的内存。而且fork在canary报错之后会重新运行,不会改变canary。
所以见到fork大概率是canary爆破的问题。
fork即子线程创建函数:
- 在父进程中,返回新创建的子进程的PID。
- 在子进程中,返回0。
- 如果发生错误,
fork
返回-1,父进程会获得一个负值。
题目示例
我们用NewStar的题目来做示例。ezcanary
可以发现源代码中有fork,且有canary。
我们需要用while来反复使用fork来爆破canary。
所以我们用for循环,在子线程中修改canary的一个字节的值,如果修改错误,会报错,但不会影响父线程。而且有while,所以可以无限制的尝试。
在脚本中正是用aaa函数爆破一个字节的canary。
用bbb完成循环,爆破canary。
而getshell是已有的后门函数。
p64(0)则还是为了添加一个0x8,移动到ret。
当爆破完了之后,输入cat flag跳出循环。