# DSACTF 逆向专项

# careful

纯纯的签到

题目给出了一个恶意样本,请分析出样本请求服务器的域名 (flag 的形式为 DASCTF {md5 (域名)}) 其中 md5 值都是小写

image-20230604094259190

第一眼看感觉像是比较数据什么的

直接 gpt 分析得出 (其实也不用分析,只是可以了解一下)

这段代码是一个用于远程控制的程序,其主要功能是通过网络连接到指定目标主机并执行接收到的命令。

  1. WSAStartup (0x202u, &WSAData) 初始化套接字库,如果失败则返回 0。
  2. socket (2, 1, 6) 创建一个套接字,使用 IPv4 和 TCP 协议,如果失败则输出错误信息并返回 0。
  3. 设置连接目标主机的 IP 地址和端口号等参数。
  4. connect ((SOCKET) s, &v12, 16) 建立与目标主机的连接,如果成功则输出连接成功的信息。
  5. 然后进入一个无限循环,不断地接收从目标主机发送过来的命令,并执行这些命令。
  6. 在循环内部,每次接收到消息之后,使用 CreateProcessA 函数创建一个新的进程,并在其中执行接收到的命令。
  7. 使用 WaitForSingleObject 函数等待新进程执行完毕。
  8. 如果 connect 函数返回失败,则输出连接错误的信息并返回 1。

flag 直接下断点调试得 不说了 看图都懂了

image-20230604131531558

image-20230604132908731

image-20230604132607210

image-20230604132526463

小学生都会的动调调试,

域名:Just_An_APIH00k11.com

DSACTF

# babyre

其实不难 只是我太久没做题了 (狡辩)

shift+F12 发现成功字符跳到比较

image-20230604142008084

前面是加密

image-20230604141602766

2000 的异或数组

然后交叉引用发现image-20230604201729150isdebuggerpresent

直接在数组里改回来就行 然后我选择 dump 出来这个加密部分

QQ图片20230604214606

再放入 IDA

image-20230604202155486

正确的函数

image-20230604202220435

image-20230604205047698

魔改了 2 部分

image-20230604205905954

紫砂了 眼睛都看花了 最后写的解密脚本如下

#include <stdio.h>
void rc4(unsigned char *key, unsigned long keylen, unsigned char *data, unsigned long datalen) {
    unsigned char s[256];
    unsigned int i, j = 0, x,keylenl=0;
    // 初始化 S 盒
    for (i = 0; i < 256; i++) {
        s[i] = i;
    }
    for (i = 0; i < 256; i++) {
		 x = s[i];
        j = (2*j+ x  + key[ keylenl]) % 256;
        // 交换 S [i] 和 S [j]
       
        s[i] = s[j];
        s[j] = x;
		if(++keylenl >= 10) 
		keylenl = 0;
    }
    i = j = 0;
    for (unsigned long n = 0; n < datalen; n++) {
        i = (i + j) % 256;
        j = (j + s[i]) % 256;
        // 交换 S [i] 和 S [j]
        x = s[i];
        s[i] = s[j];
        s[j] = x;
		data[n] -=n%13;
        data[n] ^= s[(s[i]+j + s[j]) % 256];
		
    }
}
int main() {
    unsigned char key[] = {93,66,98,41,3,54,71,65,21,54};
    unsigned long keylen = sizeof(key) ; // 减去末尾的 '\0'
    unsigned char data[44] ;
	data[0] = -9;
  data[1] = 46;
  data[2] = 52;
  data[3] = -16;
  data[4] = 114;
  data[5] = -49;
  data[6] = 94;
  data[7] = 10;
  data[8] = -69;
  data[9] = -20;
  data[10] = -79;
  data[11] = 43;
  data[12] = 112;
  data[13] = -120;
  data[14] = -120;
  data[15] = -19;
  data[16] = 70;
  data[17] = 56;
  data[18] = -37;
  data[19] = -38;
  data[20] = 108;
  data[21] = -67;
  data[22] = -44;
  data[23] = 6;
  data[24] = 119;
  data[25] = -14;
  data[26] = -49;
  data[27] = 86;
  data[28] = -120;
  data[29] = -58;
  data[30] = 49;
  data[31] = -46;
  data[32] = -73;
  data[33] = 90;
  data[34] = -63;
  data[35] = 66;
  data[36] = -80;
  data[37] = -12;
  data[38] = 72;
  data[39] = 55;
  data[40] = -11;
  data[41] = 44;
  data[42] = -11;
  data[43] = 88;
    unsigned long datalen = sizeof(data) ; // 减去末尾的 '\0'
    rc4(key, keylen, data, datalen);
    printf("加密后:");
    for (unsigned long i = 0; i < datalen; i++) {
        printf("%02X ", data[i]);
    }
    //rc4(key, keylen, data, datalen);
    printf("\n解密后:%s", data);
    return 0;
}

最后觉得下次 其实可直接复制 IDA 的 TAT

DASCTF {03446c2c-dff7-11ed-9285-54e1ad98d649} 泪目