318's Blog

来人间一趟,总要见见太阳

0%

奇安信校内赛WP

WP-318

唉,这场打的就挺差的。。。wtcl

[RE] baby_re

超级感谢善良的学姐出了道萌新题了!!!
前面给出了flag的格式校验,(一开始眼瞎没看到。。。。
在这里插入图片描述
就是一个基础的跟”susctflinux”的异或
在这里插入图片描述

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
#include<iostream>
using namespace std;
int v7;
int v8;
char flag[50] = {};
int dest[50] = { 0x07,0x04, 0x0C, 0x39, 0x11,
0x1F, 0x2D, 0x1E, 0x13, 0x1B,0x1C, 0x2B, 0x03, 0x19, 0x38,
0x1D, 0x09, 0x11, 0x04, 0x10,0x2A, 0x38, 0x34, 0x39, 0x36,
0x29, 0x3B, 0x2C, 0x35, 0x33,0x2C, 0x34, 0x38, 0x34, 0x3B,
0x3A, 0x2B, 0x39, 0x2C, 0x37,0x2A, 0x2C, 0x34, 0x38, 0x34,
0x39, 0x3A, 0x29, 0x3F, 0x2C };

int main()
{
const char *v17 = "susctflinux";
// memcpy(dest, &unk_400C40, 0xC8uLL);
char key[12] = "susctflinux";
for (int i=0 ; i < 50 ; i++)
{
v8 = key[i % 11]; //v5 = (*v26)[i + 7];
v7 = i % 10 + v8; //v8 = v17[i % 11];
flag[i] = dest[i] ^ v7; //*v21 = (i % 10 + v8) ^ v5;
//*v9 = *(dest + i)
}
printf("%s", flag);
} // SUSCTF{try_it_need_to_debug_AAAAAAAAAABBBBBBBBBBCCCCCCCCCC}

[RE] 推箱子

.NET程序,好耶,交给dnSpy了
找到很明显的ShowFlag(),又有md5又有sha1,还是不要手算了
在这里插入图片描述
想办法让它直接执行ShowFlag,改一下~~
(下面爆红的地方会报错,直接改成0了。。。。)
在这里插入图片描述
导出新的exe,打开即得flag(做得最顺的一道题了,感谢oc师傅~
在这里插入图片描述

[RE] reverse 1

hint: 注意加密算法特征
base64,给表了很容易猜到
在这里插入图片描述
翻了各种各样的加密方法,总算找到了,很像DES了(不过没找到传说中的S盒。。按理说 Findcrypt 应该识别出来的。。唉)
在这里插入图片描述
然后有个小坑就是在base64加密之前有一步异或
在这里插入图片描述
知道了这些。。。我还是不会逆。。废物我是废物)
动调了一下,根据加密完的数努力复原出加密函数。。

输入aaaaaaaaaaaaaaaaaa会得到:
在这里插入图片描述
努力复原后发现前8位正确,后面又又又不对了。。。

又尝试了几次,发现密钥会变,前八位是后八位的密钥。

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
import base64
import binascii
from Crypto.Cipher import DES
from Crypto.Util.Padding import pad, unpad
BLOCK_SIZE = 32 # Bytes

xor=[ 0x0D, 0xB9, 0x59, 0xB3, 0x0B, 0x0C, 0xE4, 0x26, 0xC2, 0x8E,
0x5C, 0x93, 0x76, 0xF9, 0xD6, 0x7E, 0xEE, 0xB0, 0x4A, 0x44,
0xF6, 0xB4, 0x87, 0x9F, 0x45, 0x90, 0x95, 0xFD, 0x68, 0xDB,
0xE3, 0x73]

def encode():
a = ''
key = 'deadbeef'.encode('utf-8')
pt = DES.new(key, DES.MODE_ECB)
aa = pt.encrypt('44f93912'.encode('utf-8'))
for i in range(8):
a += chr(ord(aa[i]) ^ xor[i])
a1 = base64.b64encode(a)
print(a1) #3FkKMaA5NQw=

if __name__ == '__main__': #O7iQM6kwvSkKisuNkm0lZCTMVUxm/j0+CzUgqTB5WLs=
encode()
#key = 'deadbeef'.encode('utf-8')
key='\x36\x01\xc9\x80\xa2\x3c\x59\x0f'
#key='\xc8\x04\x97\x1e\xe4\x94\xf3\x1a'
#key='\xca\x7c\x1f\x08\x90\x4a\xba\xa1'
pt = DES.new(key, DES.MODE_ECB)

S='O7iQM6kwvSkKisuNkm0lZCTMVUxm/j0+CzUgqTB5WLs='
str2 = base64.b64decode(S)
str1 = '' # O7iQM6kwvSkK isuNkm0lZCT MVUxm/j0+ CzUgqTB5WLs=
flag=''
for i in range(32):
str1+=chr(ord(str2[i]) ^ xor[i])
s=binascii.hexlify(str1)
print(s) #3601c980a23c590f c804971ee494f31a ca7c1f08904abaa1 4ea5b55458a2bbc8

flag = pt.decrypt(b'\xc8\x04\x97\x1e\xe4\x94\xf3\x1a')
# reset key
print(flag)
#flag{44f9391280028043a851c585b33b9b97}


规律就是八位一组~

[RE] ezpython

流加密。。。好难。。
其实先考的是去混淆。。

反正。。挺难。。有空好好看一下官方wp了(好在这道题师傅写的超级详细!

官方解密脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
import binascii
import base64
seed=binascii.crc32(b'flag')&0xffffffff
enc=bytearray.fromhex('2b05d69d6d001fdae789d3b5a114a77cd89b49f0fbbd4b9f3a5df4557
f6d1f0102c25e562f337b239fa7ed55d2a4f89a')
tmp=[]
for i in range(len(enc)):
seed=binascii.crc32(binascii.unhexlify(hex(seed)
[2:].rjust(8,'0')))&0xffffffff
t=pow(seed,65537,15497588010991761509)&0xff
tmp.append(enc[i]^t)
flag=base64.b64decode(bytearray(tmp)).decode()
print(flag)

[PWN] 2048

真的认真玩了。。但512对我这个游戏废物可太难了呜呜呜呜

[PWN] signin

确实签到,不过一开始emmmm没想到。。。

生成了一个随机的字符串,password等于那个随机字符串就能拿到flag

应该是格式化字符串的漏洞叭,输入的buf如果大于15就会把栈上存的字符串泄露出来,如图:
在这里插入图片描述
但是如果输入过长,ans就会默认buf溢出的那一部分为password了(好像)
所以要取刚好的payload长度也就是15
在这里插入图片描述

每次写WP都要熬夜。。。晚安啦~