黑客信息网:Arm PWN学习笔记

访客4年前黑客资讯1196
漏洞所在的函数
int __fastcall sub_17F80(char *a1)
{
  char *v1; // r4
  char *v2; // r0
  int v3; // r3
  char *v4; // r5
  unsigned int v5; // r9
  unsigned __int8 *v6; // r8
  char *v7; // r3
  int v8; // r6
  int v9; // t1
  int v10; // r10
  int v11; // r2
  int v12; // r2
  unsigned __int8 *v13; // r0
  bool v14; // zf
  int v15; // r2
  int v16; // t1
  bool v17; // zf
  char *v18; // ST14_4
  int v19; // r0
  int v20; // r2
  int v21; // r1
  ssize_t v22; // r5
  int v23; // r2
  char *v24; // r0
  const char *v25; // r6
  char *v26; // r0
  int result; // r0
  int v28; // r6
  FILE *v29; // r0
  int v30; // r6
  FILE *v31; // r0
  const char *v32; // r1
  int v33; // r2
  int v34; // r3
  char *v35; // r7
  char *v36; // r6
  char *v37; // r0
  int v38; // r7
  int v39; // r0
  int v40; // r2
  unsigned int v41; // r3
  char *haystack; // [sp+Ch] [bp-44h]
  char dest[4]; // [sp+18h] [bp-38h]
  int v44; // [sp+1Ch] [bp-34h]
  int v45; // [sp+20h] [bp-30h]
  int v46; // [sp+24h] [bp-2Ch]

  v1=a1;
  haystack=a1 + 13690;
  v2=strncpy(a1 + 21882, a1 + 13690, 0x1FFFu);
  v3=*((_DWORD *)v1 + 1629);
  v4=&v1[*((_DWORD *)v1 + 18) + 13690];
  v5=(unsigned int)&haystack[v3];
  if ( dword_34864 & 0x10 && (unsigned int)v4 < v5 )
  {
    haystack[v3]=0;
    sub_16534(v2);
    fprintf((FILE *)stderr, "%s:%d - Parsing headers ("%s")
", "src/read.c", 57, v4);
  }
  v6=(unsigned __int8 *)(v4 - 1);
  v7=v4;
  if ( (unsigned int)v4 >=v5 )
  {
LABEL_26:
    if ( *(_DWORD *)v1 > 3u )
      return 1;
    v21=*((_DWORD *)v1 + 1629);
    if ( (unsigned int)(0x1FFF - v21) >=0x2000 )
    {
      sub_1627C(v1);
      fwrite("No space left in client stream buffer, closing
", 1u, 0x2Fu, (FILE *)stderr);
      result=0;
      *((_DWORD *)v1 + 4)=400;
      *(_DWORD *)v1=12;
      return result;
    }
    v22=read(*((_DWORD *)v1 + 1112), &haystack[v21], 0x2000 - v21);
    if ( !strncmp(haystack, "POST", 4u) || (v26=(char *)strncmp(haystack, "PUT", 3u))==0 )
    {
      v23=(unsigned __int8)v1[13690];
      *(_DWORD *)dest=0;
      v44=0;
      v45=0;
      v46=0;
      if ( v23 )
      {
        v35=strstr(haystack, "Content-Length");
        v36=strchr(v35, '
');
        v37=strchr(v35, ':');
        strncpy(dest, v37 + 1, v36 - (v37 + 1)); // 这里复制有bug
      }
      v24=strstr(haystack, "\r
\r
");
      if ( v24 && (v25=v24 + 4, (signed int)(v24 + 4) <=(signed int)&haystack[*((_DWORD *)v1 + 1629) - 1 + v22]) )
      {
        v26=strstr(haystack, "upgrade.cgi");
        if ( !v26 || (v26=strstr(v25, "\r
\r
")) !=0 )
        {
          *((_DWORD *)v1 + 7623)=-1;
          goto LABEL_36;
        }
        v30=(int)(v1 + 28672);
        ++*((_DWORD *)v1 + 7623);
        v31=(FILE *)stderr;
        v32="req->iCount++(2)=%d
";
      }
      else
      {
        v30=(int)(v1 + 28672);
        v31=(FILE *)stderr;
        v32="req->iCount++=%d
";
        ++*((_DWORD *)v1 + 7623);
      }
      fprintf(v31, v32);
      v33=*(_DWORD *)(v30 + 1820);
      v26=(char *)(1717986919 * v33);
      *(_DWORD *)(v30 + 1820)=v33 % 20;
    }
LABEL_36:
    if ( v22 < 0 )
    {
      v34=*_errno_location();
      if ( v34 !=4 )
      {
        if ( v34==11 )
          return -1;
        sub_1627C(v1);
        perror("header read");
        *((_DWORD *)v1 + 4)=400;
        return 0;
      }
    }
    else
    {
      if ( !v22 )
      {
        if ( *((_DWORD *)v1 + 1628) >=(unsigned int)dword_37E6C || *((_DWORD *)v1 + 15) || *((_DWORD *)v1 + 1629) )
        {
          sub_1627C(v1);
          fwrite("client unexpectedly closed connection.
", 1u, 0x27u, (FILE *)stderr);
        }
        *((_DWORD *)v1 + 4)=400;
        return 0;
      }
      v14=(dword_34864 & 0x10)==0;
      *((_DWORD *)v1 + 1629) +=v22;
      if ( !v14 )
      {
        sub_16534(v26);
        v29=(FILE *)stderr;
        v1[*((_DWORD *)v1 + 1629) + 13690]=0;
        fprintf(v29, "%s:%d -- We read %d bytes: "%s"
", "src/read.c", 356, v22, "");
      }
    }
    return 1;
  }
  while ( 2 )
  {
    if ( *((_DWORD *)v1 + 7623) > 0 )
      goto LABEL_26;
    v9=(unsigned __int8)*v4++;
    v8=v9;
    v10=v9 - 13;
    if ( v9 !=13 )
      v10=1;
    if ( v8==161 )
      v11=v10 & 1;
    else
      v11=0;
    if ( v11 )
    {
      v12=*v6;
      v13=v6;
      v14=v12==0;
      if ( *v6 )
        v14=v12==10;
      if ( !v14 )
      {
        do
        {
          v16=*(v13-- - 1);
          v15=v16;
          v17=v16==0;
          if ( v16 )
            v17=v15==10;
        }
        while ( !v17 );
      }
      v18=v7;
      v19=strncmp((const char *)v13 + 1, "User-Agent:", 0xBu);
      v7=v18;
      if ( v19 )
      {
        sub_1627C(v1);
        fprintf((FILE *)stderr, "Illegal character (%d) in stream.
", 161);
        sub_1B8(v1);
        return 0;
      }
    }
    v20=*(_DWORD *)v1;
    switch ( *(_DWORD *)v1 )
    {
      case 0:
        if ( v8==13 )
        {
          *((_DWORD *)v1 + 17)=v7;
          *(_DWORD *)v1=1;
          goto LABEL_24;
        }
        if ( v8 !=10 )
          goto LABEL_24;
        *((_DWORD *)v1 + 17)=v7;
        *(_DWORD *)v1=2;
        goto LABEL_52;
      case 1:
        if ( v8 !=10 )
          goto LABEL_22;
        *(_DWORD *)v1=2;
LABEL_52:
        ++*((_DWORD *)v1 + 18);
        goto LABEL_53;
      case 2:
        if ( v8==13 )
        {
          *(_DWORD *)v1=3;
          goto LABEL_24;
        }
        if ( v8 !=10 )
        {
LABEL_23:
          *(_DWORD *)v1=0;
LABEL_24:
          ++*((_DWORD *)v1 + 18);
LABEL_25:
          ++v6;
          v7=v4;
          if ( (unsigned int)v4 >=v5 )
            goto LABEL_26;
          continue;
        }
LABEL_45:
        ++*((_DWORD *)v1 + 18);
        *(_DWORD *)v1=4;
LABEL_46:
        v28=sub_1A4F4(v1);
        if ( !v28 )
          return 0;
        if ( (unsigned int)(*((_DWORD *)v1 + 3) - 3) > 1 )
          return v28;
        v38=*((_DWORD *)v1 + 42);
        *((_DWORD *)v1 + 17)=&v1[*((_DWORD *)v1 + 1629) + 13690];
        *((_DWORD *)v1 + 16)=v4;
        *(_DWORD *)v1=5;
        if ( !v38 )
        {
          sub_1627C(v1);
          fwrite("Unknown Content-Length POST!
", 1u, 0x1Du, (FILE *)stderr);
          sub_1B8(v1);
          return 0;
        }
        v39=sub_216EC(v38);
        if ( v39 < 0 )
        {
          sub_1627C(v1);
          fprintf((FILE *)stderr, "Invalid Content-Length [%s] on POST!
", *((_DWORD *)v1 + 42));
          sub_1B8(v1);
          return 0;
        }
        v40=*((_DWORD *)v1 + 16);
        v41=*((_DWORD *)v1 + 17) - v40;
        *((_DWORD *)v1 + 11)=v39;
        *((_DWORD *)v1 + 12)=0;
        if ( v39 >=v41 )
          return v28;
        *((_DWORD *)v1 + 17)=v40 + v39;
        return v28;
      case 3:
        if ( v8==10 )
          goto LABEL_45;
LABEL_22:
        if ( v10 )
          goto LABEL_23;
        goto LABEL_24;
      default:
        ++*((_DWORD *)v1 + 18);
        if ( v20==2 )
        {
LABEL_53:
          **((_BYTE **)v1 + 17)=0;
          if ( *((_DWORD *)v1 + 17) - *((_DWORD *)v1 + 16) > 3071 )
          {
            sub_1627C(v1);
            fprintf(
              (FILE *)stderr,
              "Header too long at %lu bytes: "%s"
",
              *((_DWORD *)v1 + 17) - *((_DWORD *)v1 + 16));
            sub_1B8(v1);
            return 0;
          }
          if ( *((_DWORD *)v1 + 15) )
          {
            if ( !sub_1A878(v1) )
              return 0;
          }
          else
          {
            if ( !sub_19FF0(v1) )
              return 0;
            if ( *((_DWORD *)v1 + 2)==1 )
              return sub_1A4F4(v1);
          }
          *((_DWORD *)v1 + 16)=v4;
        }
        else if ( v20==4 )
        {
          goto LABEL_46;
        }
        goto LABEL_25;
    }
  }
}

相关文章

关于网站权重常见问题的解答

“网站权重”这个名词相信大家很多人都知道,但真正知道网站权重的来源及价值的站长并不多。甚至是很多老网站,为了提升“权重值”而去做大量的作弊行业。 什么是网站权重,网站权重到底对SEO有何价值和帮助。...

退税怎么算(个人所得税退税补税怎么计算)

  税务部门进行了首次个人所得税综合所得年度汇算清缴,大家现在可以直接上个人所得税app就能看到自己是需要退税还是补税了。不清楚的可以看看文中的具体内容。   哪些人需要办理年度汇算   怎么查看自己...

印度依维莫司10mg价格?怎样可以买到低价正品的印

依维莫司(飞尼妥)是一款能针对多种病症的抗癌药,对于晚期肾细胞癌、转移性胰腺神经内分泌瘤、室管膜下巨细胞星形细胞瘤等都能发挥比较显著的作用。不过用的最多的还是经舒尼替尼或索拉非尼治疗失败后的晚期肾细胞...

蟹姬不擅长做什么? 蟹姬蟹生三件事不包括什么?阴阳师周年答题答案

蟹姬不擅长做什么? 蟹姬蟹生三件事不包括什么?阴阳师周年答题答案

蟹姬三件事不包括什么?这是阴阳师最新答题玩法求知恶灵中的题目,一定还有很多顽疾不知道蟹姬蟹生三件事不包括什么吧,其实蟹生三件事已经在蟹姬的式神传记中写的明明白白了哦!下面就让我们一起来看看这道题的答案...

跑跑卡丁车手游史前巨兽宝藏在哪 史前巨兽宝藏位置及夺宝技巧分享

跑跑卡丁车手游史前巨兽宝藏在哪 史前巨兽宝藏位置及夺宝技巧分享

跑跑卡丁车手游史前巨兽宝藏在哪?怎么夺宝呢?很多玩家都不是很清楚,下面小编带来一篇跑跑卡丁车手游史前巨兽宝藏在哪 史前巨兽宝藏位置及夺宝技巧分享。 一、任务解析 本周的任务名称为在史前巨兽的竞技场...

罗永浩首秀启示,直播电商与非计划性购物

罗永浩首秀启示,直播电商与非计划性购物

直播电商的“风口”不会因为罗永浩关闭,作为一种融合了直播内容形式和线上购物的结合体,它有自己独特的魅力。 愚人节晚八点,抖音、罗永浩搞了一出大戏,整体数据来看,弱于李佳琦、薇娅,开播第一个小时直播间...