这是本人大一上期末水的一篇期末作业,当时刚接触网络安全,整体思想以及技术水平还是比较稚嫩的,但是文末对安全的理解,即“完全的公开或者是相对的保密”是作为我的安全方向的本体论贯穿我的整个学习以及工作生涯的。
今天整理博客一并上传。
内容摘要:XSS(Cross Site Script)作为一种常见的漏洞早已在网络中泛滥成灾,虽然一些安全厂商在这种简单但是一经利用就会有极大威胁的漏洞上还是花费心思进行过滤的,但是企业却似乎毫不重视,联想至网络安全的现状以及以及曾经由乌云开启的乌云众测下的白帽时代,不经感慨万千。
关键词:XSS 网络安全 风险评估 等保
XSS简述XSS的全称是跨站脚本攻击,是在网页中只要有对外的接口很容易发现的漏洞,根据其涉及的攻击方式,普遍将其划分成反射型,存储型和DOM型,其中反射型最为常见也运用最广。反射型XSS最基础的测试方式就是构建类似于“alert(1);”的语句,而成功构建弹窗就是XSS的一个里程碑。而相对的防御XSS的方式也是极为简单的,只要在代码中加入相应的过滤方式(如:用双引号扩起属性值,转义HTML中的特殊字符等)就可以防御这类攻击。可所谓道高一尺 ...
《加密与解密》笔记
未读反跟踪技术BeingDebuggedBeingDebugged标志位Win32 API IsDebuggedPresent可以检测当前进程是否处于调试状态:
123BOOL APIENTRY IsDebuggerPresent(VOID){ return NtCurrentPeb()->BeingDebugged;}
该函数通过读取PEB的BeingDebugged标志位来检测当前进程是否处于调试态,BeingDebugged标志位在PEB的0x002偏移处。
而PEB在TEB的偏移0x30处,又因为TEB被寄存器fs:[18]指向,所以PEB的地址获取方式如下:
12mov eax,fs:[18h]mov eax,[eax+0x30h]
又因为fs:[18h]其实指向自身,所以上面两句可以用一句mov eax,fs:[0x30]替代,结合BeingDebugged偏移,可以得到BeingDebugged获取方式:
12mov eax,fs:[0x30h]mov eax,[eax+0x02]
具体实现如下:
12345678910BOOL is_bei ...
《加密与解密》笔记
未读软件保护技术防范算法求逆堡垒战术
MD5算法
为了确保完整性,有时会在msg末尾加上数字签名等。
RSA算法
一般用于软件保护。
常见的实现:
12R = U^d mod n //注册机U = R^e mod n //验证函数
算法本身没啥问题,但是使用RSA仍有一定的风险:
使用第三方公用代码,这些代码可能有漏洞;
使用不同e,d但是相同N导致共模组攻击;
若解密端使用的函数运用了中国剩余定理就会暴露p,q;
一些伪随机数产生器会产生相同的随机数序列,若使用了这些生成器生成N,可能会暴露p,q;
RSA使用过程中若使用的p,q为某些特殊素数,就会产生弱密钥,产生风险;
游击战术
化整为零
即将要验证的内容分段进行验证函数。
虚虚实实
R分段成R1,R2,R3,R4……后,可以将验证的值U与这些分段关联起来,在运用一些方法使得R和U不呈现一一对应的关系。
战略转移
内存复制;
写入注册表或文件;
同时将注册码复制到多个地址;
突然变化转移注册码的方法;
随机使用上述方案;
抵御静态分析花指令测试代码:
12345678910111213141516171819 ...
《加密与解密》笔记
未读专用加密软件壳压缩壳
UPX
ASPack
加密壳
ASProtect
Armadillo
EXECryptor
Themida
虚拟机保护软件书中介绍的虚拟机与P-CODE类似,将一系列指令解释成字节码后放在一个解释引擎中执行,从而实现对软件的保护。
概念一个虚拟机引擎主要由编译器、解释器、虚拟CPU环境组成,并且搭配一个或多个指令系统。虚拟机在运行时,先根据自定义的指令把已知的x86指令解释成字节码并放在PE文件中,然后将原始代码删除,改成类似这样的代码:
12push bytecodejmp VstartVM
然后进入虚拟机执行循环。
比较典型的有较好保护强度的是VMProtect,使用起来也极为方便,针对要保护的函数,设置保护,然后点击编译即可:
脱壳技术基础知识壳的加载过程
保存入口参数
加壳程序初始化会保存各寄存器的值,待外壳执行完毕后回复各寄存器的内容,最后跳到原程序执行。
通常会使用如下一些指令进行保存和恢复寄存器内容:
12pushad/popadpushfd/popfd
获取壳本身需要使用的API地址
一般情况下,外壳的输入表只有GetProcAddr ...
《加密与解密》笔记
未读Hook的分类Address Hook即修改某些函数的地址,他们可能存放在某个函数表中,可能是存在例程中,可能是在MSR寄存器中,也可能是某个特点函数指针。
各类表中的地址
PE的IAT
仅针对某个PE的模块的IAT进行Hook,想要对加载的所有模块起作用就必须变量进程内模块,对目标API进行Hook。
PE的EAT
EAT存放的是函数地址的偏移,所以想要使用针对EAT的Hook,就需要计算目标函数与修改后函数地址的偏。该方式的Hook进行后,所有试图通过输入表获取函数地址的行为都会收到影响。
user32.dll的回调函数表
user32.dll中的UER32!apfnDispatch的回调函数表存放了各种用于GUI的回调函数,当修改了这里的函数地址后,就可以进行Hook。
IDT
IDT即系统中断ID,IDT的基址存放在idtr寄存器中,表内项目数存放在idtl寄存器中,每个中断项的中断处理例程成为ISR。
SSDT以及Shadow SSDT
SSDT表即系统服务描述符表,在API调用系统服务处理时使用。Shadow SSDT表用于处理各种GUI服务。
C++ ...
《加密与解密》笔记
未读notes about chapter12DLL注入通过干预输入表处理过程加载目标DLL输入表相关
输入函数调用
PE文件内部有一组数据结构,对应于被输入的DLL,每一个这样的结构都给出了输入的DLL的名称并指向一组函数指针。这组函数指针为IAT(输入地址表),每一个被引入的API在IAT里都有保留的位置,API被Windows加载器在该位置写入输入函数的地址。
一旦模块被载入,IAT中将包含要调用的输入函数的地址。
默认情况下,输入API的调用采用下列这种低效的形式:
1234 Call 00401164 ............:00401164 Jmp dword ptr [00402010]
可以在编写程序时使用一个前缀”__declspec(dllimport)”来告诉编译器这个函数来自另外一个DLL,这样上述指令就会变成:
1Call dword ptr [00402010]
示例如下:
1__declpec(dllimport) void Foo(void);
输入表的结构
PE文件头的可选映像头中,数据目录表的第二个成员指向输入表。输入表以一个 ...
《加密与解密》笔记
未读notes about chapter 66.1 单项散列算法(hash)不可逆运算。
MD5原理
填充
填充消息使得其与448模512同余,即使本身已经满足长度也需要填充,填充方法:首先附加1个1,然后使用0填充。至少填充一位,至多填充512位(即本身已经满足的)。
添加长度
在上一步的结果后附加63位的消息长度,如果填充前消息长度大于2^64,则只使用其低64位。添加填充位和消息长度后,最终消息正好是512的倍数。
初始化变量
使用4个变量来计算消息摘要。
A=0x1234567
B=89abcdefh
C=0xhfedcba98
D=0x7654321
数据处理
输出
将ABCD的级联作为MD5的输出结果。
样例输入的name与”www.pediy.com”拼接后md5的值。
校验函数:
123.text:0040125C push eax ; lpString2.text:0040125D push ecx ; lpString1. ...
《加密与解密》笔记
未读notes from chapter 4x86-64函数调用约定VS编译出的64程序只有寄存器快速调用约定:前4个参数使用寄存器传递,超过的参数放在栈中,入栈顺序从右至左,由函数平衡堆栈。
参数1:RCX;
参数2:RDX;
参数3:R8;
参数4:R9;
任何大于8字节或者不是1字节、2字节、4字节、8字节的参数必须由引用来传递(地址传递)。所有浮点参数的传递都是使用XMM寄存器完成的,它们在XMM0、XMM1、XMM2和XMM3中传递。
参数1:XMM0;
参数2:XMM1;
参数3:XMM2;
参数4:XMM3;
如果参数既有浮点类型,又有整数类型,例如”void fun(float, int, float,int)”, 那么参数传递顺序为笫1个参数(XMM0)、笫2个参数(RDX)、 笫3个参数(XMM2)、笫4个参数(R9)。
如果参数是结构体且大于8字节,在传递参数时,会先把结构内容复制到栈空间中,再把结构体地址当成函数的参数来传递(引用传递)。
类的函数中,由于rcx寄存器保存了this指针,所以函数的参数调用从rdx开始使用。
虚函数相关判断一个函数为构造 ...
《加密与解密》笔记
未读note about chapter 11.1.2逆向工程定义:
软件使用限制的去除或者软件功能的添加。
软件源代码的再获得。
硬件的复制和模拟。
动态分析注意点:
对软件进行粗跟踪
对关键部分进行细跟踪
1.3.2 SysWOW64与System3264位系统如何兼容32位程序的:
System32存放64位映像文件,SysWOW63存放32位系统文件。
32位程序加载时,WOW64建立32位ntdll.dll所要求的启动环境,将CPU模式切换至32位,并开始执行32位加载器,就如同该进程运行在原生的32位系统上一样。
1.3.4 虚拟内存相关虚拟内存的过程:
一个程序启动,系统创建一个进程,并给该进程分配2GB虚拟地址;
虚拟内存管理器讲应用程序的指令映射到那个程序的虚拟地址中某个位置,并给当前需要的代码读入物理内存;
如果使用了DLL,DLL也会被映射到虚拟地址空间中,在需要的时候才会被读入物理内存;
其他项目的空间是从物理内存中分配的,并被映射到虚拟地址空间中;
应用程序通过使用其虚拟地址空间中的地址开始执行。然后,虚拟内存管理器把每次内存访问映射到物理空间;
n ...
efuzz论文阅读(能量调度部分)引子:王志等分析僵尸网络控制命令时,提出了BBL覆盖率的概念,用来描述一个BBL被执行路径覆盖的频繁程度。
BBL覆盖率————描述一个BBL被执行路径覆盖的频繁程度论文《基于覆盖率分析的僵尸网络控制命令发掘方法》部分内容阅读笔记。
基本块的覆盖率与覆盖次数
定义:基本块被执行轨迹的覆盖
如果在程序执行的过程中,某些基本块被执行,则称这些被执行的基本块被执行轨迹覆盖。
基本块被执行轨迹覆盖的信息内容
基本块被执行轨迹覆盖的信息包括两部分:覆盖率和覆盖次数。
覆盖率Pbb
Pbb描述的是一个基本块被执行轨迹覆盖的频繁程度,定义如下:
Pbb = Ncover/Nall
Nall是当前已捕获的执行轨迹总数,Ncover是覆盖该基本块的执行轨迹数量。
覆盖次数VBB
覆盖次数VBB描述的是基本块在不同执行轨迹中被执行的频繁程度,是一个向量:
VBB = (VT1</sub>,VT2</sub>,……,VTn</sub>)
VT1</sub>,VT2</sub>,……,VTn</ ...