第15章课后作业
练习
1:分析 OpenProcess 的调用链
2:使用 C++ 调用 CreateProcess API,运行 calc.exe 程序
3:使用 P/Invoke 通过序数调用 OpenProcess,运行 calc.exe 程序
4:使用 D/Invoke 调用 OpenProcess,运行 calc.exe 程序
5:D/Invoke 还有其他方式获得对模块以及 API 的句柄,例如通过方法 GetPebLdrModuleEntry 来获得对 DLL 的句柄。请查看 D/Invoke 的仓库 README 文档并分别进行尝试
6:查阅资料,分别在 VBA 以及 PowerShell 中调用 OpenProcess,运行 calc.exe 程序
7:在 .NET 中,执行 Shellcode 的经典方式为使用 VirtualAlloc 分配内存空间、使用 Marshal.Copy 写入 Shellcode,使用 CreateThread 创建线程,以及使用 WaitForSingleObject 来等待线程的结束。根据描述以及 API 的文档写出 C# 代码,分别使用 P/Invoke 以及 D/Invoke。
8:用 PE Bear 分析 ws2_32.dll 各项重要属性
9:为什么在 calc_dllmain() 中的 CreateThread 函数下面调用 WaitForSingleObject 会导致死锁?
10:使用 C# 的 P/Invoke 与 D/Invoke 分别获得 explorer.exe 的进程句柄,并获得相关进程信息,例如 PID、命令行参数等。
11:请用二进制形式写出下列数字的负数:133,4869,51203
12:下述代码片段中,RAX 中保存着函数 LoadLibraryA 的地址,该函数只需要 1 个参数,DLL 名称,假设该参数值为 ws2_32.dll,请填写空白部分缺失的代码:
mov rsi, 0x6c6c;
________;
mov rsi, ________;
push rsi;
________;
sub rsp, ____;
call rax;
________;
13:使用 WinDBG 解析 ws2_32.dll,不借助 PE Bear 等工具的提示,完整地完成对关键属性的数值提取,例如 IAT 表的 RVA
14:根据所学知识,编写弹出 calc.exe 程序的 Shellcode,分别用 WinExec 或者CreateProcessA。
15:根据所学知识,完成正向 Shell 的 Shellcode
16:根据所学知识,以及研究 x86 与 x64 调用约定的差异,完整 x86 版的逆向 Shell 的 Shellcode