python 灰帽子 打印随机数 结果和预期不一致

最近在读《python 灰帽子》一书,按照书上代码照抄一边,运行结果却是预期的效果,前三章的练习通过网上搜索修改后可以正常运行。第四章的第一个示例代码printf_random的结果也和书上不一致(可能是因为书上系统环境是32位,我的是64位吧)。错误结果如下图:


网上查了一下,找到这篇文章:
http://www.docin.com/p-680357401.html

里面通过在回调方法printf_randomizer方法中调用dbg.dump_context()方法查看context内容。发现
parameter_addr = dbg.context.Esp + 0x8 处 0x8 改为 0x4。可以取到堆(heap)上的字符串“Loop iteration 4!”, 然后截取字符串替换字符串的方式实现了预期结果。但是文章最后也提到了这种方式最后修改的并不是存放counter的那块内存中的值,只是修改了最后输出语句中两个字节的值。

另外还发现另一篇文章http://blog.csdn.net/u012763794/article/details/52174275

里面提到发现调用的轨迹:
call python27.PyOS_snprintf ----> msvcr90._vsnprintf --> msvcr90.printf
而参数入栈在_vsnprintf 就已经搞定了,到后面的printf直接压字符串入栈就可以了,应该msvcrt也是一样的。
所以在printf打断点时就只能修改字符串了,想要修改counter,需要在_vsnprintf调用之前加断点,在尝试msvcr90._vsnprintf 和 msvcr90.printf失败后,最终作者python27.PyOS_snprintf成功了,但是作者文章中写的比较模糊,最后成功的代码也没贴出来,我试了几次也没成功。

在查看dump_context时发现EDI里放的好像就是counter里的值!

然后通过修改context.Edi最终也成功出来结果。


但是也存在回调函数调用两次的情况,和文章的情况不一样的地方是他输出的是一个固定的常量地址(难道是counter的地址?),而我的输出的是counter的原始值。

最后贴出代码:

print_random
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,199评论 19 139
  • //Clojure入门教程: Clojure – Functional Programming for the J...
    葡萄喃喃呓语阅读 3,840评论 0 7
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,275评论 0 4
  • 工作总结 初到公司入职,安排在办公室,五六年建个人职位从主管到办公室副主任到项目部副部长;获过奖、受过“处分”;经...
    路人甲W阅读 221评论 0 0
  • 漫渡红尘路逍遥,幻夜月神不露头; 疑遇鬼魅身心损,风扯衣襟汗满衫。 步呦手寒心无路,叹笑世间沧海苦; 突有歌谣灯火...
    大红羊阅读 475评论 13 23