首页 > 其他分享 >不一样的flag

不一样的flag

时间:2023-05-01 12:55:37浏览次数:38  
标签:25 esp int flag v3 v4 一样 v5

查壳

32位,拖进IDA,老方法,找到flag,进入伪代码

int __cdecl __noreturn main(int argc, const char **argv, const char **envp)
{
  char v3[29]; // [esp+17h] [ebp-35h] BYREF
  int v4; // [esp+34h] [ebp-18h]
  int v5; // [esp+38h] [ebp-14h] BYREF
  int i; // [esp+3Ch] [ebp-10h]
  _BYTE v7[12]; // [esp+40h] [ebp-Ch] BYREF

  __main();
  v4 = 0;
  strcpy(v3, "*11110100001010000101111#");
  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", &v5);
    if ( v5 == 2 )
    {
      ++*(_DWORD *)&v3[25];
    }
    else if ( v5 > 2 )
    {
      if ( v5 == 3 )
      {
        --v4;
      }
      else
      {
        if ( v5 != 4 )
LABEL_13:
          exit(1);
        ++v4;
      }
    }
    else
    {
      if ( v5 != 1 )
        goto LABEL_13;
      --*(_DWORD *)&v3[25];
    }
    for ( i = 0; i <= 1; ++i )
    {
      if ( *(int *)&v3[4 * i + 25] < 0 || *(int *)&v3[4 * i + 25] > 4 )
        exit(1);
    }
    if ( v7[5 * *(_DWORD *)&v3[25] - 41 + v4] == 49 )
      exit(1);
    if ( v7[5 * *(_DWORD *)&v3[25] - 41 + v4] == 35 )
    {
      puts("\nok, the order you enter is the flag!");
      exit(0);
    }
  }
}

这个伪代码有点意思,我也是研究了好久(个人比较笨),解说一下思路

依旧先找正确的输出,满足条件是v7[5 * *(_DWORD *)&v3[25] - 41 + v4] == 35 --> 等于'#'时就说明是正确的flag

'#'哪里来 --> 拉到开头我们能见到

是字符串的最后一个,这个字符串的长度为25,即 0~24。还有 " 1上 2下 3左 4右",让人迷茫,

再看看输入和判断,v5 和 v4 跟 v3 有什么关系为什么每个判断上或多或少的都有他两,甚至还有v7

对内存的解读,v3的内存为[esp+17h][esp+34h],v4为[esp+34h][esp+38h],v5为[esp+38h]~[esp+3Ch]

知道内存的分布后,我们先看异常退出的点(exit(1))

我们已经知道内存的分布,那么算一下(int类型的转换(int是四个字节即(双字)))即可知道,在这个循环中,检查的是v4和v5的值是否是小于 0 或者大于 4 的,满足则异常退出

在看看语句

++,我们知道自增嘛,那么*(_DWORD *)是什么意思呢DWORD的意思是双字(也就是四个字节),这句话的意思是指向v3[25]后边的四个字节(包括v3[25]),使它自增 1。这样这篇伪代码几乎就能看懂了(这里注意,这里的内存依旧属于v3的内存)

在看看最后的判断语句

-41?看看v7的内存分布,我们可以知道,v7对应的是v3前25个内存中各个的字符,结合上述,走迷宫? --> 在判断中还有 5 *

将v3前25给字符以5*5的排列来看

*1111
01000
01010
00010
1111#

答案就出来了,0处可以走,1处不能走,用1上 2下 3左 4右来代表方向,flag{222441144222}收工

标签:25,esp,int,flag,v3,v4,一样,v5
From: https://www.cnblogs.com/TFOREVERY/p/17366397.html

相关文章

  • 为什么 Go for-range 的 value 值地址每次都一样?
    原文链接:为什么Gofor-range的value值地址每次都一样?循环语句是一种常用的控制结构,在Go语言中,除了for关键字以外,还有一个range关键字,可以使用for-range循环迭代数组、切片、字符串、map和channel这些数据类型。但是在使用for-range循环迭代数组和切片的时候,......
  • 年薪50W京东软件测试工程师的成长路 —— 我们都曾一样迷茫
    ​和朋友谈到软件测试行业的发展问题,其实软件测试现在已经不知不觉发生了非常大的变化,前几年的软件测试行业还是一个风口,人才缺口巨大,随着不断地转行人员以及毕业的大学生疯狂地涌入软件测试行业,目前软件测试行业“缺口”已经基本饱和。当然,我说的是最基础的功能测试的岗位需求已......
  • Vue 独立组件开发:不一样的组件通信方式
    本文是介绍独立组件开发的系列文章的第二篇。组件的通信组件一般来说有以下几种关系:父子关系隔代关系兄弟关系组件间经常会通信,Vue内置的通信手段一般有两种:ref:给元素或组件注册引用信息;$parent / $children:访问父/子实例。这两种方式都是直接得到组件的实例,然后直接调用组件......
  • Linq专题之提高编码效率—— 第二篇 神一样的匿名类型
    说起匿名类型,我们都知道这玩意都是为linq而生,而且匿名类型给我们带来的便利性大家在实战中应该都体会到了,特别适合于一次性使用,临时使用这些场景,虽然说是匿名类型,也就是说是有类型的,只是匿名了而已,对吧,这篇我们就来探索下匿名类型到底和linq有多大关系呢???......
  • 像工程师一样思考
    像工程师一样思考要想成为一名工程师,最重要的一点就是能够像工程师一样处理问题,面对未知或已知的事件能够像工程师一样思考。工程师和小白最大的区别是什么?知识吗?工程师也经常接触自身知识范围以外的任务。经验吗?工程师也经常需要解决从未见过的新问题。工具吗?先前的文章里已......
  • Qt5.9 UI设计(七)——统一样式设计
    前言前面已经将UI设计部分实现,各页面也做了最简单的设计,本章介绍一下qss样式的使用。样式设计最终的显示效果如下图:操作步骤将stylesheet.qss样式文件添加进工程stylesheet.qss内容如下:/**********************MainWindowStyleSheet*******************/QMainWind......
  • 为什么每次建立TCP连接时初始化的序列号都要求不一样
    为了防止历史报文被下一个相同的四元组的连接接受假设每次建立连接。客户端和服务端的初始化序列号都是从0开始的客户端和服务端建立了一个TCP连接,在客户端发送数据包被网络阻塞了然后超时重传了这个数据包,而此时服务端断电重启,之前与客户端建立的连接也消失了,于是收到客户端的数......
  • python3正则-修饰符flags
    1、介绍在re模块的函数中,多数允许设置修饰符flags参数,其用于对匹配做优化和个性设置。2、修饰符修饰符实质上是int参数类型,可以直接指定int类型,也可以通过re调用变量名称指定。修饰符描述re.I使匹配对大小写不敏感re.L做本地化识别(locale-aware)匹配re.M多行......
  • 对矩阵乘以矩阵的转置和矩阵进行奇异值分解得到的向量是一样的。
    w=rand(4,6)[Ud,Sd,Vd]=svds(w/6,4)[Ud1,Sd1,Vd1]=svds(w*w'/6,4)发现Ud和Ud1的向量值是一样的,或者是相反的。  ......
  • mac使用【预览】实现和win一样的【画图】功能
    1,打开预览软件,这个是mac自带的2,截屏3,全选删除截图4,打开工具栏按一下画笔一样的图标把工具栏显示出来就可以随便画了(或者选择菜单:显示-显示标记工具栏)。注意先调整一下画布尺寸,不然可花区域会比较小,然后就可以愉快的花各种图案了可以改颜色,添加字体,等,......