
hitcon_2018_children_tcache
hitcon_2018_children_tcache
题目分析
题目保护全开,不能修改got表,需要计算泄露libc地址。
部分 RELRO: 在程序装入后,将其中一段 (如.dynamic) 标记为只读,防止程序的一些重定位信息被修改。
完全 RELRO: 在部分 RELRO 的基础上,在 程序装入时,直接解析完所有符号并填入对应的值,此时所有的 GOT 表项都已初始化,且不装入 link_map 与_dl_runtime_resolve 的地址 (二者都是程 序动态装载的重要结构和函数)。
运行题目,使用的libc-2.27的libc,有添加,删除,和打印的基础功能,且在strcpy处存在null_by_one的漏洞。
思路分析
1、首先申请一个很大的chunk绕过tcache,再在后面申请两个chunk,修改第2个chunk的prev_size位和prev_inuse位。
2、free掉chunk2,这时会在unsortbin中对chunk0和chunk1、2进行合并,触发unlink,然后再把tache的chunk申请回来,这时chunk1就会存main_arean的地址,我们可以通过打印chunk1,泄露libc的基址。
3、利用double_free,对chunk2,free两次后,chunk2的fd会变成自己的chunk地址,然后第一个malloc,将fd位修改为free_hook的位置,然后,第二次malloc,会把堆指向free_hook的位置,第三次进行malloc,会修改free_hook的内容为system。
4、free掉chunk3,成功getshell。
排坑过程
1、首先是第0和chunk,我们需要申请超过0x410的大小,然后第二个chunk,因为只能修改一个字节,且又需要绕过tcache,所以需要申请0x4f0的大小,所以这个chunk2的大小会是0x501,这样就可以覆盖。
2、然后,修改chunk2的prev_size的位每次只能覆盖一个字节,所以需要写一个循环逐个字节覆盖。
3、在泄露libc的过程,我的本地和远程的偏移存在问题,本地的libc和远程的libc的main_arean的不同,而且相对偏移也有问题,本地的libc是0x3dac20 + 0x58的偏移,远程是 0x3ebc40 + 0x60,这里刚好差8个字节。
最终exp
1 | # Author by: limu |