劫持TLS绕过canary的ROP技巧

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了劫持TLS绕过canary的ROP技巧相关的知识,希望对你有一定的参考价值。

参考技术A

之前在看ctfwiki的时候,有关劫持TLS的攻击技术仅仅是一笔带过,最近终于找到原题来练练手,深入学习一下。


这道题是starctf的babystack。整个题目非常简单,创建了一个线程,线程函数内存在栈溢出,而且溢出字节可达到0x10000。


main函数:



start_routine函数



这种技术有两个前提:

1. 溢出字节够大,通常至少一个page(4K)

2. 创建一个线程,在线程内栈溢出



原理

当程序在创建线程的时候,顺便会创建一个TLS(Thread Local Storage),该TLS会存储canary的值,而TLS会保存在stack高地址的地方。所以,当我们溢出足够大的字节,就可以控制TLS结构体,进而控制canary,实现ROP。


TLS结构体:


解题:

首先启动gdb,断点下在我们输入完成的地方。这里我们输入了abcd\\nab。

我们可以看到,我输入的abcd\\ncd存在栈的0x7ffff77edf40。


然后我们使用canary命令,确定当前canary的值为0xb32920cddd174c00。pwndbg顺便给出了栈上其他地方存在0xb32920cddd174c00的地址。而这些地址很有可能就是TLS中存放canary的地址。


接下来,我们写个脚本逐个尝试。我们首先假设canary为0xdeadbeef,然后将函数返回地址劫持到main函数,随后我们溢出足够长的字节,并写入我们设定的canary。



那么这个offset是多少呢?


因为TLS.canary就应该是我们刚才调试出来的几个值中的一个。所以,我们逐个尝试,如果返回了main函数,就说明我们劫持成功。



我们计算一下偏移:



我们将这几个值设为offset都去试试。


最终我们在offset=6120的时候,成功返回了main函数。



接下来,常规ROP即可。




文章推荐 【PWN】记一次unlink学习 被过滤了引号的SQL注入如何破? 从一道题入门JAVA反序列化漏洞 你不能不知道的的JWT相关漏洞 CTF学习资料和练习平台收集汇总


以上是关于劫持TLS绕过canary的ROP技巧的主要内容,如果未能解决你的问题,请参考以下文章

SQL注入绕过技巧汇总

逆向调试简书网页劫持分析,使用 Chrome DevTools 调试 JavaScript 技巧,利用 CSP 预防劫持

waf绕过技巧

SQL注入绕过的技巧总结

CSRF--花式绕过Referer技巧

SQL注入绕过技巧