-
-
[原创]2016 hctf ->fpwn
-
发表于: 2019-6-10 10:33 8389
-
2016HCTF -->
https://github.com/zh-explorer/hctf2016-fheap
源码已公布,我们gcc 编译:
gcc main.c -pie -fpic -o pwn
执行程序,因为存在\n的原因,我们输入的字符必须少于一位
感觉程序的逻辑不复杂,算是 中规中矩的pwn吧
ida静态:
1 create:
首先刚进去就:
ptr = (char *)malloc(0x20uLL);
if ( nbytes <= 0x1000 ) //我们输入的size必须小于等于 0x1000
nbytesa = strlen(&buf);
if ( nbytesa > 0xF ) ;
当申请的size 大于0xf的时候:
dest = (char *)malloc(nbytesa);
为dest申请内存,然后:
strncpy(dest, &buf, nbytesa); //直接往dest重写东西
之后将dest的内存地址放到ptr的第一位
*(_QWORD *)ptr = dest;
ptr+3的位置放freeLong函数地址:
ptr+4的位置来存储str_size
*((_DWORD *)ptr + 4) = nbytesa;
接着:
if ( !*((_DWORD *)&Strings + 4 * i) )
{
*((_DWORD *)&Strings + 4 * i) = 1;
*((_QWORD *)&Strings + 2 * i + 1) = ptr;
printf("The string id is %d\n", (unsigned int)i);
break;
}
String全局变量,地址->.bss:00000000002020C0
String[i].inuse = 1
String[i].str = ptr <--存储的我们申请的string的写入地址空间
当申请的size小于0xF的时候:
strncpy(ptr, &buf, nbytesa);
ptr的第一位存储size
*((_QWORD *)ptr + 3) = freeShort;
ptr的第三位存储freeShort
总结:
1.当size大于0xf时:
string结构的结构:
struct string{
*buf; //1
freeLong; //3
size; //4
}
2.当size<=15时:
struct string{
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!