[长安“战疫”网络安全卫士守护赛]hello_py

[RE] hello_py

flag{He110_cazy}

本题主要考察线程知识

首先拿到.pyc文件,随便找个网站在线反编译一下:

image

生成对应的有效.py源代码,查看源代码

#!/usr/bin/env python
# visit https://tool.lu/pyc/ for more information
import threading
import time

def encode_1(n):
    global num
    if num >= 0:
        flag[num] = flag[num] ^ num
        num -= 1
        time.sleep(1)
    if num <= 0:
        pass
    


def encode_2(n):
    global num
    if num >= 0:
        flag[num] = flag[num] ^ flag[num + 1]
        num -= 1
        time.sleep(1)
    if num < 0:
        pass
    

Happy = [
    44,
    100,
    3,
    50,
    106,
    90,
    5,
    102,
    10,
    112]
num = 9
f = input('Please input your flag:')
if len(f) != 10:
    print('Your input is illegal')
    continue
flag = list(f)
j = 0
print("flag to 'ord':", flag)
t1 = threading.Thread(encode_1, (1,), **('target', 'args'))
t2 = threading.Thread(encode_2, (2,), **('target', 'args'))
t1.start()
time.sleep(0.5)
t2.start()
t1.join()
t2.join()
if flag == Happy:
    print('Good job!')
    continue
print('No no no!')
continue

程序中出现了使用thread的痕迹。首先把Happy数组取出备用。然后查看对线程的操作。这里可见两个线程中存在对同一个资源进行同时访问的情况,因此估计存在交叉修改的问题。根据以下代码又证实了我的观点:

t1.start()
time.sleep(0.5)
t2.start()

这段代码表示了两个线程在不同时启动,但是线程之中含有时间复杂度差不多的两个语句和一个相同的延时指令。也就是说,这里的两个线程是混合执行的,分别对num依此处理。此处的t1首先被调用,因此可以肯定t1线程处理的是num = 0,2,4,...这样的序列对应的值,反之亦然。因而可以编写一个对应的小程序来执行这一过程

#include <cstdio>
//关键:thread交替打断
int main(int argc, char** argv)
{
    char happy[] = { 44,100,3,50, 106, 90, 5, 102,10,112 };
    char flag[64] = { 0 };
    for (int i = 0; i < 10; i++)
    {
        if (i % 2 == 1)flag[i] = happy[i] ^ i;
        if (i % 2 == 0)flag[i] = happy[i] ^ happy[i + 1];
    }
    for (int i = 0; i < 32; i++)
    {
        printf("%c", flag[i]);
    }
    return 0;
}

这里我们知道了Happy数组,这个数组做了很简单的异或加密。

posted @ 2022-01-08 21:05  二氢茉莉酮酸甲酯  阅读(42)  评论(0编辑  收藏  举报