[GWCTF 2019]re3

 

 

 

 

[GWCTF 2019]re3

新技能:

1.ida中写脚本修补文件
2.findcrypt插件的安装使用(虽然感觉也没怎么用)
3.AES加密原理(还没完全看懂)

 

ida打开发现一串乱码,由mian函数可以看出是经过异或处理,那么我们写脚本异或回去。

 

 处理之后强制分析得到函数。(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}'

 

posted @ 2021-10-07 16:19  Cu6e  阅读(109)  评论(0)    收藏  举报