[长安“战疫”网络安全卫士守护赛]hello_py
[RE] hello_py
flag{He110_cazy}
本题主要考察线程知识
首先拿到.pyc
文件,随便找个网站在线反编译一下:
生成对应的有效.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
数组,这个数组做了很简单的异或加密。
作者发布、转载的任何文章中所涉及的技术、思路、工具仅供以安全目的的学习交流,并严格遵守《中华人民共和国网络安全法》、《中华人民共和国数据安全法》等网络安全法律法规。
任何人不得将技术用于非法用途、盈利用途。否则作者不对未许可的用途承担任何后果。
本文遵守CC BY-NC-SA 3.0协议,您可以在任何媒介以任何形式复制、发行本作品,或者修改、转换或以本作品为基础进行创作
您必须给出适当的署名,提供指向本文的链接,同时标明是否(对原文)作了修改。您可以用任何合理的方式来署名,但是不得以任何方式暗示作者为您或您的使用背书。
同时,本文不得用于商业目的。混合、转换、基于本作品进行创作,必须基于同一协议(CC BY-NC-SA 3.0)分发。
如有问题, 可发送邮件咨询.