# DSACTF 逆向专项
# careful
纯纯的签到
题目给出了一个恶意样本,请分析出样本请求服务器的域名 (flag 的形式为 DASCTF {md5 (域名)}) 其中 md5 值都是小写
第一眼看感觉像是比较数据什么的
直接 gpt 分析得出 (其实也不用分析,只是可以了解一下)
这段代码是一个用于远程控制的程序,其主要功能是通过网络连接到指定目标主机并执行接收到的命令。
- WSAStartup (0x202u, &WSAData) 初始化套接字库,如果失败则返回 0。
- socket (2, 1, 6) 创建一个套接字,使用 IPv4 和 TCP 协议,如果失败则输出错误信息并返回 0。
- 设置连接目标主机的 IP 地址和端口号等参数。
- connect ((SOCKET) s, &v12, 16) 建立与目标主机的连接,如果成功则输出连接成功的信息。
- 然后进入一个无限循环,不断地接收从目标主机发送过来的命令,并执行这些命令。
- 在循环内部,每次接收到消息之后,使用 CreateProcessA 函数创建一个新的进程,并在其中执行接收到的命令。
- 使用 WaitForSingleObject 函数等待新进程执行完毕。
- 如果 connect 函数返回失败,则输出连接错误的信息并返回 1。
flag 直接下断点调试得 不说了 看图都懂了
小学生都会的动调调试,
域名:Just_An_APIH00k11.com
DSACTF
# babyre
其实不难 只是我太久没做题了 (狡辩)
shift+F12 发现成功字符跳到比较
前面是加密
2000 的异或数组
然后交叉引用发现isdebuggerpresent
直接在数组里改回来就行 然后我选择 dump 出来这个加密部分
再放入 IDA
正确的函数
魔改了 2 部分
紫砂了 眼睛都看花了 最后写的解密脚本如下
#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} 泪目