返回列表 发帖

[讨论]IDA中 已知堆栈中的某个局部变量的地址 如何知道该变量属于哪个函数?

[讨论]IDA中 已知堆栈中的某个局部变量的地址 如何知道该变量属于哪个函数?
信息来源:邪恶八进制信息安全团队(www.eviloctal.com
文章作者:BeQuick

我的插件在strncpy()的第一条指令处设置断点,然后启动调试器,程序执行到断点挂起后,通过esp可以得到调用strncpy()时压入堆栈的参数。 得到strncpy()目标缓冲区的地址(比如为 lpDestStr, 并假设lpDestStr指向的是堆栈中的某一个缓冲区, 而不是数据段中的缓冲区)后, 如何知道lpDestStr指向的缓冲区属于哪个函数? (即该缓冲区位于哪个函数的堆栈空间中?)


注意:lpDestStr指向的缓冲区不一定位于调用strncpy()的函数中,(考虑这种情况 :fun2()中调用func1(), fun1()中调用strncpy(), 那strncpy()的目标缓冲区可能在func1()的堆栈空间中,也可能在func2()的堆栈空间中,暂时不考虑目标缓冲区位于数据段的情况)
帖子15 精华0 积分10 阅读权限40 性别男 来自湖北 武汉 在线时间5 小时 注册时间2008-3-28 最后登录2008-5-14 查看详细资料引用 报告 回复 TOP 让女孩一夜变的更有女人味

neilhsu
手语者

晶莹剔透§烈日灼然

已经有了缓冲区的地址
这个地址在相应函数活动记录的LocalVariable区内

Active Record Structure:
[LocalVariables]
[SavedEBP]
[ReturnAddress]
[Parameters]

那就往这个地址之后看(地址值大的方向),找这个函数的ReturnAddress
一般ReturnAddress前面都会有SavedEBP(除非用了FPO优化),分辨的方法就是这个SavedEBP值一般是一个接近并且大于它所在地址的地址值
那ReturnAddress所在的函数就是当前函数的调用者
在你所举的例子中,比如ReturnAddress在fun2()中,那也就说明当前的活动记录属于fun1()
所以缓冲区应该在fun1()中
帖子1 精华0 积分1 阅读权限40 性别男 在线时间2 小时 注册时间2008-3-10 最后登录2008-5-12 查看详细资料引用 报告 回复 TOP 让女孩一夜变的更有女人味

BeQuick
晶莹剔透§烈日灼然

TOP

返回列表