其实这道题的加密函数我是手翻出来的,但是做完之后了解到这是一个sheelcode
实际上就是跑病毒的代码
WriteProcessMemory
用于向指定进程中写入数据,写入一个缓冲区中的数据到另一个进程指定的内存地址中。
函数接受的参数包括要写入的进程句柄,要写入的内存地址,要写入的数据大小等。如果写入成功,函数会返回非零值 .IDA可能会将指针识别为函数,否则需要将数据dump出来
BOOL WriteProcessMemory(HANDLE hProcess,//内存进制的句柄LPVOID lpBaseAddress,//操作开始地址的指针LPCVOID lpBuffer,//目标进程内存的数据缓冲指针SIZE_T nSize,//内存区域的大小SIZE_T *lpNumberOfBytesWritten//可选参数,指向接收实际写入字节数的变量||NULL
);
ReadProcessMemory
用于从指定进程中读取指定内存地址的数据,写入一个缓冲区中。
函数接受的参数包括要读取的进程句柄,要读取的内存地址,要读取的数据大小等。如果读取成功,函数会返回非零值
分配内存,VirtualAllocEx error%d\n
写入内存,WriteProcessMemory:%d\n
创建线程 CreateRemoteThread:%d\n
高亮的函数就是加密函数,这是因为IDA将指针识别成了函数,所以直接就可以看到具体的加密逻辑
exp:
点击查看代码
#include<stdio.h>
#include<stdlib.h>
int main(){int flag[]={0x48,0x67,0x45,0x51,0x42,0x7b,0x70,0x6a,0x30,0x68,0x6c,0x60,0x32,0x61,0x61,0x5f,0x42,0x70,0x61,0x5b,0x30,0x53,0x65,0x6c,0x60,0x65,0x7c,0x63,0x69,0x2d,0x5f,0x46,0x35,0x70,0x75,0x7d};for(int i=0;i<=36;i++){int v=i%5;switch(v){case 1: flag[i] ^= 0x23;break;case 2: flag[i] -= 2; break;case 3: flag[i] += 3; break;case 4: flag[i] += 4;break;case 5: flag[i] += 25;break; }printf("%c", flag[i]); }
}//HDCTF{Sh3llC0de_and_0pcode_al1_e3sy}
官方wp :https://www.cnblogs.com/Tree-24/p/17346919.html#double_code
题目地址 : https://www.nssctf.cn/problem/3792