[Pwnable.kr] uaf
通过UAF漏洞控制vtable,调用指定虚函数(其实还可以干更多事情的……
由glibc会对linux内存管理进行一层封装(类似一个内存池),小块内存的分配从内存池中分配,而释放也不会“真正”释放回去。所以当刚释放了一块大小为x的内存,又申请同样大小的内存时,刚被释放的那块内存会被优先分配。
本题中有m、w两个对象都有一个虚函数表,两个表项分别是base::give_shell和derived::introduce.
F5一下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
int __cdecl __noreturn main(int argc, const char **argv, const char **envp) { Human *v3; // rbx@1 __int64 v4; // rdx@1 Human *v5; // rbx@1 int v6; // eax@6 __int64 v7; // rax@6 Human *v8; // rbx@7 Human *v9; // rbx@9 const char **v10; // [rsp+0h] [rbp-60h]@1 char v11; // [rsp+10h] [rbp-50h]@1 char v12; // [rsp+20h] [rbp-40h]@1 Human *v13; // [rsp+28h] [rbp-38h]@1 Human *v14; // [rsp+30h] [rbp-30h]@1 size_t nbytes; // [rsp+38h] [rbp-28h]@6 void *buf; // [rsp+40h] [rbp-20h]@6 int v17; // [rsp+48h] [rbp-18h]@2 char v18; // [rsp+4Eh] [rbp-12h]@1 char v19; // [rsp+4Fh] [rbp-11h]@1 v10 = argv; std::allocator<char>::allocator(&v18, argv, envp); std::string::string(&v11, "Jack", &v18); |