攻防世界 Reverse——game

在这里插入图片描述打开附件是一个exe可执行程序
在这里插入图片描述这里的游戏说明大概的意思就是,打开这八条线路的开关使八盏灯同时亮起来。

方法一

由于游戏难度不高,可以选择跟着他的游戏规则来
最简单的做法之一,就是从一按到八就能完成
但是这太没技术含量了,相信来刷题的肯定不会止步于此,比赛的话另说。

方法二

先丢到exeinfo里看一下,发现这是一个用c语言写的32位exe文件,且无壳
在这里插入图片描述既是32位,我们就用ida32打开1,F5一键反编译,Alt+T查找main函数。
在这里插入图片描述跳转之后,看到了运行时显示的规则,还有数字输入错误的提示,那我们继续往下看
在这里插入图片描述看到有一串代码是对输入值的大小进行检测,如果符合条件则break中止,如果不符合条件,则触发sub_45A8BE,通过int提示try again。
下面还有一个对v4进行处理的代码,看看里面有什么
在这里插入图片描述通过sub_4576D6跳转两次后看到。这里的作用是对字符进行替换
在这里插入图片描述继续回到main函数,这里是对结果的检测,看起来很像通关之后的跳转
在这里插入图片描述
通过sub_457AB4跳转2次后看到,flag!!!
在这里插入图片描述
先别激动,这里看起来还要我们算一下

如果学过c语言这里就很好懂了,没学过问题也不大,这里就是一个for循环,i从0开始,先进入循环,每循环一次i+1
下面的^=的意思是进行或运算,0x1316进制,后面的u嘛,是c语言里的东西,意思是无符号整型常量,不用管

*(&v2 + i) 是 C 语言中的指针运算。它的含义是将数组 `v2` 的地址加上 `i` 个元素的偏移量,然后通过 `*` 运算符取出结果所指向的值。

这种写法可以方便地对数组进行遍历,通过简单的指针算术实现对数组元素的访问和操作。
在给定的代码中,`*(&v2 + i)` 就是访问数组 `v2` 在索引 `i` 处的元素。

请注意,在指针运算中,`&` 运算符表示取地址,`*` 运算符表示取指针指向的值。
通过这样的指针运算,可以实现对数组元素的逐个访问。

在这里插入图片描述
我们把v2和v59地址增加后的数字编写进数组
那么我们写一个python脚本

v59 = [18, 64, 98, 5, 2, 4, 6, 3, 6, 48, 49, 65, 32, 12, 48, 65, 31, 78, 62, 32,
       49, 32, 1, 57, 96, 3, 21, 9, 4, 62, 3, 5, 4, 1, 2, 3, 44,65, 78, 32, 16,
       97, 54, 16, 44, 52, 32, 64, 89, 45, 32, 65, 15, 34, 18, 16, 0]
v2 = [123, 32, 18, 98, 119, 108, 65, 41, 124, 80, 125, 38, 124, 111, 74, 49, 83, 108, 94,
      108, 84, 6, 96, 83, 44, 121, 104, 110, 32, 95, 117, 101, 99, 123, 127, 119, 96, 48,
      107, 71, 92, 29, 81, 107, 90, 85, 64, 12, 43, 76, 86, 13, 114, 1, 117, 126, 0]
flag = ' '
for i in range(56):
    v2[i] ^= v59[i]
    v2[i] ^= 0x13
    flag += chr(v2[i])
print(flag)

运行后得到
在这里插入图片描述


  1. ida安装后会出现两个快捷方式,一个ida32,一个ida64,分别用于不同位数的文件 ↩︎

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值