buuctf 题解——逆向

xor

下载文件后用ida打开,查看伪代码,分析可得该程序需要用户输入一串字符,然年后令该字符的第i位与第i-1位进行异或,异或后的结果与global对应的字符串进行比较,故该题的flag需要我们逆向异或(即从最后一位开始向前异或)后正向输出

跟进global得到字符串后转化为十进制数

编写程序并运行得到结果

Reverse 3:

先查壳

32位可执行文件,无壳,拖到ida32分析

跟踪sub_41110BE发现从键盘读入的字符串经过了base64加密,加密后再经过一个循环,得到的字符串与Str相同,跟踪进Str2字符串

因此要得到flag,需要反向设计循环后base64解密,编写代码和运行结果如下:

将该字符串拉去base64解码工具解码得到flag

不一样的flag:

查壳:

32位,无壳,拖到ida里分析

经分析大概意思是我们输入的每一个数字都代表向一个方向移动,如果是移动到了“1”的话就直接退出了,如果移动到了“#”的话就算我们输入的flag是 正确的,即视为通关。这是一个迷宫的地图,根据他给出的一串数字"*11110100001010000101111#",可以得出“*”是迷宫的起点,“#”是迷宫的终点,中间只能经过0,不能经过1.由后面判断语句 v7[5 * *(_DWORD *)&v3[25] - 41 + v4] == '#'中的“5*”可以推出迷宫图有5列,每一行都有相同数量的数字,故只有一种排列方法如下:

为什么说“5*”就代表有五列呢?因为数字在数组中是线性排列的,也就是说这个迷宫图数字对应在数组中的位次是如下:

每上下两数字之差为5,而*(_DWORD *)&v3[25]代表的是上下移动,每次上下移动对应原来的数组位次加5,故5**(_DWORD *)&v3[25]代表上下移动次数。综上5 * *(_DWORD *)&v3[25]+v4代表的是操作后的位置。最外面是一个大循环,故每一次循环都执行一次操作。v7[]里面为什么要减41?我们进行调试操作,用F8往下走直到走到输入函数那里,随便输入一个数字后双击伪代码中的v7查看v7地址

后两位F0对应十进制为240,计算240-41为199,199对应的十六进制数是C7,往上查找到C7,

C7存储的字符是“*”正好是迷宫图起点,因此V7数组相比V3数组偏移41,故要在V7[]里面减41.回到迷宫图,所以我们的flag正是在不踩到“1”的情况下走到#的路线所对应的数字。

路线为下下下右右上上右右下下下,对应的数字为“222441144222”,所以flag{222441144222}

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值