[buuctf.reverse] 084_[SCTF2019]creakme

这个感觉巨难的,怎么放到这了

用ida打开找不着它在干嘛,在函数列表里有 __except_handler4 经搜索是异常处理的。逆向找引用,它被sub_402320调用。sub_402320调用sub_402450通过key对404000块进行解密,异或取反

int __usercall sub_402450@<eax>(int a1@<edx>, int a2@<ecx>, int a3, int a4)
{
  int result; // eax
  int v7; // edx
  char v8; // cl

  result = 0;
  if ( a1 > 0 )
  {
    while ( 1 )
    {
      v7 = 0;
      if ( a4 > 0 )
        break;
LABEL_5:
      if ( result >= a1 )
        return result;
    }
    while ( result < a1 )
    {
      v8 = aSycloversyclov[v7++];               // sycloversyclover
      *(_BYTE *)(result + a2) = ~(*(_BYTE *)(result + a2) ^ v8);
      ++result;
      if ( v7 >= a4 )
        goto LABEL_5;
    }
  }
  return result;
}

写程序对这块进行解密再放到ida

key = b'sycloversyclover'
data = list(open('attachment.exe', 'rb').read())
for i in range(0x3400, 0x3600):
    data[i] = 0xff - data[i]^key[i%16]
open('a3.exe', 'wb').write(bytes(data))

这个函数对密文进入-1和反向处理

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(aPvfqyc4ttc2uxr); ++i )
    --aPvfqyc4ttc2uxr[i];                       // 减1
  v1 = 0;
  result = strlen(aPvfqyc4ttc2uxr);
  if ( (result & 0xFFFFFFFE) != 0 )
  {
    do
    {
      v3 = result - v1;                         // 反向
      v4 = *(_BYTE *)(v3 + 0x409017);
      *(_BYTE *)(v3 + 4231191) = aPvfqyc4ttc2uxr[v1];
      aPvfqyc4ttc2uxr[v1++] = v4;
      result = strlen(aPvfqyc4ttc2uxr);
    }
    while ( v1 < result >> 1 );
  }
  return result;
}

再用ida查密是AES,从字符表里找到两个串

sycloversyclover
sctfsctfsctfsctf

两个都是16字符,符合AES的key和iv的特征,用第1个作key第2个作iv解到的密文base64解码后作为密文进行解密

#查密AES 
cipher = b'>pvfqYc,4tTc2UxRmlJ,sB{Fh4Ck2:CFOb4ErhtIcoLo' #猜
cipher = bytes([i-1 for i in cipher[::-1]])
print(cipher)
#密文为base64编码,先解码再进行AES解密
from base64 import b64decode
cipher = b64decode(cipher)

key = b'sycloversyclover'  #两个猜
iv  = b'sctfsctfsctfsctf'

from Crypto.Cipher import AES
import base64

aes = AES.new(key, AES.MODE_CBC, iv)
m = aes.decrypt(cipher)
print(m)

#sctf{Ae3_C8c_I28_pKcs79ad4}
#flag{Ae3_C8c_I28_pKcs79ad4}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值