2024.7.16日志

目录

一.使用的函数

二.完全隐藏

2.1TEB/PEB定位PE文件导入导出表

1.基本思路:

2.进程环境块PEB

3.线程环境块TEB

2.2执行流程

1.DLL什么时候被加载?

2.模块地址到底存放在呢?LoadLibrary函数怎么找到的?

3.内核模块

三.参数分离

四.动态调用

4.1创建DLL项目

4.2定义导出函数

4.3实现导出函数

五.CS的应用

六.个人心得体会


一.使用的函数

1.获取模块地址(系统自带的DLL):LoadLibrary(模块名字)   

返回值,模块地址。

2.从模块中获取需要的函数地址

GetProcAddress(模块地址,函数名字)

3.定义函数的结构(参数)。

typedef 函数返回值 (WINAPI* 自定义函数名)();

二.完全隐藏

2.1TEB/PEB定位PE文件导入导出表

1.基本思路:

TEB/PEB定位PE文件基址

通过FS寄存器找到当前的TEB

通过[TEB+0x30]找到PEB的地址

通过[PEB+0x0C]找到PEB_LDR_DATA的结构体指针

通过[PEB_LDR_DATA+0x1C]找到此结构体的成员InInitializationOrderModuleList,此成员保存着模块链表的头部地址

InInitializationOrderModuleList按照顺序保存进程加载的模块基址,其中第一个始终为ntdll.dll,第二个视系统的不同可能保存有Kernel32.dll或KernelBase.dll的信息

不管Kernel32.dll或KernelBase.dll都导出有我们需要的函数GetprocAddress和LoadLibraryEx
LoadLibrary只在Kernel32.dll导出

2.进程环境块PEB

PEB保存进程相关信息,通过PEB找到模块链表,获取模块基址。

3.线程环境块TEB

TEB保存了和一个线程相关的大量的信息,Windows将TEB结构的变量保存在内存中的一个位置上. 这个地址是无法直接获取到的。TIB(Thread Information Block)线程信息块是保存线程基本信息的数据结构,在用户模式下,它位于TEB的头部。

2.2执行流程

1.DLL什么时候被加载?

exe将要执行,除去提供导出函数,DLL本身还有一个DLLmain函数。

初始化 ->start (代码段的开始)->加载DLL->编译器添加的代码(安全检测)-》main ->获取DLL中函数的地址->main函数的调用(API函数)->return 0。

2.模块地址到底存放在呢?LoadLibrary函数怎么找到的?

kernel32 ->存放地址(每一个函数都需要一个地址来存放函数代码的位置)。DWORD 10kb->10个进程->kernel32。地址在PEB表中

3.内核模块

0x100505051151和0x151687

fs(专门存放TEB表的地址)

TEB中的0x16的位置,存放就是PEB

三.参数分离

int main(int argc, char* argv[])

{

if (argc == 3)

{

//将字符串转化为整数

BOOL result = Session0Inject((DWORD)atoi(argv[1]), argv[2]);

if (-1 == result)

{

printf("注入失败\n");

}

else

{

printf("注入成功\n");

}

}

else

{

printf("两个参数,1为pid,2为dll的绝对路径\n");

exit(1);

}

}

四.动态调用

动态调用是指在运行时动态地加载和卸载DLL,并根据需要调用其中的函数或方法。这种方式灵活性较高,但需要更多的内存和CPU资源。

4.1创建DLL项目

首先,我们需要创建一个DLL项目。在Delphi中,选择“File”->“New”->“Other”,然后选择“DLL”。在弹出的对话框中输入DLL的名称和保存路径,然后点击“OK”。

4.2定义导出函数

在DLL项目中,我们需要定义需要导出的函数或方法。例如,我们定义一个名为“Add”的函数,用于计算两个整数的和。

4.3实现导出函数

在DLL项目的代码文件中,实现定义的导出函数。例如:

function Add(a, b: Integer): Integer; stdcall; export;
begin
Result := a + b;
end;

在应用程序中,使用LoadLibrary函数加载DLL,并使用GetProcAddress函数获取导出函数的地址,然后调用该函数。例如:

var
hModule: HMODULE;
lpfnAdd: AddPtr;
begin
hModule := LoadLibrary('MyDll.dll'); // 加载DLL
if hModule <> 0 then
begin
lpfnAdd := GetProcAddress(hModule, 'Add'); // 获取导出函数的地址
if lpfnAdd <> nil then
begin
WriteLn(IntToStr(lpfnAdd(1, 2))); // 调用函数并输出结果
end;
FreeLibrary(hModule); // 卸载DLL
end;
end;

五.CS的应用

选择一个beacon,右键,目标->进程列表

 


选择进程,点击Inject,选择对应的监听器,点击choose,CS就会弹回目标机的一个新的会话,这

个就是注入到进程beacon。

键盘记录

选择相应的进程,然后点击log Keystokes,点击菜单栏的键盘记录,选择对应的主机,即可查看相

应的键盘记录。

六.个人心得体会

       使用 Cobalt Strike 进行实验是我在网络安全学习中的一次深刻体验。Cobalt Strike 是一个功能强大的渗透测试工具,广泛用于模拟红队攻击和评估网络防御的有效性。在实验过程中,我积累了以下几点心得体会:

       首先,配置和启动 Cobalt Strike 是整个过程的第一步。我通过查阅官方文档和在线资源,学习了如何下载、安装和配置 Cobalt Strike 的基本环境。这些步骤包括设置监听器、生成有效载荷(payload)。学会这些基本操作后,我能够开始模拟攻击场景和进行实际的渗透测试。

       其次,Cobalt Strike 的核心功能之一是其 Meterpreter 框架。Meterpreter 提供了强大的后渗透能力,包括文件系统访问、系统信息收集、远程命令执行等功能。通过学习 Meterpreter 的使用,我能够更深入地理解攻击者如何利用漏洞获取对目标系统的控制权,并且对于防御者来说,也有助于了解如何检测和阻止这些攻击。

       第三,Cobalt Strike 的 Beacon 功能提供了更加隐秘和持久的远程访问方式。Beacon 允许攻击者通过加密的通信渠道与受感染的系统进行交互,可以设置多个Beacon以保证持久性访问。这种功能强大的后门技术展示了现代攻击者对于长期侵入和控制的追求,也对防御者提出了更高的挑战。

        最后,使用 Cobalt Strike 的过程也深刻提醒了我安全意识的重要性。在进行模拟攻击和渗透测试时,我始终强调合法性和合规性,确保不对任何未经授权的系统或数据造成实际损害。这种责任感和专业精神是每位安全从业者必备的素质。

       总结而言,通过使用 Cobalt Strike 进行实验,我不仅提升了自己的技术能力和安全意识,还深入理解了攻击者的思维和方法。这种经验对我的学术研究有所帮助。

 

  • 11
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值