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

[原创]2016 hctf ->fpwn

2019-6-10 10:33
8601

2016HCTF -->


36fK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6*7K9q4)9J5k6r3g2^5M7r3I4G2M7X3g2J5i4K6u0r3K9r3y4@1k6U0t1H3x3e0k6Q4x3X3c8X3K9r3g2S2M7l9`.`.


  源码已公布,我们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{


[培训]科锐逆向工程师培训第53期2025年7月8日开班!

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