2021CJB&CTFshow_RE_WP

2021CJB&CTFshow_RE_WP

比赛结束把最后一题补上了,这次RE就三题,T神的题目还是多看看,多学学。

ezmore

难度:易

PS:我是怀疑这题没出好,他的加密是一个直接的字符串比较,所以动调到后面就直接得到解了,exp都不需要写。

尝试运行:

image-20210715113107918

看起来是个十分抱歉的UI

ida反编译后

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
nt __cdecl main(int argc, const char **argv, const char **envp)
{
int i; // [esp+1Ch] [ebp-4h]

__main();
init();
for ( i = list(); i != 3; i = list() )
{
if ( i == 1 )
{
choice1();
}
else
{
if ( i != 2 )
exit(0);
choice2();
}
}
return 0;
}

choice1里面没啥东西就是一堆输出

我们直接看到choice2

choice2里面应该能看到一句while

1
2
3
4
5
while ( strcmpp(inputstr, input[0] - 1) && strcmp(inputstr, "0") )
{
puts(&byte_406590);
scanf("%s", inputstr);
}

这个两个比较应该是解题的关键,看到strcmpp这个函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
nt __cdecl e2edef40ecaa776b8d32d58416998(char *Str1, int a2)
{
int v3[52]; // [esp+28h] [ebp-2F0h] BYREF
int v4[52]; // [esp+F8h] [ebp-220h] BYREF
int v5[52]; // [esp+1C8h] [ebp-150h] BYREF
char Str2[4]; // [esp+298h] [ebp-80h] BYREF
char v7[96]; // [esp+29Ch] [ebp-7Ch] BYREF
char v8[28]; // [esp+2FCh] [ebp-1Ch] BYREF

if ( !a2 )
return 1;
*(_DWORD *)Str2 = 0;
memset(v7, 0, sizeof(v7));
qmemcpy(v5, &d87494e8e5d46a6edc9c2f848a141914, sizeof(v5));
qmemcpy(v4, &f6e71c389bdf39ee63fbb91c26e6706f, sizeof(v4));
qmemcpy(v3, &s52bdc17516200622c3a74225fc28c3a, sizeof(v3));
e9e95724f10d55fa5cf9b627bf692c4e((&dd922ad47494fc02c388e12c00eac)[a2], (int)Str2, (int)v5, (int)v4, (int)v3);
if ( strcmp(Str1, Str2) )
return 1;
printf(&byte_4064E8);
scanf("%d", v8);
return 0;
}

看出来了,一堆臭加密, findcrypto先不急着用,直接看到后面是将我们的输入即str1直接与str2作比较,那我们直接动调到这里(已经验证tls等,没有反动调了)

看眼str2

image-20210715114608023

得到比较字符neft回到程序。

重新运行

image-20210715114751541

得到hint neft的md5(我这个爱目第五想了半个小时,Google了半个小时,属实我脑瘫了)

得到flag ctfshow{fc425a880deaaa7ffe4777a6232c61a3}

autoRe

难度:N/A

#include<T神yyds>

这题给了一个nc端口连进去,得到题目,给了一段臭长的base64 要求3s解出并返回解

1
nc pwn.challenge.ctf.show xxxxx > out.txt

base64转文件,发现是个elf,然后点进去。

image-20210715120546411

Q神言:函数这么少必有妖。

那这里直接upx一把梭。

运气好跑出来了。

image-20210715125624682

image-20210715125842046

这个臭长,但是挺好理解的。

image-20210715125937636

这个就好理解了把

简单来说就是一个128的非齐次方程组

然后直接开始exp摁写(

这里有个小插曲,原则上我们以为z3卡了时间,然后就在优化算法,最后找到矩阵求解的优化算法后,发现还是超时,直接梦回ACM

然后

img

发现是提取数据时间太长,所以优化了提取数据的方式,直接用切片取地址上的数据(这个方法其实不大好,但是想不出来了,死马当活马医,能出flag就是好方法👍😁

所以能不能z3一把梭,我也不知道(

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
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
from os import system
from pwn import *
import base64,struct

from scipy import linalg
import numpy as np # 计算行列式的值
from gmpy2 import *
import time

class MyError(ValueError):
pass


p=remote('pwn.challenge.ctf.show',xxxxx)
ticks = time.time()
p.recvuntil('-------------------------------------------------\n')
b64content=p.recvuntil('\n-------------------------------------------------',True)
content=base64.b64decode(b64content)
print(time.time()-ticks)
with open('tmp','wb') as f:
f.write(content)
system('upx -d tmp')
print(time.time()-ticks)
print("去壳时间")
#e=ELF('tmp',False)
#get=lambda addr:struct.unpack('<i',e.read(addr,4))[0]
with open('tmp','rb') as f:
e=f.read()
get=lambda addr:struct.unpack('<i',e[addr:addr+4])[0]
print(time.time()-ticks)
print("get时间")
def parseOne(base:int):
index=0x100+get(base+3)
num=get(base+12)
return index,num
ans=[]

def parseLine(base:int):
l=[0]*128
r=parseOne(base)
l[r[0]]=r[1]
for i in range(127):
r=parseOne(base+0x12*i+0x10)
l[r[0]]=r[1]
ans.append(get(base+0x8ff))
return l
l=[parseLine(0x1218+i*0x909) for i in range(128)]
print(time.time()-ticks)
print("从elf提取数据时间")
#l=matrix_rev(l,0x100000000)
l=np.array(l)
#print(l)
#print(ans)
print(time.time()-ticks)
print("化成矩阵时间")
X = linalg.solve(l,ans)
print(time.time()-ticks)
print("求方程组时间")
print(X)
#ar=(np.matmul(l,np.array([ans]).T)%0x100000000)
s=''
X = [round(i) for i in X]
for i in X:
s+=chr(i)
print(s)
#for i in X:
# s+=chr(i)
#print(s)
p.sendline(s)
p.interactive()

有手就行

难度:易

image-20210715131059349

大经典,然后成功被骗

img

被有手就行了

image-20210715131355403

然后其实真正的密文被转移了

image-20210715131621709

看到密钥:keykeykey

然后还建立了S盒,直接rc4一把梭

发现不能解,后面还加了7 ,前面还被改rc4

整体不难

直接贴官方exp了(我自己的找不到了

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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
box=[0]*256

k='keykeykey'

t=[0]*256

rr=[220,71,127,110,154,216,96,119,244,176,140,84,176,170,38,35,2,66,142,186,144,140,171,134,36,110,248]

for i in range(256):

box[i]=256-i

t[i]=ord(k[i%len(k)])

j=0

for i in range(256):

j=(j+box[i]+t[i])%256

(box[i],box[j])=(box[j],box[i])

i=0

j=0

for k in range(27):

i = (i + 1) % 256

j = (j + box[i]) % 256

(box[i],box[j])=(box[j],box[i])

rr[k]^=box[(box[i]+box[j])%256]

for i in range(len(rr)):

rr[i]-=7

print(''.join(chr(x) for x in rr))

总结:

吃鸡杯这次re还是挺好玩(菜鸡)的。

T神那题还挺不错的,梦回ACM。

整体做得很开心,感谢CTFshow。

愿CTFshow办的越来越好(我还没买VIP


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!