« | August 2025 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | | | | | | | |
|
公告 |
本站技术贴除标明为“原创”的之外,其余均为网上转载,文中我会尽量保留原作者姓名,若有侵权请与我联系,我将第一时间做出修改。谢谢!
——既瑜 |
统计 |
blog名称:★既瑜★ 日志总数:183 评论数量:636 留言数量:-25 访问次数:1406168 建立时间:2005年3月12日 |
OICQ:215768265
njucs2001@hotmail.com
erichoo1982@gmail.com |
|
W3CHINA Blog首页 管理页面 写新日志 退出
[【技术文档】]防火墙原理及实现 (3) |
有了上面的知识,让我们回顾一下先前讨论的问题,首先,用户调用API的recv函数,程序运行到recv的入口地址处,此时堆栈中拥有用户调用recv的参数和用户代码中CALL [recv]的下一条指令的地址。堆栈如下图:
堆栈指针
[ESP]
堆栈的内容
堆栈内容的含义
0x00000100
0
参数
0x000000fc
len
参数
0x000000f8
buf
参数
0x000000f4
S
参数
0x000000f0
RetUserAddress
用户调用recv的下一条指令的地址
然后程序指针EIP被修改为recv入口处的地址,而入口地址处有一条简单的CALL指令,它使程序将recv的第6个字节的地址压入栈中(因为CALL XXXX占用5个字节,第六个字节被认为为返回地址),然后跳转到我们的无参数无返回值的通用替换函数中去了,好了看看现在堆栈中都有些什么?如图:
堆栈指针
[ESP]
堆栈的内容
堆栈内容的含义
0x00000100
0
参数
0x000000fc
len
参数
0x000000f8
buf
参数
0x000000f4
s
参数
0x000000f0
RetUserAddress
用户调用recv的下一条指令的地址
0x00000ec
RetrecvAddress
recv的第六个字节的地址
首先是参数,其次是用户调用recv后的返回值,然后是recv调用我们的替换函数中的返回值,紧接着就像刚才提到的那样,程序将EBP当前内容压入栈中。如图
堆栈指针[ESP]
堆栈的内容
堆栈内容的含义
0x00000100
0
参数
0x000000fc
len
参数
0x000000f8
buf
参数
0x000000f4
S
参数
0x000000f0
RetUserAddress
用户调用recv的下一条指令的地址
0x00000ec
RetrecvAddress
recv的第六个字节的地址
0x000000e8
OldEBP
保存的旧的EBP的内容,然后[EBP]= 0x000000e8
0x000000e4
OldEBX
保存的旧的EBX的内容
0x000000e0
OldESI
保存的旧的ESI的内容
0x000000dc
OldEDI
保存的旧的EDI的内容,此时[ESP]=0x000000dc
|
阅读全文(2226) | 回复(0) | 编辑 | 精华 |
|