[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; unsigned int v1; unsigned int result; int v3; char v4;
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
里
- AES_CBC(CBC模式从AES加密函数中有个像是偏移量的变量
sctfsctfsctfsctf
;分组加密的各个模式的区别在这)
- 然后再一个base64编码
逆向的话反过来就行
exp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 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) print(aes.decrypt(text4))
|
这个网站也可以解

Comments