河北师范大学

⏳:2021-11-13 to 2021-11-14

baby_upx

upx壳

正常的脱壳指令为

upx -d baby_upx.exe

发现报错

 

所以自己手动脱了一下

出来之后ida32打开

 

 

看了官方的wp之后发现直接upx指令脱壳是可以的

upx -d baby_upx.exe -o baby_upx_dump.exe

ida32打开 (发现手脱结果都差不多)

 

写脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
int v7[5];
v7[0] = 2099915543;
v7[1] = 120201498;
v7[2] = 269490557;
v7[3] = 67837461;
v7[4] = 271401;

char String[] = "HECTF";
char* flag = (char*)v7; //此行作用为 将v7转换成char类型并将指针赋给flag

for(int i=0;i<19;i++)
flag[i] ^= String[(i ^ (rand() + 10086)) % 5]; //使用 C 写exp的原因大概是因为rand()

printf("%s",flag);
}

flag{Thi5_iiS5_UUPX_LalA}


baby_pp

查壳 发现是python写的 exe 文件

 

具体过程参考

 

之后找个在线网站pyc反编译

(发现在线反编译效果不是很好 文件中重要内容丢失)

(于是自己折腾了半天 搞好了uncompyle6)

(因为uncompyle6最高支持到python3.8 而自己windows的python是3.10 kali的python是3.9和2.7

所以只能在kali下更换python版本 之后安装python2的pip 再安装uncompyle6)

更换python版本

update-alternatives –config python

#之后选择序号

#详细教程👇

ubuntu下切换默认python版本 - 知乎 (zhihu.com)

uncompyle6 -o main.py main.pyc

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
# uncompyle6 version 3.8.0
# Python bytecode 3.8.0 (3413)
# Decompiled from: Python 3.9.7 (default, Sep 24 2021, 09:43:00)
# [GCC 10.3.0]
# Embedded file name: main.py
# Compiled at: 1995-09-28 00:18:56
# Size of source mod 2**32: 272 bytes
import random
ens = '742641edefb6770733ab5932325106b3a5fa75222791d09e451161c46f15504402b32737362443d4df7d136145cd970b54116669c230'

def encode(s, nuum): #step为18
step = len(s) // nuum
ens = ''
for i in range(step):
ens += s[i::step] #打乱顺序
else:
return ens

def main():
random.seed(10085) #rand种子为定值
u_input = input(': ')
t = ''
for i in u_input:
t += '%02x' % (ord(i) ^ random.randint(0, 127)) #关键异或
#其中 %02x 代表输入的值每两个一组作为一个十六进制数
else: #也就是我们解密输入的字符串长度为54
eni = encode(t, 6) #加密后的结果已给出
if eni == ens: #ens长为108
print('Success!')
else:
print('Failed!')

if __name__ == '__main__':
main()

第15行: ens += s[i::step]

举个例子来说明其作用

 

所以解密脚本 先恢复顺序 再进行异或

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import random

random.seed(10085)

ens = '742641edefb6770733ab5932325106b3a5fa75222791d09e451161c46f15504402b32737362443d4df7d136145cd970b54116669c230'
flag = ''
t = ''

for i in range(6):
for j in range(18):
t += ens[i + j*6]

for x in range(0,108,2):
flag += chr(int(t[x:x+2],16) ^ random.randint(0, 127))

print(flag)

其中 关于数组中[::]切片问题详细可以看

[(18条消息) Python中numpy数组切片:print(a0::2])、a[::2]、[:,2]、[1:,-1:]、a[::-1]、[ : n]、[m : ]、[-1]、[:-1]、[1:]等的含义(详细)锵锵锵锵蒋的博客-CSDN博客[::2]

运行 输出

HECTF{decrypt(80410840840842108808881088408084210842)}

第一次接触云影密码 特点是

 

Crypto入门 (六)幂数加密(云影密码) - 缘初 - 博客园 (cnblogs.com)

附上一个云影解密脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ens = '80410840840842108808881088408084210842'  #云影加密密文
result = ens.split("0") #遇到‘0’时分割
flag = ''

for i in range(len(result)):
str = result[i]
t = 0 #每次循环t清零

for i in str:
t += int(i)

flag += chr(t + 64) #云影加密对应的是大写字母

print(flag)

flag{HELLOPYTHON}