[问题] use after free 盲点请益

楼主: lovejomi (JOMI)   2018-07-04 12:56:52
最近被问说 为什么use after free后 你使用那块memory的话 "有可能"会crash 或是
不会
我答不出来(这边不讨论 delete后 值被改动 foo->ptr已经变成垃圾指标 造成的acces
s violation)
原因是 如果只是单纯access 不管是read write, 我都不觉得会crash.... 以下是我
的测试和认知
https://ideone.com/HKYiIQ
int* ptr = new int;
*ptr = 123;
cout << "before: " << ptr << ":" << *ptr << endl; (1)
delete ptr;
cout << "read after free: " << ptr << ":" << *ptr << endl; (2)
*ptr = 456; // write after free
cout << "read after free: "<< ptr << ":" << *ptr << endl; (3)
我的认知
new会透过cstdlib malloc要一块 valid的user space address (他应该会跟OS要超过我d
emand的)
然而我delete了 除了cstdlib里面free做了一些事情外 , 他很可能也会跟OS讲说我这块
memory已经没有要使用了(这边不确定是不是每次 这是不是造成下面行为差异的主因)
再来我连续的 对这块内存做读取 和 写入
1. 如果只是读取而已 有没有可能 造成crash? (以我测试来说 从没因为read 而cras
h, 但如果真的有可能会 我想知道为什么)
2. 写入比较不理解, 我拿到的是user space address, 虽然我delete了 但我write的时
候并没有写在其他超出user space的内存或是read-only的区段
为什么 "有机会" 造成 SIGSEGV? 到底是谁 raise这signal?
3. 上面程式码 (2) "有时候"会印出*ptr = 0,有时候是原来数值, 虽然我也只知道值不
可预期, 但我想问的是, 到底是谁把0 写入进去? 是cstdlib吗? 如果是的话 照理讲要每
次都变0, 但显然不是每次
以我测试, 如果我挂上valgrind ./a.out ==> 这行就不会变0 维持原来数值, 一旦直
接./a.out 就会是0
以上到底是谁介入了? 这件事我想说很可能是-O之类的差异 但我发现似乎不是 deb
ug / release build都有这种现象.
然而有时候这一行就直接SIGSEGV了如同2.所问的问题
4. 我有用signal handler 撷取这SIGSEVG 我天真的想要把这件事给吃下来
但我看文章说 signal handler return后会回到 原本执行到的code
以我测试来说 我会 无限循环的触发SIGSEGV , 想问一下是不是不可能吃得下来 一
定要 abort或是把handler设定成default 让系统自己handle
5. 补个问题我尝试在ubuntu产生core dump
大概做了几件事
echo 'core_%e.%p' | sudo tee /proc/sys/kernel/core_pattern
core_%e.%p
ulimit -c unlimited
gdb a.out
作者: Sidney0503 (Sidney0503)   2018-07-04 12:59:00
违建拆除率低于50% 地震不是每个违建都会倒
作者: yvb   2018-07-04 13:47:00
(1) int* ptr = new int[65536]; 之类, new 较大空间看看.
作者: L4ys (Lays)   2018-07-04 14:16:00
malloc 是一次跟 kernel 要一大块来慢慢切给你用, free 掉之后不会马上还给 kernel, 写了会 segfault 是因为freed chunk 上会存放一些资讯另外如果 allocate size 超过 MMAP_THRESHOLD 则会改用 mmap/munmap, 这种 case 的 uaf 去读取可能就会 segfault想知道更深入的可以去看 malloc.c
作者: F04E (Fujitsu)   2018-07-04 18:29:00
........
楼主: lovejomi (JOMI)   2018-07-04 19:01:00
为什么说使用mmap拿到的就肯定会sigsegv呢
作者: yvb   2018-07-04 19:32:00
你可以用 strace 去观察看看.mmap来的,free/delete时就还了.
作者: b0920075 (Void)   2018-07-05 09:48:00
哇是l4ys大大还给kernel就相当于这块memory不存在,你去访问这地址当然会crash

Links booklink

Contact Us: admin [ a t ] ucptt.com