博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BUUOJ reverse 不一样的flag
阅读量:5124 次
发布时间:2019-06-13

本文共 1792 字,大约阅读时间需要 5 分钟。

不一样的flag

是不是做习惯了常规的逆向题目?试试这道题,看你在能不能在程序中找到真正的flag!注意:flag并非是flag{XXX}形式,就是一个’字符串‘,考验眼力的时候到了! 注意:得到的 flag 请包上 flag{} 提交

 

ida看伪C代码:

int __cdecl main(int argc, const char **argv, const char **envp){  char v3; // [esp+17h] [ebp-35h]  int v4; // [esp+30h] [ebp-1Ch]  int v5; // [esp+34h] [ebp-18h]  signed int v6; // [esp+38h] [ebp-14h]  int i; // [esp+3Ch] [ebp-10h]  int v8; // [esp+40h] [ebp-Ch]  __main();  v4 = 0;  v5 = 0;  qmemcpy(&v3, _data_start__, 0x19u);  while ( 1 )  {    puts("you can choose one action to execute");    puts("1 up");    puts("2 down");    puts("3 left");    printf("4 right\n:");    scanf("%d", &v6);    if ( v6 == 2 )    {      ++v4;    }    else if ( v6 > 2 )    {      if ( v6 == 3 )      {        --v5;      }      else      {        if ( v6 != 4 )LABEL_13:          exit(1);        ++v5;      }    }    else    {      if ( v6 != 1 )        goto LABEL_13;      --v4;    }    for ( i = 0; i <= 1; ++i )    {      if ( *(&v4 + i) < 0 || *(&v4 + i) > 4 )        exit(1);    }    if ( *((_BYTE *)&v8 + 5 * v4 + v5 - 41) == 49 )      exit(1);    if ( *((_BYTE *)&v8 + 5 * v4 + v5 - 41) == 35 )    {      puts("\nok, the order you enter is the flag!");      exit(0);    }  }}

可以看到每次都将用户的输入存到v6里面,然后根据v6的值来调整v4和v5的值,输入1就让v4--   2就让v4++  3就让v5--   4就让v5++

下面这一段代码说明v4 和v5取值都必须在0~4之间:

for ( i = 0; i <= 1; ++i )    {      if ( *(&v4 + i) < 0 || *(&v4 + i) > 4 )        exit(1);    }

关键在于这一段代码:

if ( *((_BYTE *)&v8 + 5 * v4 + v5 - 41) == 49 )      exit(1);    if ( *((_BYTE *)&v8 + 5 * v4 + v5 - 41) == 35 )    {

我们仔细看主函数的代码,发现v8是一直没有动过的,再仔细算一下  &v8 + 5 * v4 + v5 - 41 这个偏移量是 &v8-41 到&v8-17之间,也就是完全落在v3的25个值里面!

他的逻辑是 如果算出来&v8 + 5 * v4 + v5 - 41 这个偏移量对应的值如果是1就退出,否则继续,直到找到“#”这个值

所以这个题本质上是个走迷宫.........

纯手走的 答案是:222441144222

转载于:https://www.cnblogs.com/dyhaohaoxuexi/p/11421648.html

你可能感兴趣的文章
架构实战:(一)Redis采用主从架构的原因
查看>>
安装php时,make步骤报错make: *** [sapi/fpm/php-fpm] Error 1
查看>>
安卓——launchMode
查看>>
jQuery 实现一个简单的信息反馈或者信息收集的页面
查看>>
Handler post用法整理
查看>>
MySQL修改表名示例
查看>>
Windows安装mysql8.0
查看>>
基于docker创建的Jenkins,settings.xml文件放在哪里
查看>>
mongodb读取测试
查看>>
【飞谷六期】爬虫项目4
查看>>
Android-Animations的使用大全之二:Frame Animation和其他
查看>>
文档基本结构标签的作用
查看>>
VMware的linux虚拟机实现和windows的文件共享
查看>>
657. Judge Route Circle
查看>>
android旋转动画的两种实现方式
查看>>
Hibernate4之session核心方法
查看>>
HTML5前端开发学习路线建议,学习前端的必备知识点
查看>>
python 运维自动化之路 Day2
查看>>
ASP.NET 错误
查看>>
[转载]抓大放小,要事为先
查看>>