美文网首页
ppp ---- XCTF嘉年华体验赛逆向题Re1

ppp ---- XCTF嘉年华体验赛逆向题Re1

作者: Adam_0 | 来源:发表于2019-02-08 00:55 被阅读0次

这道题简单粗暴,拖进IDA,F5大法,查看main伪C代码,如下:

int __cdecl main(int argc, const char **argv, const char **envp)
{
  int result; // eax
  int v4; // [esp+24h] [ebp-84h]
  int v5; // [esp+30h] [ebp-78h]
  char nptr; // [esp+38h] [ebp-70h]
  unsigned int v7; // [esp+9Ch] [ebp-Ch]

  v7 = __readgsdword(0x14u);
  printf("please input the key:");
  memset(&nptr, 0, 0x64u);
  __isoc99_scanf("%s", &nptr);
  if ( strlen(&nptr) != 4
    || (v4 = atoi(&nptr), v5 = v4 % 100 / 10, v4 % 10 + v5 + v4 / 1000 + v4 % 1000 / 100 != 23)
    || v5 / (v4 % 10) != 2
    || v4 % 1000 / 100 - v5 != -1
    || v4 / 1000 % v5 != 3 )
  {
    puts("wrong!");
    result = 1;
  }
  else
  {
    puts("correct!");
    result = 1;
  }
  return result;
}

简单分析得到,输入四个字符,然后通过atoi()函数转换成 int 型,再判断个位,十位,百位,千位的和为23,十位除以个位为2,百位减去十位为-1,千位对十位求余为3 时 correct !
所以我们可以直接忽略atoi(),直接输入四位整数,判断是否满足条件。上脚本(之前b,c,d,e没有换成整型都把我弄自闭了):

for a in range(1000,10000):
    b = int(a%10)            # 个位
    c = int(a%100/10)        # 十位
    d = int(a%1000/100)      # 百位
    e = int(a/1000)          # 千位
    if(b==0):
        continue
    if(c==0):
        continue
    if ((b+c+d+e==23)and(c/b==2)and(d-c==-1)and(e%c==3)):   # 判断条件
        print(a)  

结果为9563。

相关文章

网友评论

      本文标题:ppp ---- XCTF嘉年华体验赛逆向题Re1

      本文链接:https://www.haomeiwen.com/subject/jtrnsqtx.html