jmp esp 跳板
可以适应shellcode的内存地址动态的变化
windows中系统dll,比如kernel32,user32基本上在每一个进程中的地址都相同,但下次开机就不同了
所以我们在user32中找一个jmp esp指令,jmp esp对应的指令是0xFFE4
OD有一个插件,OllyUni.dll可以快速找到jmp esp这一系列的指令
xor ebx,ebx
push ebx
之所以使用push ebx,是因为如果shellcode中出现00可能会被截断
抬高栈顶保护shellcode
当shellcode位于栈顶之上时,push 指令压栈可能会破坏shellcode,所以我们通常会在shellcode一开始就大范围抬高栈顶
jmp esp的替换
mov eax,esp jmp eax
函数返回地址移位
在一些情况下,返回地址距离缓冲区的偏移量是不确定的,这个时候可以用一片连续的跳转指令来覆盖返回地址,填入大量nop,只要可以击中nop区就可以执行shellcode
开发通用的shellcode
从fs:0拿到teb地址,teb中拿peb,peb中拿到dll的双向链表,再拿到kernel32地址,再解析pe文件,拿到loadlibray和getproaddress的地址,这样就可以就可以随意使用函数了
调试shellcode,调试shellcode是有一定难度的
这样编写使得我们便于调试
加载函数时函数名的处理
我们不希望直接出现Messagebox这种字符串的比较
所以我们使用hash校验函数的名字
在hash压入栈之前,先把方向标志位DF清零,因为当shellcode是利用异常处理机制而植入时,往往会产生标志位的变化,使shellcode中的字符串处理方向发生变化而产生错误 ,比如LODSD
对shellcode进行编码
shellcode中出现NULL字节,或者其他的一些字节,或者有些函数对参数的要求是ascll/unicode,或者杀毒软件静态扫描shellcode中的字符串,就会截断或者拦截
得乔装打扮shellcode
最简单的提前xor shellcode然后在shellcode之前加上解密的代码
标签:函数,esp,shellcode,jmp,漏洞,地址,ebx From: https://www.cnblogs.com/yewu1/p/17433138.html