软件安全逆向——软件漏洞
Shellcode
可了解
漏洞利用(exploit):指利用已有漏洞(故有exploit就一定有漏洞,反之不一定),根据漏洞类型和特点采取相应的技术方案,进行尝试性或实质性攻击;(发起动作的代名词)
Shellcode:植入进程代码(实现具体功能)
payload:exploit的有效部分,负责触发漏洞,将控制权转移给shellcode(实际的完整结构)
需掌握(大题大题)
shellcode代码植入⭐⭐⭐
主要是利用溢出覆盖邻接变量以实现控制流劫持从而完成破解
对于一个Verify函数栈帧【buffer[44]+flag(4B)+前EBP(4B)】若想淹没此函数栈的返回地址,即要构建的代码块的第53~56字节(反写buffer的地址,其他的部分用90(NOP)填充)用于去覆盖掉返回地址
我们对获取函数入口地址的代码进行反汇编(比如获取一个MessageBoxA的地址为0x76670380),按照汇编指令转成对应的机器代码【33 DB 53 68 77 65 73 74 68 66 61 69 6C C4 53 50 53 B8 80 03 67 76 FF D0】(因为call是FF,在它前面的8位就是MessageBoxA的地址,考试的时候要放对位置和顺序,反着的),之后在HxD里用90填充到52字节,然后把buffer的地址写进去(也是反着的)
注:上述的机器代码其实可以在studio编写
1 |
|
利用调试转到反汇编找到对应汇编代码,对于push 0要替换成xor ebx,ebx 之后用push ebx来实现
获取到了汇编代码就能用来写代码了
1 |
|
之后再转到反汇编
右键显示代码字节
点调试——窗口——内存——内存1,则可找到和刚才一样的的机器码33 DB 53 68 77 65 73 74 68 66 61 69 6C C4 53 50 53 B8 80 03 67 76 FF D0接下来就和之前的一样了。
构造字符串比如west,其ASCII码为”\x77\x65\x73\x74”(虽然push指令里字符顺序是反的但机器代码的字符顺序是正的)
shellcode编码⭐⭐⭐(要回补全编码程序)
绕过安全检测,绕过坏字符,字符串差异
编码程序是独立的,末尾用’\x90’作为结束符,完整的shellcode=解码程序+编码的shellcode;
其实刚才那串机器代码就是一个shellcode,直接把那串前加上\x就行
异或编码:将shellcode的每字节异或特定字符(如0x77)后得到异或后的shellcode。
1 | /*关键代码块*/ |
第七章 结
