Table of Contents
填空题
大概率必考
SDl开发模式
计算硬盘容量
主引导扇区的组成
其他
什么是软件安全
系统监控工具
流氓软件
简答题
大概率必考
画出堆栈示意图
三年来和软件缺陷、漏洞相关的重大安全事件
可信计算思路
计算机的启动过程
当前操作系统的移动引导形式及其区别
用户模式、内核模式
检测调试器是否存在
其他
主引导分区、扩展分区、逻辑分区的区别
Win32病毒是怎样被运行的
缓冲区溢出漏洞原理
什么是SQL注入
病毒检测技术
隐藏技术,隐藏XX的思路
综合题
虚实地址转换
Info
- 实际的虚拟地址,实际的寄存器CR3
Target
- 手工将虚拟地址转为实际的物理地址
Process
-
理论依据
-
整体思路
- 首先分解题目中已给的虚拟地址,按照10、10、12的位数进行分解组合,得到各处索引,再根据已知的cr3,即页目录表基址进行加法运行,得到页表项地址,再得到页面物理地址,最后根据页内偏移得到实际的物理地址。
-
配置环境
- WIndbg双机调试环境配置
- 调试模式下禁用PAE
-
输入标志信息
- 打开notepad,输入信息
-
查看进程信息
- 得到:DirBase: 3c3ae000
-
切换到当前进程
- cr3=3c3ae000
-
确定要转换的虚拟地址
- 要转换的虚拟地址:0017ddd0
-
分解
kd> .formats 0x17ddd0 Evaluate expression: Hex: 0017ddd0 Decimal: 1564112 Octal: 00005756720 Binary: 00000000 00010111 11011101 11010000 Chars: .... Time: Mon Jan 19 10:28:32 1970 Float: low 2.19179e-039 high 0 Double: 7.72774e-318
-
PDE:0000 0000 00 =0x0
-
PTE:0101 1111 01 =0x17d
-
页内:1101 11010000 =0xdd0
-
-
转换
- 得到:3ba00867,舍去后三位,得到3ba00000,查看3ba00000+0x17d*4
- 得到:00ee5867,舍去后三位,得到00ee5867,查看00ee5000+0xdd0
- 地址的后三位为权限等属性,需要置为0.
-
验证
Reference
远程线程插入
Info
- 给出一些关键的信息,pid,dll路径,关键部分代码等
Target
- 完善代码或编写代码
Process
-
配置环境 Win7 X86 + 关闭PAE
-
新建Win32 DLL项目
#include <windows.h> #include <tchar.h> BOOL WINAPI DllMain(HINSTANCE hInstDll, DWORD fdwReason, PVOID fImpLoad) { if (fdwReason == DLL_PROCESS_ATTACH) { MessageBox(NULL,"HACK_HENU",TEXT("hack by jovy-rtt"),MB_OK); } return(TRUE); }
-
新建WIn32 控制台应用程序
#include <windows.h> #include <stdio.h> #include <tchar.h> #include <string.h> #include <malloc.h> int main() { HANDLE hProcess = NULL, hThread = NULL; //此处为notepad的PID,先运行notepad,再手工填入 DWORD dwProcessId = 2444; PSTR pszLibFileRemote = NULL; //此处需要修改路径信息 char szLibFile[]="C:\\Users\\Administrator\\Desktop\\Sample1\\MyInjlib\\Debug\\TipInject.dll"; // Get a handle for the target process. hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | // Required by Alpha PROCESS_CREATE_THREAD | // For CreateRemoteThread PROCESS_VM_OPERATION | // For VirtualAllocEx/VirtualFreeEx PROCESS_VM_WRITE, // For WriteProcessMemory FALSE, dwProcessId); int cch = 1 + strlen(szLibFile); int cb = cch * sizeof(char); // Allocate space in the remote process for the pathname pszLibFileRemote = (PSTR) VirtualAllocEx(hProcess, NULL, cb, MEM_COMMIT, PAGE_READWRITE); // Copy the DLL's pathname to the remote process' address space WriteProcessMemory(hProcess, pszLibFileRemote, szLibFile, cb, NULL); // Get the real address of LoadLibraryA in Kernel32.dll PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE) GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryA"); // Create a remote thread that calls LoadLibraryA(DLLPathname) hThread = CreateRemoteThread(hProcess, NULL, 0, pfnThreadRtn, pszLibFileRemote, 0, NULL); // Wait for the remote thread to terminate WaitForSingleObject(hThread, INFINITE); return 0; }
-
打开notepad,并获取PID,手工修改PID
-
开始编译、组建、逐步调试
-
调试到最后,显示插入成功界面
Reference
软件安全-实验三
《软件调试》-第22章