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 *)¬elist + i);
if ( !result )
{
*((_DWORD *)¬elist + i) = malloc(8u);
if ( !*((_DWORD *)¬elist + i) )
{
puts("Alloca Error");
exit(-1);
}
**((_DWORD **)¬elist + i) = print_note_content;
printf("Note size :");
read(0, buf, 8u);
size = atoi(buf);
v1 = *((_DWORD *)¬elist + i);
*(_DWORD *)(v1 + 4) = malloc(size);
if ( !*(_DWORD *)(*((_DWORD *)¬elist + i) + 4) )
{
puts("Alloca Error");
exit(-1);
}
printf("Content :");
read(0, *(void **)(*((_DWORD *)¬elist + 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 动态分配的)。
