BUUCTF-Pwn-hitcontraining_uaf是什么漏洞利用的详细过程?

摘要:一、题目来源 BUUCTF-Pwn-hitcontraining_uaf 二、信息搜集 通过 file 命令查看文件类型: 通过 checksec 命令查看文件使用的保护机制: 三、反汇编文件开始分析 将题目给的二进制文件丢入 IDA Pr
一、题目来源 BUUCTF-Pwn-hitcontraining_uaf 二、信息搜集 通过 file 命令查看文件类型: 通过 checksec 命令查看文件使用的保护机制: 三、反汇编文件开始分析 将题目给的二进制文件丢入 IDA Pro 当中开始反汇编。 程序的主要功能菜单函数已经写的很清楚了: int menu() { puts("----------------------"); puts(" HackNote "); puts("----------------------"); puts(" 1. Add note "); puts(" 2. Delete note "); puts(" 3. Print note "); puts(" 4. Exit "); puts("----------------------"); return printf("Your choice :"); } 1、add_note() int add_note() { int result; // eax int v1; // esi char buf[8]; // [esp+0h] [ebp-18h] BYREF size_t size; // [esp+8h] [ebp-10h] int i; // [esp+Ch] [ebp-Ch] result = count; if ( count > 5 ) return puts("Full"); for ( i = 0; i <= 4; ++i ) { result = *((_DWORD *)&notelist + i); if ( !result ) { *((_DWORD *)&notelist + i) = malloc(8u); if ( !*((_DWORD *)&notelist + i) ) { puts("Alloca Error"); exit(-1); } **((_DWORD **)&notelist + i) = print_note_content; printf("Note size :"); read(0, buf, 8u); size = atoi(buf); v1 = *((_DWORD *)&notelist + i); *(_DWORD *)(v1 + 4) = malloc(size); if ( !*(_DWORD *)(*((_DWORD *)&notelist + i) + 4) ) { puts("Alloca Error"); exit(-1); } printf("Content :"); read(0, *(void **)(*((_DWORD *)&notelist + i) + 4), size); puts("Success !"); return ++count; } } return result; } 笔记(note)的创建过程: 最多只能创建 5 个笔记; 创建的笔记会通过一个名为“notelist”的“二维数组”来管理,其中: notelist[i][0] 中存储的是函数 print_note_content 的地址,分配的 chunk 的大小为 8 字节; notelist[i][1] 中存储的笔记的内容的所在地址,分配的大小由用户自己指定(size)。 稍微解释一下为什么上面的二维数组被我打上了引号,从伪代码上看,将 notelist 理解成二维数组似乎并没有什么大的问题(根据原理数组 a[n] 的等价写法为 *(a+n)),但其实它更像是个结构体。因为,真正的二维数组 a[R][C] 要求的是整块 R×C 连续内存,但这明显不是(通过 malloc 动态分配的)。
阅读全文