KeyLead(Points 150)

本题是一道64位elf逆向题。通过IDA静态分析出的代码结合EDB动态调试,可以很容易地得到flag。

通过CTRL+F5得到关键代码如下:

主函数:

signed __int64 sub_400E6E()
{
  char v0; // ST1F_1@1
  unsigned int v1; // eax@1
  int v2; // ST14_4@1
  signed __int64 result; // rax@3
  int v4; // [sp+4h] [bp-1Ch]@1
  int v5; // [sp+8h] [bp-18h]@1
  int v6; // [sp+Ch] [bp-14h]@1
  int v7; // [sp+10h] [bp-10h]@1
  int v8; // [sp+18h] [bp-8h]@1

  puts("hi all ----------------------");  //call 400540就是puts函数
  puts("Welcome to dice game!");
  puts("You have to roll 5 dices and get 3, 1, 3, 3, 7 in order.");
  puts("Press enter to roll.");
  v0 = getchar();  //call 400580就是getchar函数
  v1 = time(0LL);   //call 4005a0就是time函数,获取当前的系统时间,并且以16进制形式保存到eax中
  srand(v1);        //call 400570就是srand函数,用于生成rand函数的种子
  v8 = time(0LL);
  v2 = rand() % 6 + 1;
  v7 = rand() % 6 + 1;
  v6 = rand() % 6 + 1;
  v5 = rand() % 6 + 1;
  v4 = rand() % 6 + 1;
  printf(
    "You rolled %d, %d, %d, %d, %d.\n",
    (unsigned int)v2,
    (unsigned int)v7,
    (unsigned int)v6,
    (unsigned int)v5,
    (unsigned int)v4);
  **if ( v2 != 3 )**
    goto LABEL_20;
  **if ( time(0LL) - v8 > 2 )**
  {
    puts("No cheat!");
    return 0xFFFFFFFFLL;
  }
  **if ( v7 != 1 )**
    goto LABEL_20;
  **if ( time(0LL) - v8 > 2 )**
  {
    puts("No cheat!");
    return 0xFFFFFFFFLL;
  }
  **if ( v6 != 3 )**
    goto LABEL_20;
  **if ( time(0LL) - v8 > 2 )**
  {
    puts("No cheat!");
    return 0xFFFFFFFFLL;
  }
  **if ( v5 != 3 )**
    goto LABEL_20;
  **if ( time(0LL) - v8 > 2 )**
  {
    puts("No cheat!");
    return 0xFFFFFFFFLL;
  }
  **if ( v4 != 7 )**
  {
LABEL_20:
    puts("You DID NOT roll as I said!");
    puts("Bye bye~");
    result = 0xFFFFFFFFLL;
  }
  **else if ( time(0LL) - v8 <= 2 )**
  {
    puts("You rolled as I said! I'll give you the flag.");
    sub_4006B6();
    result = 0LL;
  }
  else
  {
    puts("No cheat!");
    result = 0xFFFFFFFFLL;
  }
  return result;
}

flag生成函数:

void sub_4006B6()
{
......
}
整个代码的逻辑就是:当你输入的5个字符经过sub400E6E函数的转换后,如果是31337,且每轮耗时不超过2秒,则进入

sub4006B6函数,打印出flag,否则失败。

我们不用管sub4006B6函数的具体逻辑,只要通过edb运行程序,并在遇到关键的判断条件(已在上面代码中加粗标识出)时

,将rax等相关寄存器中的数值改成能够通过条件判断的数值即可。

Flag:

温馨提示: 此处内容需要评论本文后刷新才能查看,支付2元即可直接查看所有Flag。

小广告:关于获取西普实验吧所有Flag请点击这里查看索引

查看所有Flag文章需要输入密码,需要获取文章密码的童鞋请扫描下面微信或支付宝二维码捐助至少2元(老哥,捐多捐少是个缘分)之后发送支付凭证号联系我获取,Flag大全地址:Flag大全

新功能:捐款的小伙伴请联系我把自己的注册邮箱加入网站白名单,可以免回复看到本站所有Flag

PS:本站不是实验吧的官方站点,纯粹是个人博客,收取Flag费用仅是维持服务器费用,做站不易,且行窃珍惜!

微信二维码:
支付宝二维码: