HNCTF 2022 WEEK4 ez_uaf WP的三种方法分别是什么?
摘要:[HNCTF 2022 WEEK4]ez_uaf 一、题目来源 NSSCTF-Pwn-[HNCTF 2022 WEEK4]ez_uaf 二、信息搜集 通过 file 命令查看文件类型: 通过 checksec 命令查看文件开启的保护机制:
[HNCTF 2022 WEEK4]ez_uaf
一、题目来源
NSSCTF-Pwn-[HNCTF 2022 WEEK4]ez_uaf
二、信息搜集
通过 file 命令查看文件类型:
通过 checksec 命令查看文件开启的保护机制:
三、反汇编文件开始分析
根据菜单输出的提示信息,我们就可以知道本程序最主要的四个功能:
int menu()
{
puts("1.Add.");
puts("2.Delete.");
puts("3.Show.");
puts("4.Edit.");
return puts("Choice: ");
}
逐一进行分析。
1、Add
int add()
{
__int64 v1; // rbx
int i; // [rsp+0h] [rbp-20h]
int v3; // [rsp+4h] [rbp-1Ch]
for ( i = 0; i <= 15 && heaplist[i]; ++i )
;
if ( i == 16 )
{
puts("Full!");
return 0;
}
else
{
puts("Size:");
v3 = getnum();
if ( (unsigned int)v3 > 0x500 )
{
return puts("Invalid!");
}
else
{
heaplist[i] = malloc(0x20u);
if ( !heaplist[i] )
{
puts("Malloc Error!");
exit(1);
}
v1 = heaplist[i];
*(_QWORD *)(v1 + 16) = malloc(v3);
if ( !*(_QWORD *)(heaplist[i] + 16LL) )
{
puts("Malloc Error!");
exit(1);
}
*(_DWORD *)(heaplist[i] + 24LL) = v3;
puts("Name: ");
if ( !(unsigned int)read(0, (void *)heaplist[i], 0x10u) )
{
puts("Something error!");
exit(1);
}
puts("Content:");
if ( !(unsigned int)read(0, *(void **)(heaplist[i] + 16LL), *(int *)(heaplist[i] + 24LL)) )
{
puts("Error!");
exit(1);
}
*(_DWORD *)(heaplist[i] + 28LL) = 1;
return puts("Done!");
}
}
}
简单分析后,可以发现 Add 函数中会调用两次 malloc 函数,并且会用 heaplist[] 这个数组来管理分配的两个 chunk。
大概就是:
为了后续理解的方便,我们叫左边那个 chunk 为管理块,右边那个 chunk 叫做内容块。
