Logo WP

2024-04-30

baby_tree#

Swift底层进阶--001:Swift编译 & SIL分析 - 简书 (jianshu.com)

docker pull swift
docker run -it -v .\swift_docker:/swift_docker swift
swiftc -emit-ir baby_tree.ast -o baby_tree.ll
Article Image

brace_stmt 表示花括号 {} 中的语句块

pattern_binding_decl 表示模式绑定声明,用于声明变量并将其与特定模式匹配的值绑定在一起。

binary_expr 表示二元表达式

(binary_expr
  (operand)
  (operator_token)
  (operand)
)

dot_syntax_call_expr 表示通过点语法调用的表达式,通常用于访问类型的属性或调用类型的方法。

(dot_syntax_call_expr
  (base_expr)      // 基础表达式,表示调用的对象或类型
  (dot_token)      // 点号(.)标记,用于表示点语法调用
  (name)           // 成员名称,表示被调用的属性或方法名
  (argument_list)  // 参数列表,表示方法调用时的参数
)

有个foreach

分析出来算法了,但是发现无法用z3解出来——这里要用16位,不能用8位,因为8位会有精度损失

data = [88,35,88,225,7,201,57,94,77,56,75,168,72,218,64,91,16,101,32,207,73,130,74,128,76,201,16,248,41,205,103,84,91,99,79,202,22,131,63,255,20,16]

from z3 import *
solver = Solver()

flag = [BitVec(f"bv_{i}", 16) for i in range(len(data))]

save = [f for f in flag]
[solver.add(And(f <= 0x7E, f >= 0x20)) for f in save]

k = b"345y"

for i in range(len(flag) - 3):
    r0 = flag[i]
    r1 = flag[i+1]
    r2 = flag[i+2]
    r3 = flag[i+3]

    flag[i+0] = r2 ^ ((k[0] + (r0 >> 4)) & 0xff)
    flag[i+1] = r3 ^ ((k[1] + (r1 >> 2)) & 0xff)
    flag[i+2] = r0 ^ k[2]
    flag[i+3] = r1 ^ k[3]

    k = bytes([k[1],k[2],k[3],k[0]])

for i in range(len(data)):
    solver.add(flag[i] == data[i])

if solver.check() == sat:
    m = solver.model()
    print(''.join(chr(m[save[i]].as_long()) for i in range(len(data))))
else:
    print("Damn!")