// 侧边栏目录 // https://blog-static.cnblogs.com/files/douzujun/marvin.nav.my1502.css //目录导航 //生成目录索引列表

[羊城杯 2020]login

题目链接:https://www.ctfer.vip/problem/1417
题目考点:pyc z3 xor
下载完题目后检查没有upx,用IDA打开,查看字符串发现很多带py的字符串,猜测是python的exe文件(三分靠re七分靠猜)
对其进行反编译之后找到 login.pyc 这个文件进行反编译,得到源码之后发现是z3约束求解和异或
约束求解脚本:

from z3 import *
a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14 = Ints("code2 code1 code0 code3 code4 code5 code6 code7 code9 code8 code10 code11 code12 code13")
s = Solver()

s.add(a1 * 88 + a2 * 67 + a3 * 65 - a4 * 5 + a5 * 43 + a6 * 89 + a7 * 25 + a8 * 13 - a9 * 36 + a10 * 15 + a11 * 11 + a12 * 47 - a13 * 60 + a14 * 29 == 22748)
s.add(a1 * 89 + a2 * 7 + a3 * 12 - a4 * 25 + a5 * 41 + a6 * 23 + a7 * 20 - a8 * 66 + a9 * 31 + a10 * 8 + a11 * 2 - a12 * 41 - a13 * 39 + a14 * 17 == 7258)
s.add(a1 * 28 + a2 * 35 + a3 * 16 - a4 * 65 + a5 * 53 + a6 * 39 + a7 * 27 + a8 * 15 - a9 * 33 + a10 * 13 + a11 * 101 + a12 * 90 - a13 * 34 + a14 * 23 == 26190)
s.add(a1 * 23 + a2 * 34 + a3 * 35 - a4 * 59 + a5 * 49 + a6 * 81 + a7 * 25 + (a8 * 0x80) - a9 * 32 + a10 * 75 + a11 * 81 + a12 * 47 - a13 * 60 + a14 * 29 == 37136)
s.add(a1 * 38 + a2 * 97 + a3 * 35 - a4 * 52 + a5 * 42 + a6 * 79 + a7 * 90 + a8 * 23 - a9 * 36 + a10 * 57 + a11 * 81 + a12 * 42 - a13 * 62 - a14 * 11 == 27915)
s.add(a1 * 22 + a2 * 27 + a3 * 35 - a4 * 45 + a5 * 47 + a6 * 49 + a7 * 29 + a8 * 18 - a9 * 26 + a10 * 35 + a11 * 41 + a12 * 40 - a13 * 61 + a14 * 28 == 17298)
s.add(a1 * 12 + a2 * 45 + a3 * 35 - a4 * 9 - a5 * 42 + a6 * 86 + a7 * 23 + a8 * 85 - a9 * 47 + a10 * 34 + a11 * 76 + a12 * 43 - a13 * 44 + a14 * 65 == 19875)
s.add(a1 * 79 + a2 * 62 + a3 * 35 - a4 * 85 + a5 * 33 + a6 * 79 + a7 * 86 + a8 * 14 - a9 * 30 + a10 * 25 + a11 * 11 + a12 * 57 - a13 * 50 - a14 * 9 == 22784)
s.add(a1 * 8 + a2 * 6 + a3 * 64 - a4 * 85 + a5 * 73 + a6 * 29 + a7 * 2 + a8 * 23 - a9 * 36 + a10 * 5 + a11 * 2 + a12 * 47 - a13 * 64 + a14 * 27 == 9710)
s.add(a1 * 67 - a2 * 68 + a3 * 68 - a4 * 51 - a5 * 43 + a6 * 81 + a7 * 22 - a8 * 12 - a9 * 38 + a10 * 75 + a11 * 41 + a12 * 27 - a13 * 52 + a14 * 31 == 13376)
s.add(a1 * 85 + a2 * 63 + a3 * 5 - a4 * 51 + a5 * 44 + a6 * 36 + a7 * 28 + a8 * 15 - a9 * 6 + a10 * 45 + a11 * 31 + a12 * 7 - a13 * 67 + a14 * 78 == 24065)
s.add(a1 * 47 + a2 * 64 + a3 * 66 - a4 * 5 + a5 * 43 + a6 * 112 + a7 * 25 + a8 * 13 - a9 * 35 + a10 * 95 + a11 * 21 + a12 * 43 - a13 * 61 + a14 * 20 == 27687)
s.add(a1 * 89 + a2 * 67 + a3 * 85 - a4 * 25 + a5 * 49 + a6 * 89 + a7 * 23 + a8 * 56 - a9 * 92 + a10 * 14 + a11 * 89 + a12 * 47 - a13 * 61 - a14 * 29 == 29250)
s.add(a1 * 95 + a2 * 34 + a3 * 62 - a4 * 9 - a5 * 43 + a6 * 83 + a7 * 25 + a8 * 12 - a9 * 36 + a10 * 16 + a11 * 51 + a12 * 47 - a13 * 60 - a14 * 24 == 15317)
flag=[]
if s.check() == sat:
    ans=s.model()
    flag.append(ans[a1])
    flag.append(ans[a2])
    flag.append(ans[a3])
    flag.append(ans[a4])
    flag.append(ans[a5])
    flag.append(ans[a6])
    flag.append(ans[a7])
    flag.append(ans[a8])
    flag.append(ans[a9])
    flag.append(ans[a10])
    flag.append(ans[a11])
    flag.append(ans[a12])
    flag.append(ans[a13])
    flag.append(ans[a14])
for x in flag:
    print(x,end=",")

注意:解出来的数是a1到a14,而要的是code0到code13
得到未用md5加密的flag的代码:

#include<bits/stdc++.h>
using namespace std;

int main()
{
	int arr[14];
	arr[2]=119;
	arr[1]=24;
	arr[0]=10;
	arr[3]=7;
	arr[4]=104;
	arr[5]=43;
	arr[6]=28;
	arr[7]=91;
	arr[9]=52;
	arr[8]=108;
	arr[10]=88;
	arr[11]=74;
	arr[12]=88;
	arr[13]=33;
	
	for(int i=12;i>=0;i--)
		arr[i]=arr[i]^arr[i+1];
	for(int i=0;i<14;i++)
		printf("%c",arr[i]);
}

得到arr数组之后对其进行md5加密就是最后的flag
对于z3的模板可以参考:https://dandelioncloud.cn/article/details/1440271597616836610/

posted @ 2023-04-16 19:43  xihelhy  阅读(101)  评论(0)    收藏  举报