BUUCTF 不一样的flag

BUUCTF 不一样的flag

考点:还是基础的IDA使用。

在这里插入图片描述

拿到题目,先打开程序。

在这里插入图片描述

乱按一通之后,会闪退。

Exeinfo PE打开之后,发现是32位。

在这里插入图片描述

IDA pro32位的打开。

shift + F12 查看字符串窗口,发现一串字符串。

双击定位。在这里插入图片描述

在这里插入图片描述

ctrl + X 交叉引用

在这里插入图片描述

在这里插入图片描述

F5反编译后得到如下的伪代码:

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);
}
}
}

我们看到if语句这个49和35有点奇怪,R字符转换之后。

在这里插入图片描述

分析一波,此处两个if的意思是,如果这一串代码 == 1,就异常退出。如果这一串代码 == #,就输出一句话,并正常退出。

没有思路再回去看题目的提示,发现关键点是字符串,再次寻找字符串窗口,看到一串字符串。

在这里插入图片描述
发现 1 和 # ,推测一波,这是不是就是迷宫的地图,

*11110100001010000101111#

把它分成5个一组得到:
*1111

01000

01010

00010

1111#

可以发现是从*开始走,走 0 不走 1,所以由上到下应该是 下下下右右上上右右下下下。

对应的数字是222441144222

走出迷宫,推测正确。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值