0x00 题目分析

powershell混淆

关于powershell脚本:https://learn.microsoft.com/zh-cn/powershell/module/microsoft.powershell.core/about/about_scripts?view=powershell-7.4

powershell的使用:https://blog.csdn.net/qq_41874930/article/details/108146932

关于powershell中的IEX:https://learn.microsoft.com/zh-cn/powershell/module/microsoft.powershell.utility/invoke-expression?view=powershell-7.4

powershell反混淆:https://www.freebuf.com/articles/system/181697.html

github反混淆项目:https://github.com/Malandrone/PowerDecode

0x01 解

后缀改为.ps1运行下看看

010开来看看

混淆

把末尾的| .${-``}去掉可以拿到假flag,而且还有个信息:${-``}="iex"

解出来看看

1
2
3
4
5
import re
c = "[CHar]70+[CHar]117+[CHar]110+[CHar]99+[CHar]116+[CHar]105+[CHar]111+[CHar]110+[CHar]32+[CHar]95+[CHar]47+[CHar]61+[CHar]61+[CHar]47+[CHar]61+[CHar]95+[CHar]95+[CHar]61+[CHar]95+[CHar]123+[CHar]10+[CHar]32+[CHar]32+[CHar]32+[CHar]32+[CHar]91+[CHar]67+[CHar]109+[CHar]100+[CHar]108+[CHar]101+[CHar]116+[CHar]66+[CHar]105+[CHar]110+[CHar]100+[CHar]105+[CHar]110+[CHar]103+[CHar]40+[CHar]41+[CHar]93+[CHar]32+[CHar]112+[CHar]97+[CHar]114+[CHar]97+[CHar]109+[CHar]40+[CHar]10+[CHar]32+[CHar]32+[CHar]32+[CHar]32+[CHar]32+[CHar]32+[CHar]32+[CHar]32+[CHar]91+[CHar]80+[CHar]97+[CHar]114+[CHar]97+[CHar]109+[CHar]101+[CHar]116+[CHar]101+[CHar]114+[CHar]40+[CHar]80+[CHar]111+[CHar]115+[CHar]105+[CHar]116+[CHar]105+[CHar]111+[CHar]110+[CHar]32+[CHar]61+[CHar]32+[CHar]48+[CHar]41+[CHar]93+[CHar]10+[CHar]32+[CHar]32+[CHar]32+[CHar]32+[CHar]32+[CHar]32+[CHar]32+[CHar]32+[CHar]91+[CHar]83+[CHar]116+[CHar]114+[CHar]105+[CHar]110+[CHar]103+[CHar]93+[CHar]10+[CHar]32+[CHar]32+[CHar]32+[CHar]32+[CHar]32+[CHar]32+[CHar]32+[CHar]32+[CHar]36+[CHar]112+[CHar]97+[CHar]114+[CHar]97+[CHar]109+[CHar]49+[CHar]10+[CHar]32+[CHar]32+[CHar]32+[CHar]32+[CHar]41+[CHar]10+[CHar]32+[CHar]32+[CHar]32+[CHar]32+[CHar]36+[CHar]114+[CHar]101+[CHar]115+[CHar]117+[CHar]108+[CHar]116+[CHar]32+[CHar]61+[CHar]32+[CHar]91+[CHar]84+[CHar]101+[CHar]120+[CHar]116+[CHar]46+[CHar]69+[CHar]110+[CHar]99+[CHar]111+[CHar]100+[CHar]105+[CHar]110+[CHar]103+[CHar]93+[CHar]58+[CHar]58+[CHar]85+[CHar]84+[CHar]70+[CHar]56+[CHar]46+[CHar]71+[CHar]101+[CHar]116+[CHar]83+[CHar]116+[CHar]114+[CHar]105+[CHar]110+[CHar]103+[CHar]40+[CHar]91+[CHar]67+[CHar]111+[CHar]110+[CHar]118+[CHar]101+[CHar]114+[CHar]116+[CHar]93+[CHar]58+[CHar]58+[CHar]70+[CHar]114+[CHar]111+[CHar]109+[CHar]66+[CHar]97+[CHar]115+[CHar]101+[CHar]54+[CHar]52+[CHar]83+[CHar]116+[CHar]114+[CHar]105+[CHar]110+[CHar]103+[CHar]40+[CHar]36+[CHar]112+[CHar]97+[CHar]114+[CHar]97+[CHar]109+[CHar]49+[CHar]41+[CHar]41+[CHar]10+[CHar]32+[CHar]32+[CHar]32+[CHar]32+[CHar]114+[CHar]101+[CHar]116+[CHar]117+[CHar]114+[CHar]110+[CHar]32+[CHar]36+[CHar]114+[CHar]101+[CHar]115+[CHar]117+[CHar]108+[CHar]116+[CHar]10+[CHar]125+[CHar]10+[CHar]10+[CHar]70+[CHar]117+[CHar]110+[CHar]99+[CHar]116+[CHar]105+[CHar]111+[CHar]110+[CHar]32+[CHar]95+[CHar]92+[CHar]47+[CHar]95+[CHar]92+[CHar]95+[CHar]61+[CHar]123+[CHar]10+[CHar]32+[CHar]32+[CHar]32+[CHar]32+[CHar]91+[CHar]67+[CHar]109+[CHar]100+[CHar]108+[CHar]101+[CHar]116+[CHar]66+[CHar]105+[CHar]110+[CHar]100+[CHar]105+[CHar]110+[CHar]103+[CHar]40+[CHar]41+[CHar]93+[CHar]32+[CHar]112+[CHar]97+[CHar]114+[CHar]97+[CHar]109+[CHar]40+[CHar]10+[CHar]32+[CHar]32+[CHar]32+[CHar]32+[CHar]32+[CHar]32+[CHar]32+[CHar]32+[CHar]91+[CHar]80+[CHar]97+[CHar]114+[CHar]97+[CHar]109+[CHar]101+[CHar]116+[CHar]101+[CHar]114+[CHar]40+[CHar]80+[CHar]111+[CHar]115+[CHar]105+[CHar]116+[CHar]105+[CHar]111+[CHar]110+[CHar]32+[CHar]61+[CHar]32+[CHar]48+[CHar]41+[CHar]93+[CHar]10+[CHar]32+[CHar]32+[CHar]32+[CHar]32+[CHar]32+[CHar]32+[CHar]32+[CHar]32+[CHar]91+[CHar]83+[CHar]116+[CHar]114+[CHar]105+[CHar]110+[CHar]103+[CHar]93+[CHar]10+[CHar]32+[CHar]32+[CHar]32+[CHar]32+[CHar]32+[CHar]32+[CHar]32+[CHar]32+[CHar]36+[CHar]112+[CHar]97+[CHar]114+[CHar]97+[CHar]109+[CHar]49+[CHar]10+[CHar]32+[CHar]32+[CHar]32+[CHar]32+[CHar]41+[CHar]10+[CHar]10+[CHar]32+[CHar]32+[CHar]32+[CHar]32+[CHar]36+[CHar]112+[CHar]97+[CHar]114+[CHar]97+[CHar]109+[CHar]49+[CHar]32+[CHar]61+[CHar]32+[CHar]95+[CHar]47+[CHar]61+[CHar]61+[CHar]47+[CHar]61+[CHar]95+[CHar]95+[CHar]61+[CHar]95+[CHar]32+[CHar]45+[CHar]112+[CHar]97+[CHar]114+[CHar]97+[CHar]109+[CHar]49+[CHar]32+[CHar]36+[CHar]112+[CHar]97+[CHar]114+[CHar]97+[CHar]109+[CHar]49+[CHar]10+[CHar]32+[CHar]32+[CHar]32+[CHar]32+[CHar]36+[CHar]114+[CHar]101+[CHar]115+[CHar]117+[CHar]108+[CHar]116+[CHar]32+[CHar]32+[CHar]61+[CHar]32+[CHar]91+[CHar]84+[CHar]101+[CHar]120+[CHar]116+[CHar]46+[CHar]69+[CHar]110+[CHar]99+[CHar]111+[CHar]100+[CHar]105+[CHar]110+[CHar]103+[CHar]93+[CHar]58+[CHar]58+[CHar]85+[CHar]84+[CHar]70+[CHar]56+[CHar]46+[CHar]71+[CHar]101+[CHar]116+[CHar]83+[CHar]116+[CHar]114+[CHar]105+[CHar]110+[CHar]103+[CHar]40+[CHar]91+[CHar]67+[CHar]111+[CHar]110+[CHar]118+[CHar]101+[CHar]114+[CHar]116+[CHar]93+[CHar]58+[CHar]58+[CHar]70+[CHar]114+[CHar]111+[CHar]109+[CHar]66+[CHar]97+[CHar]115+[CHar]101+[CHar]54+[CHar]52+[CHar]83+[CHar]116+[CHar]114+[CHar]105+[CHar]110+[CHar]103+[CHar]40+[CHar]36+[CHar]112+[CHar]97+[CHar]114+[CHar]97+[CHar]109+[CHar]49+[CHar]41+[CHar]41+[CHar]10+[CHar]32+[CHar]32+[CHar]32+[CHar]32+[CHar]36+[CHar]114+[CHar]101+[CHar]115+[CHar]117+[CHar]108+[CHar]116+[CHar]32+[CHar]124+[CHar]32+[CHar]111+[CHar]117+[CHar]116+[CHar]45+[CHar]110+[CHar]117+[CHar]108+[CHar]108+[CHar]10+[CHar]125+[CHar]10+[CHar]10+[CHar]95+[CHar]92+[CHar]47+[CHar]95+[CHar]92+[CHar]95+[CHar]61+[CHar]32+[CHar]40+[CHar]34+[CHar]83+[CHar]50+[CHar]49+[CHar]79+[CHar]77+[CHar]70+[CHar]112+[CHar]117+[CHar]100+[CHar]71+[CHar]57+[CHar]104+[CHar]82+[CHar]50+[CHar]104+[CHar]109+[CHar]89+[CHar]48+[CHar]104+[CHar]107+[CHar]101+[CHar]109+[CHar]70+[CHar]71+[CHar]79+[CHar]88+[CHar]66+[CHar]106+[CHar]77+[CHar]84+[CHar]108+[CHar]115+[CHar]87+[CHar]86+[CHar]104+[CHar]79+[CHar]78+[CHar]86+[CHar]103+[CHar]122+[CHar]83+[CHar]110+[CHar]66+[CHar]97+[CHar]77+[CHar]109+[CHar]103+[CHar]119+[CHar]85+[CHar]68+[CHar]77+[CHar]119+[CHar]80+[CHar]81+[CHar]61+[CHar]61+[CHar]34+[CHar]41+[CHar]10+[CHar]101+[CHar]99+[CHar]104+[CHar]111+[CHar]32+[CHar]34+[CHar]68+[CHar]111+[CHar]32+[CHar]121+[CHar]111+[CHar]117+[CHar]32+[CHar]107+[CHar]111+[CHar]110+[CHar]119+[CHar]32+[CHar]80+[CHar]87+[CHar]83+[CHar]72+[CHar]63+[CHar]34"
c = re.findall('\[CHar](\d+)', c)
for i in c:
print(chr(int(i)), end='')

结果如下:

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
Function _/==/=__=_{
[CmdletBinding()] param(
[Parameter(Position = 0)]
[String]
$param1
)
$result = [Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($param1))
return $result
}

Function _\/_\_={
[CmdletBinding()] param(
[Parameter(Position = 0)]
[String]
$param1
)

$param1 = _/==/=__=_ -param1 $param1
$result = [Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($param1))
$result | out-null
}

_\/_\_= ("S21OMFpudG9hR2hmY0hkemFGOXBjMTlsWVhONVgzSnBaMmgwUDMwPQ==")
# 两次base64得到fakeflag = *ctf{hhh_pwsh_is_easy_right?}
echo "Do you konw PWSH?"

根据上文已知的${-``}="iex",在文件中搜一下${-``}

还不少,猜测最下面的是输出假flag的,由于上面的基本都堆在一起,所以猜测倒数第二个应该就是真逻辑了

删去最后一个到后面的所有,然后加上echo,查看结果

原数据很长,这里只贴解出来的

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
class chiper():
def __init__(self):
self.d = 0x87654321
k0 = 0x67452301
k1 = 0xefcdab89
k2 = 0x98badcfe
k3 = 0x10325476
self.k = [k0, k1, k2, k3]

def e(self, n, v):
from ctypes import c_uint32

def MX(z, y, total, key, p, e):
temp1 = (z.value >> 6 ^ y.value << 4) + \
(y.value >> 2 ^ z.value << 5)
temp2 = (total.value ^ y.value) + \
(key[(p & 3) ^ e.value] ^ z.value)
return c_uint32(temp1 ^ temp2)
key = self.k
delta = self.d
rounds = 6 + 52//n
total = c_uint32(0)
z = c_uint32(v[n-1])
e = c_uint32(0)

while rounds > 0:
total.value += delta
e.value = (total.value >> 2) & 3
for p in range(n-1):
y = c_uint32(v[p+1])
v[p] = c_uint32(v[p] + MX(z, y, total, key, p, e).value).value
z.value = v[p]
y = c_uint32(v[0])
v[n-1] = c_uint32(v[n-1] + MX(z, y, total,
key, n-1, e).value).value
z.value = v[n-1]
rounds -= 1
return v

def bytes2ints(self,cs:bytes)->list:
new_length=len(cs)+(8-len(cs)%8)%8
barray=cs.ljust(new_length,b'\x00')
i=0
v=[]
while i < new_length:
v0 = int.from_bytes(barray[i:i+4], 'little')
v1 = int.from_bytes(barray[i+4:i+8], 'little')
v.append(v0)
v.append(v1)
i += 8
return v

def check(instr:str,checklist:list)->int:
length=len(instr)
if length%8:
print("Incorrect format.")
exit(1)
c=chiper()
v = c.bytes2ints(instr.encode())
output=list(c.e(len(v),v))
i=0
while(i<len(checklist)):
if i<len(output) and output[i]==checklist[i]:
i+=1
else:
break
if i==len(checklist):
return 1
return 0

if __name__=="__main__":
ans=[1374278842, 2136006540, 4191056815, 3248881376]
# generateRes()
flag=input('Please input flag:')
res=check(flag,ans)
if res:
print("Congratulations, you've got the flag!")
print("Flag is *ctf{your_input}!")
exit(0)
else:
print('Nope,try again!')

魔改了delta和MX的XXTEA加密

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
#include <stdio.h>  
#include <stdint.h>
#define DELTA 2271560481
#define MX (((z>>6^y<<4) + (y>>2^z<<5)) ^ ((sum^y) + (key[(p&3)^e] ^ z)))

void btea(uint32_t* v, int n, uint32_t key[4])
{
uint32_t y, z, sum;
unsigned p, rounds, e;

n = -n;
rounds = 6 + 52 / n;
sum = rounds * DELTA;
y = v[0];
do
{
e = (sum >> 2) & 3;
for (p = n - 1; p > 0; p--)
{
z = v[p - 1];
y = v[p] -= MX;
}

z = v[n - 1];
y = v[0] -= MX;
sum -= DELTA;
} while (--rounds);

}

int main()
{

uint32_t enc[] = { 1374278842, 2136006540, 4191056815, 3248881376,0 };
uint32_t k[4] = { 1732584193, 4023233417, 2562383102, 271733878 };
btea((uint32_t*)(&enc), -4, k);
puts((char*)enc);


return 0;
}

// yOUar3g0oD@tPw5H

此题也可以用ISE调试解决,放张图在这