标签:
和上一个一样,记录一下做题的思路。
int sub_80487F7() { puts("Your Address:"); sub_804865D(0, (int)&unk_804B1E0, 256, 10); puts("Your Phone number:"); sub_804865D(0, (int)&unk_804B0C0, 256, 10); return puts("Thank you."); }
程序一开头就是这个,往bss段里写,因为ZCTF有一道题就是利用的这个地方,所以我留意了一下这个地方。
puts("1.WO YAO DIAN CAI"); puts("2.Submit"); puts("3.I want Receipt"); puts("4.Review"); puts("5.Exit"); puts("choose:");
又是熟悉的菜单,又是熟悉的笔记本功能。
一猜又是堆的问题。
惯例,先看创建函数的情况,
int sub_80488AF() { int v0; // ebx@2 int result; // eax@2 int v2; // [sp+1Ch] [bp-Ch]@1 v2 = dword_804B1C0; puts("CHI SHEN ME?"); puts("1.Banmian"); puts("2.Bianrou"); puts("3.Qingtangmian"); puts("4.Jianbao"); puts("5.Jianjiao"); dword_804B1C0 = (int)malloc(40u); if ( dword_804B1C0 ) { *(_DWORD *)(dword_804B1C0 + 36) = v2; sub_804865D(0, dword_804B1C0 + 4, 60, 10); puts("How many?"); v0 = dword_804B1C0; *(_DWORD *)v0 = sub_80486CD(); puts("Add to GOUWUCHE"); result = dword_804B2E0++ + 1; } else { result = puts("Error"); } return result; }
通过函数得出数据结构为
struct note { DWORD many; byte buffer[32]; DWORD 上个块的指针; }
单个块的大小为定值40byte。并且很明显函数有漏洞,我还以为F5又出错了呢,去看了一遍汇编结果确实是漏洞,给的真的很明显。
往buffer里读入时可以最大读入60byte
标签:
原文地址:http://www.cnblogs.com/Ox9A82/p/5507053.html