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 叫做内容块。
阅读全文