警告
本文最后更新于 2021-06-26,文中内容可能已过时。
只记录一下 BabyOC, 第二次遇到这种类型的, 运气好拿了个一血
题目使用 Objective-C 编写. 在 ArchLinux 下想要运行附件需要 sudo pacman -S gnustep-base
.
由于没有相关开发经验, 只能简单查看 offical website 中给出的 oc 中 oop 的核心概念. 结合题目, 我个人理解的是使用一种类似 通信 的方式来实现函数调用等等. 同时函数调用时除了函数名, 貌似会生成一种 对象签名(也是我自己理解编出来的词汇, 不准确请见谅)来标识实际被调用者, 这一点也是后面用到的.
简单 IDA 里看一下:
创建了两个对象, 并在 input 方法里面进行初始化, 通过 xref 可以找到对象结构和调用函数:
一种链式的调用过程:
发现是分奇偶位进行异或. 同样分析 calc 函数, 这里注意需要调试一下, 因为 + 和 ^ 是先后调用的.
keygen 如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| data = [1270, 2767, 5549, 9672, 11938, 16093, 29864, 30379, 22184, 20690, 25002,
65039, 65793, 97983, 100411, 67904, 88053, 28147, 18776, 71764, 127654,
39994, 30276, 33151, 49377, 62682, 128398, 32406]
key = [0x4E1 * i for i in range(28)]
for i in range(1, 28):
if i % 2 == 1:
data[i] ^= data[i - 1]
else:
data[i] -= data[i - 1]
for i in range(26, -1, -1):
if i % 2 == 0:
data[i] ^= data[i + 1]
else:
data[i] -= data[i + 1]
for i in range(28):
print(chr(data[i] ^ key[i]), end='')
|