[GWCTF 2019]re3

处理之后强制分析得到函数。(main函数也可以重新处理一下)重点如下:
sub_400A71(&v4, &unk_603170);
sub_40196E(&v4, a1);
sub_40196E(&v4, a1 + 16);
v2 = 1;
for ( i = 0; i <= 31; ++i )
{
if ( *(_BYTE *)(i + a1) != byte_6030A0[i] )
v2 = 0;
}
可以看出是利用unk_603170对输入分两段进行加密,之后与byte_6030A0进行比较.
看别人wp发现:
进入sub_400A71会发现这是个AES算法的密钥扩展
sub_40196E就是通过密钥AES加密(到底是怎么看出来的啊?)
补充:
1.AES加密在字节代换层需要有一个长度为256的S_box表和一个逆S盒,findcrypt插件便可找到这两个表;
2.AES加密一般循环进行10轮,且最后一轮不进行列混淆,函数sub_401828刚好符合该特征且可以看出,sub_400D27即为列混淆函数

3.sub_400A71是密钥扩展函数
之后动态调试拿到unk_603170的值,密钥和密文都有,写脚本解密即可。
from Crypto.Cipher import AES from Crypto.Util.number import * key = long_to_bytes(0xcb8d493521b47a4cc1ae7e62229266ce) mi = long_to_bytes(0xbc0aadc0147c5ecce0b140bc9c51d52b46b2b9434de5324bad7fb4b39cdb4b5b) lun = AES.new(key, mode=AES.MODE_ECB) flag = lun.decrypt(mi) print(flag) #b'flag{924a9ab2163d390410d0a1f670}'

浙公网安备 33010602011771号