中文/
中文/
中文/
中文/
中文/
中文/
中文/
中文/
中文/
中文/
软件Tags: [db:tag]
计算机病毒 Computer Virus
自行执行、自我复制
蠕虫病毒 worm
利用网络进行复制和传播,传染途径是通过网络和电子邮件。
类别 | 复制 | 传染 |
---|---|---|
普通病毒 | 需要传播受感染的驻留文件来进行复制 | 计算机内的文件系统而言 |
蠕虫 | 不使用驻留文件即可在系统之间进行自我复制 | 互联网内的所有计算机 |
木马 Trojan Horse
表面上是有用的软件、实际目的却是危害计算机安全并导致严重破坏的计算机程序。基于远程控制的黑客工具,隐蔽性、非授权性、欺骗性。
木马 不具传染性,不能复制自身,不刻意去感染其他文件,它主要通过将自身伪装起来,吸引用户下载执行。
渗透测试是通过模拟恶意黑客的攻击方法,来评估计算机网络系统安全的一种评估方法。
Zero-Knowledge Testing
,渗透者对系统一无所知。这类型测试,最初信息获取来自于DNS、Web、Email及各种公开对外的服务器。只说一下网络连接。
vmnet1 是 host-only,选择用 vmnet1 虚拟机可以与真实系统相互共享文件,但是虚拟机无法访问外部互联网。
vmnet8 是 NAT,即网络地址转换,虚拟机和真实系统可以相互共享,都能访问外部互联网。而且虚拟机是借用真实系统的IP上网的,不会受到IP-MAC绑定的限制。
Kali
隐藏的内容:
栈帧对应一个未运行完的函数,保存函数参数、返回地址、局部变量等
fun_B(){...}
fun_A(){...fun_B();...}
int main(){...fun_A();...}
extended stack pointer
),指针指向系统栈最上面一个栈帧的栈顶。extended base pointer
),针指向系统栈最上面一个栈帧的底部。ESP
和EBP
之间的内存空间为当前栈帧,EBP
标识了当前栈帧的底部,ESP
标识了当前栈帧的顶部。在函数栈帧中,一般包含以下几类重要信息:
extended instruction pointer
),指针指向下一条等待执行的指令地址。可以说如果控制了EIP
寄存器的内容,就控制了进程——我们让EIP
指向哪里,CPU就会去执行哪里的指令。函数调用大致包括以下几个步骤:
EBP
入栈)。ESP
值装入EBP
,更新栈帧底部)。注意:栈区地址由高到低,即栈底地址处于高地址,栈顶地址处于低地址。
EAX
、EBX
、ECX
和EDX
)ESI
和EDI
) 2个指针寄存器(ESP
和EBP
)ES
、CS
、SS
、DS
、FS
和GS
)EIP
) 1个标志寄存器(EFlags
)EAX
、EBX
、ECX
和EDX
。低16位寄存器为:AX
、BX
、CX
和DX
。对低16位数据的存取,不会影响高16位的数据。
16位寄存器可分为8位寄存器(AX:AH-AL
、BX:BH-BL
、CX:CH-CL
、DX:DH-DL
),每个寄存器可独立存取。
EAX
通常称为累加器(Accumulator
),可用于乘、 除、输入/输出、存储函数的返回值。EBX
称为基地址寄存器(Base Register
)ECX
称为计数寄存器(Count Register
),控制循环次数。EDX
称为数据寄存器(Data Register
)。乘、除运算作为默认的操作数,也可用于存放I/O
的端口地址。ESI
和EDI
。低16位对应SI
和DI
,对低16位数据的存取,不影响高16位的数据。
ESI
通常在内存操作指令中作为源地址指针使用,EDI
在内存操作指令中作为目的地址指针使用。
EBP
、ESP
称为指针寄存器(Pointer Register
),主要用于存放堆栈内 存储单元 的偏移量。指针寄存器不可分割成8位寄存器。也可存储算术逻辑运算的操作数和运算结果。
EBP
、ESP
主要用于访问堆栈内的存储单元,并且规定:
EBP
为基指针(Base Pointer
)寄存器,通过减去一定的偏移值来访问栈中元素;ESP
为堆栈指针(Stack Pointer
)寄存器,始终指向栈顶。CPU
内部的段寄存器:
CS
——代码段寄存器(Code Segment Register
),其值为代码段的段值;DS
——数据段寄存器(Data Segment Register
),其值为数据段的段值;ES
——附加段寄存器(Extra Segment Register
),其值为附加数据段的段值;SS
——堆栈段寄存器(Stack Segment Register
),其值为堆栈段的段值;FS
GS
EIP
,存放下次将要执行的指令在代码段的偏移量。MOV
: 源操作数 --> 目的操作数XCHG
: 交换两个操作数的数据PUSH
,POP
: 把操作数 压入 或 取出 堆栈ADD
:加法指令SUB
: 减法指令INC
, DEC
: 把OP
的值加一或减一NEG
: OP
的符号反相(取二进制补码)MUL
: 乘法指令DIV
: 除法指令AND
,OR
,XOR
,NOT
: 位运算(与/或/异或/非)SHR
,SHL
: 移位指令ROR
,ROL
,RCR
,RCL
: 循环移位指令CMP
: 比较OP1
与OP2
的值JMP
: 跳往指定地址执行LOOP
: 循环指令集CALL
,RET
: 子程序调用,返回指令INT
,IRET
: 中断调用及返回指令。在执行INT
时,CPU
会自动将标志寄存器的值入栈,在执行IRET
时则会将堆栈中的标志值弹回寄存器JXX
: 当特定条件成立则跳往指定地址执行 常用:
Z
:为0转移G
:大于则转移L
:小于则转移E
:等于则转移N
:取相反条件MOVSB
,MOVSW
,MOVSD
: 字符串传送指令CMPSB
,CMPSW
,CMPSD
: 字符串比较指令SCASB
,SCASW
: 字符串搜索指令int add(int x,int y){
z=x+y;
return z;
}
void main(){
n=add(1,3);
}
关注 main
函数中调用 add
函数所发生的栈帧变化:
00411415 push 3
00411417 push 1
00411419 call add (411096h)
函数调用call
完成:
栈帧切换
004113A0 push ebp; //将EBP的值入栈
004113A1 mov ebp,esp; //将ESP的值赋值给EBP
004113A3 sub esp, 0CCh; //将ESP抬高,得到栈大小为0CCH
上面三行汇编代码完成了栈帧切换,即保存了主函数栈帧的EBP的值,通过改变EBP和ESP寄存器的值,为add函数分配了栈帧空间。 此时栈区状态为:
004113A9 push ebx; //保存现场 ebx作为内存偏移指针使用
004113AA push esi; //保存现场 esi是源地址指针寄存器
004113AB push edi; //保存现场 edi是目的地址指针寄存器
004113AC lea edi,[ebp-0CCh] ; //将当前栈顶地址装入EDI
004113B2 mov ecx,33h; //设置计数器数值,即将ECX寄存器赋值为33h
004113B7 mov eax,0CCCCCCCCh; //向寄存器EAX赋值
004113BC rep stos dword ptr es:[edi]; //循环将栈区数据都初始化为CCh
其中: rep
指令的目的是重复其上面的指令.ECX
的值是重复的次数. STOS
指令的作用是将eax
中的值拷贝到ES:EDI
指向的地址.
int z=0;
004113BE mov dword ptr [z],0 ; //将z初始化为0
z=x+y;
004113C5 mov eax,dword ptr [x]; //将寄存器EAX的值设置为形参x的值
004113C8 add eax,dword ptr [y] ; //将寄存器EAX累加形参y的值
004113CB mov dword ptr [z],eax; //将EAX的值复制给z
return z;
004113CE mov eax,dword ptr [z]; //将z的值存储到EAX寄存器中
main
函数:
004113D1 pop edi ; //恢复寄存器值
004113D2 pop esi ; //恢复寄存器值
004113D3 pop ebx ; //恢复寄存器值
004113D4 mov esp,ebp ; //恢复寄存器值
004113D6 pop ebp ; //恢复寄存器值
004113D7 ret ; //根据返回地址恢复EIP值,相当于pop EIP
源代码 通过 编译 和 连接 后形成可执行文件。PE
(Portable Executable
)是Win32
平台下可执行文件遵守的数据格式。常见的可执行文件(如*.exe
文件和*.dll
文件)都是PE
文件。
PE
文件格式把可执行文件分成若干个 数据节(section
),不同资源被存放在不同的节中。一个典型的PE
文件中包含的节如下:
.text
二进制机器代码.data
初始化的数据块,如宏定义、全局变量、静态变量等。.idata
可执行文件所使用的动态链接库等外来函数与文件的信息。.rsrc
存放程序的资源,如图标、菜单等。除此以外,还可能出现的节包括.reloc
、.edata
、.tls
、.rdata
等。
标准PE
文件节信息往往是大致相同的。可以把代码中的任意部分编译到PE
的任意节中,节名也可以自己定义,如果可执行文件经过了加壳处理,PE
的节信息就会变得非常古怪。
加壳 的全称是可执行程序资源压缩。加壳过的程序可以直接运行,但是不能查看源代码。要经过脱壳才可以查看源代码。
加壳 其实是利用特殊算法,对EXE
、DLL
文件里的代码、资源等进行压缩、加密,类似WINZIP
的效果,只不过这个压缩之后的文件可以独立运行,解压过程完全隐蔽,都在内存中完成。它们附加在原程序上载入内存后,先于原始程序执行,得到控制权,执行过程中对原始程序进行解密、还原,还原完成后再把控制权交还给原始程序,执行原来的代码部分。加上外壳后,原始程序代码在磁盘文件中一般是以加密后的形式存在的,只在执行时在内存中还原,这样就可以比较有效地防止破解者对程序文件的非法修改,同时也可以防止程序被静态反编译。
加壳工具通常分为压缩壳和加密壳两类。
Windows
的内存分为:物理内存和虚拟内存。通常,在用户模式下,用调试器看到的内存地址都是虚拟内存。
用户编程地址称为 虚拟地址
/逻辑地址
/虚拟内存
/逻辑地址空间
。
计算机物理内存访问地址称为 实地址
/物理地址
/物理存储空间
/主存空间
。
程序进行 虚地址 到 实地址 转换的过程称为程序的再定位。
File Offset
) 数据在PE
文件中的地址叫文件偏移地址,这是文件在磁盘上存放时相对于文件开头的偏移。Image Base
) PE
装入内存时的基地址。默认EXE
在内存中的基地址是0x00400000
,DLL
是0x10000000
。Virtual Address
) PE文件中的指令被装入内存后的地址Relative Virtual Address
) 相对虚拟地址是内存地址相对于映射基址的偏移量。虚拟内存地址、映射基址、相对虚拟内存地址三者之间有如下关系:VA = Image Base + RVA