UIUC2024 Summarize wp
找到六个九位数,以hex格式输出

关键函数
像这种运算的函数看起来非常抽象

所以可以将代码复制出来自己试一下
以sub_40163D为例
#include <stdio.h>
#include <string.h>
int func1(unsigned int a1, unsigned int a2)
{
unsigned int v5; // [rsp+10h] [rbp-18h]
char v6; // [rsp+14h] [rbp-14h]
unsigned int v7; // [rsp+18h] [rbp-10h]
unsigned int v8; // [rsp+1Ch] [rbp-Ch]
__int64 v9; // [rsp+20h] [rbp-8h]
v9 = 0;
v5 = 0;
v6 = 0;
while ( a1 || a2 )
{
v7 = a1 & 1;
v8 = a2 & 1;
a1 >>= 1;
a2 >>= 1;
v9 += (v5 ^ v8 ^ v7) << v6;
v5 = v5 & v7 | v8 & v7 | v5 & v8;
++v6;
}
return (v5 << v6) + v9;
}
int main() {
int a=func1(3,2);
printf("%d",a);
return 0;
}
所以可以判断这是加法函数
详细解释:
这个函数实现了一个二进制加法器,模拟了硬件全加器的行为
a1 和 a2: 输入的两个要相加的无符号整数
v5: 进位标志 (carry)
v6: 当前处理的位数 (从最低位开始)
v7: a1 的当前最低位
v8: a2 的当前最低位
v9: 存储累加结果的变量
算法流程
初始化:
所有变量初始化为0
循环处理每一位:
只要 a1 或 a2 还有未处理的位就继续循环
每次迭代处理最低位:
v7 = a1 & 1: 获取 a1 的最低位
v8 = a2 & 1: 获取 a2 的最低位
a1 >>= 1 和 a2 >>= 1: 右移一位,准备处理下一位
计算当前位和与进位:
当前位和: v5 ^ v8 ^ v7 (三个值的异或)
将当前位和左移到正确位置并累加到结果: v9 += (v5 ^ v8 ^ v7) << v6
计算新的进位: v5 = v5 & v7 | v8 & v7 | v5 & v8 (三个中有两个或三个为1则进位)
递增位数计数器:
v6++ 准备处理下一位
处理最终进位:
循环结束后,如果还有进位,将其左移到正确位置并加到结果中: (v5 << v6) + v9
其他也是一样的

那么就可以用z3来解决
其中sub函数

加的是一个负数,所以是减法
from z3 import *
s = Solver() # 创建了一个 Solver 对象 s
a1 = [BitVec('a%d' % i,32) for i in range(6)] # 变量
for i in range(6):
s.add(And(0x5F5E100 <= a1[i], a1[i] < 0x3B9AC9FF))
s.add(((a1[0] - a1[1]) + a1[2])%0x10AE961 == 4139449)
s.add((a1[0] + a1[1]) % 0x1093A1D == 9166034)
s.add(((3*a1[0]) - (2*a1[1])) % (a1[0] ^ a1[3]) == 556569677)
s.add(((a1[1] & (a1[2] + a1[0]))% 0x6E22) == 12734)
s.add((a1[1] + a1[3]) % a1[0] == 540591164)
s.add((a1[2] ^ (a1[3] + a1[5]))% 0x1CE628 == 1279714)
s.add((a1[4] - a1[5]) % 0x1172502 == 17026895)
s.add((a1[4] + a1[5]) % 0x2E16F83 == 23769303)
if s.check() == sat: #检查当前添加的所有约束条件是否存在满足的解,sat为满足
m = s.model()
# 按顺序打印所有变量的值
result = [m[a1[i]].as_long() for i in range(6)]
print(''.join([hex(x)[2:] for x in result]))
不建议像这样组合起来,还是分步搞好一些,因为由于运算优先级的问题检查了好几遍
输出2a142dd72e87fa9c1456a32d1bc4f77739975e5fcf5c6c0
flag:uiuctf{2a142dd72e87fa9c1456a32d1bc4f77739975e5fcf5c6c0}

浙公网安备 33010602011771号