cybrics ctf 2019 Hidden Flag writeup

内存取证的reverse 题目链接:https://cybrics.net/files/20190717.zip.torrent

主要工具为:volatility ida

由于之前没使用过volatility,刚开始使用的是windows版,结果全是乱码,且进程目录也不全

windows版镜像查看结果

cybrics ctf 2019 Hidden Flag writeup_第1张图片
镜像信息

windows进程查看结果

cybrics ctf 2019 Hidden Flag writeup_第2张图片
进程信息

Linux版本

cybrics ctf 2019 Hidden Flag writeup_第3张图片
j镜像信息
cybrics ctf 2019 Hidden Flag writeup_第4张图片
进程信息

两者差距很大,建议的profiiles中最好使用winx64_17134,毕竟更新比较多,其他的话可能也会产生乱码,进程全部flase的问题

这里通过查看进程信息也没找到有用的东西,查看其中的文件可以找到两个在C盘的sys文件,全部dump下来


python vol.py -f /home/*********/dbg/20190717.mem --profile Win10x64_17134 moddump -b 0xfffff8005db00000 -D .

使用ida分析两个文件,有用的是Flagostor.sys

cybrics ctf 2019 Hidden Flag writeup_第5张图片
图片.png

找到sub_FFFFF8005DAF14B0加密函数,其中有两个加密函数

cybrics ctf 2019 Hidden Flag writeup_第6张图片
图片.png
encrypt1

  v9 = a2;
  v8 = a1;
  len = -1;
  do
    ++len;
  while ( *(a1="qweasdzxc"+ len) );  #计算字符串的长度
  v6 = 0;
  for ( i = 0; i < 256; ++i )
    *(a2 + i) = i;                                #给数组赋值
  for ( j = 0; j < 256; ++j )
  {
    _mm_lfence();
    v2 = (*(v8 + j % len) + *(v9 + j) + v6) >> 31;
    v6 = (v2 + *(v8 + j % len) + *(v9 + j) + v6) - v2;
    switch((j + v9), (v6 + v9));  #数组中字符位置切换
  }
  return 0;

转换python为

def encrypt1(key):
    table = []
    for i in xrange(256):
        table.append(i)
    v6 = 0
    for j in xrange(256):
        v2 = ord(key[j%len(key)]) + table[j] + v6
        v6 = ((v2&0xff) + v2) - v2

        v = table[j]
        table[j] = table[v6]
        table[v6] = v
    return table

第二个encrypt2函数

__int sub_FFFFF8005DAF12E0(__int a1, __int a2, __int a3)
{

  v13 = a3;
  v12 = a2;
  v11 = a1;
  v7 = 0;
  v8 = 0;
  v9 = 0;
  len = -1;
  do
    ++len;
  while ( *(a2 + len) );   #计算字符串长度
  while ( v9 < v10 )
  {
    v3 = v7 + 1;
    v7 = (BYTE4(v3) + v7 + 1) - BYTE4(v3);
    v4 = (*(v11 + v7) + v8) >> 31;
    v8 = (v4 + *(v11 + v7) + v8) - v4;
    switch((v7 + v11), (v8 + v11));      #switch
    v5 = (*(v11 + v8) + *(v11 + v7)) >> 31;
    *(v9 + v13) = *(v9 + v12) ^ *(v11 + (v5 + *(v11 + v8) + *(v11 + v7)) - v5);
    ++v9;
  }
  return 0;
}

大致和encrypt函数相同,转化为python为

def encrypt2(table,flagB):
    l = len(flagB)
    flag = []
    for x in xrange(l):
        flag.append('x')

    local_38 = 0;
    local_34 = 0;
    local_28 = 0;
    local_20 = l;
    while (local_28 < local_20):
        local_38 = local_38 + 1 & 0xff
        local_34 = local_34 + table[local_38] & 0xff
        
        aux = table[local_38]
        table[local_38] = table[local_34]
        table[local_34] = aux

        flag[local_28] = table[table[local_38]+table[local_34] & 0xff] ^ ord(flagB[local_28])

        local_28 = local_28 + 1;
      
    return ''.join([chr(x) for x in flag])

联立得到 flag: cybrics{H1DD3N_D33P_1N_NTKRNL}

图片.png

解密分析文件部分不复杂

{未完待续}

原文连接:https://teamrocketist.github.io/2019/07/27/Reverse-CyBRICS-CTF-Quals-2019-Hidden-Flag/?tdsourcetag=s_pctim_aiomsg

你可能感兴趣的:(cybrics ctf 2019 Hidden Flag writeup)