首页
社区
课程
招聘
[原创]2016 hctf ->fpwn
发表于: 2019-6-10 10:33 8389

[原创]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{


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
  • pwn (13.36kb,7次下载)
收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//