buu-re-79

Article Directory
  1. 1. 前言
  2. 2. 分析
  3. 3. exp

[SCTF2019]creakme

前言

小结一下这题考察的几个知识点:

  • SMC及其恢复patch
  • AES加解密
  • 分组密码模式判断
  • 基础base64编码

分析

一开始就发现了内存中有一段奇怪的code,结合调用处信息,基本可以判断是一个SMC
但是我一直没找到修改这段code的地方..后来参考了一下WP,说是SMC的代码在sub_402450
那么问题又来了,如何在哪里调用了这个函数?又是怎么传参的?
WP里面说是附加在调试器下调用的,我又去看了看汇编代码,理了下逻辑:

  • edx(a1)传入要修改的总字节长度(但是怎么给edx赋的值还没弄懂..)
  • ecx(a2)传入要修改的起始地址

修改的过程伪代码很容易看明白,贴一下恢复的exp

1
2
3
4
5
6
7
8
9
st=0x404000
key=b'sycloversyclover'
length=len(key)
for i in range(512):
ch=get_wide_byte(st)
tmp=ch ^ key[i % length]
tmp = ~tmp
patch_byte(st,tmp)
st += 1

然后对应对应地址 c 一下 p 一下 f5一下,被隐藏起来的代码就出来了

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
unsigned int sub_404000()
{
unsigned int i; // edx
unsigned int v1; // esi
unsigned int result; // eax
int v3; // eax
char v4; // dl

for ( i = 0; i < strlen(text); ++i )
--text[i];
v1 = 0;
result = strlen(text);
if ( (result & 0xFFFFFFFE) != 0 )
{
do
{
v3 = result - v1;
v4 = *(_BYTE *)(v3 + 4231191);
*(_BYTE *)(v3 + 4231191) = text[v1];
text[v1++] = v4;
result = strlen(text);
}
while ( v1 < result >> 1 );
}
return result;
}

text原来是>pvfqYc,4tTc2UxRmlJ,sB{Fh4Ck2:CFOb4ErhtIcoLo

就是text[i]偏移后,再逆序变为

nKnbHsgqD3aNEB91jB3gEzAr+IklQwT1bSs3+bXpeuo=

然后用Findcrypt插件扫一下,发现有base64和AES加密

再看主函数,主要的加密逻辑在sub_4020D0

  1. AES_CBC(CBC模式从AES加密函数中有个像是偏移量的变量sctfsctfsctfsctf;分组加密的各个模式的区别在这
  2. 然后再一个base64编码

逆向的话反过来就行

exp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# SMC
import base64
from Crypto.Cipher import AES

text='>pvfqYc,4tTc2UxRmlJ,sB{Fh4Ck2:CFOb4ErhtIcoLo'
text2=''
for i in text:
text2 += chr(ord(i)-1)
print(text2[::-1])

text3 = b'nKnbHsgqD3aNEB91jB3gEzAr+IklQwT1bSs3+bXpeuo='
text4 = base64.b64decode(text3)
key = b'sycloversyclover'
iv = b'sctfsctfsctfsctf'
aes = AES.new(key,mode=AES.MODE_CBC,iv=iv) # AES_CBC有个偏移iv
print(aes.decrypt(text4))

这个网站也可以解
1

Comments