本文来源:Moeomu的博客
栈空间移位
ShellCode在内存中往往是动态的,并非直接填写一个定值
也就是前一篇中buffer数组的栈空间地址,并非总是个定值
当CPU执行到此地址时,有可能触发无效指令异常导致程序崩溃,ShellCode无法运行
原理
从程序已加载的系统DLL中查找一个JMP ESP
指令的地址,用此地址去淹没返回地址
这样既能精准定位shellcode的位置,又能适应栈空间的动态变化
栈的地址是上小下大,CPU的执行顺序是小地址到大地址,栈淹没同样从小地址淹没到大地址
这样只要将前面的一段空间淹没为无意义数据,将ShellCode的开始恰好淹没在[ESP]
处,就可以达到ShellCode动态寻址
ShellCode编写
结构
无用数据+JMP ESP
地址(此地址恰好淹没到函数返回地址)+命令代码(用于测试,MessageBox弹窗)
说明:
retn
后将会跳到JMP ESP
处,随后ESP + 4JMP ESP
后将会正好跳到命令代码处
必要数据
JMP ESP
地址:位于User32.dll中0x77D29353
(没必要必须是原版命令,只要搜二进制0xFFE4
即可)- 垃圾数据大小:52 Byte = Buffer(44 Byte) + authenticated(4 Byte) + EBP(4 Byte)
最终Code
以下是需要执行的命令代码
|
|
最终的ShellCode
|
|