python 灰帽子 打印隨機(jī)數(shù) 結(jié)果和預(yù)期不一致

最近在讀《python 灰帽子》一書,按照書上代碼照抄一邊,運(yùn)行結(jié)果卻是預(yù)期的效果,前三章的練習(xí)通過網(wǎng)上搜索修改后可以正常運(yùn)行。第四章的第一個示例代碼printf_random的結(jié)果也和書上不一致(可能是因為書上系統(tǒng)環(huán)境是32位,我的是64位吧)。錯誤結(jié)果如下圖:


網(wǎng)上查了一下,找到這篇文章:
http://www.docin.com/p-680357401.html。

里面通過在回調(diào)方法printf_randomizer方法中調(diào)用dbg.dump_context()方法查看context內(nèi)容。發(fā)現(xiàn)
parameter_addr = dbg.context.Esp + 0x8 處 0x8 改為 0x4??梢匀〉蕉?heap)上的字符串“Loop iteration 4!”, 然后截取字符串替換字符串的方式實現(xiàn)了預(yù)期結(jié)果。但是文章最后也提到了這種方式最后修改的并不是存放counter的那塊內(nèi)存中的值,只是修改了最后輸出語句中兩個字節(jié)的值。

另外還發(fā)現(xiàn)另一篇文章http://blog.csdn.net/u012763794/article/details/52174275。

里面提到發(fā)現(xiàn)調(diào)用的軌跡:
call python27.PyOS_snprintf ----> msvcr90._vsnprintf --> msvcr90.printf
而參數(shù)入棧在_vsnprintf 就已經(jīng)搞定了,到后面的printf直接壓字符串入棧就可以了,應(yīng)該msvcrt也是一樣的。
所以在printf打斷點時就只能修改字符串了,想要修改counter,需要在_vsnprintf調(diào)用之前加斷點,在嘗試msvcr90._vsnprintf 和 msvcr90.printf失敗后,最終作者python27.PyOS_snprintf成功了,但是作者文章中寫的比較模糊,最后成功的代碼也沒貼出來,我試了幾次也沒成功。

在查看dump_context時發(fā)現(xiàn)EDI里放的好像就是counter里的值!

然后通過修改context.Edi最終也成功出來結(jié)果。


但是也存在回調(diào)函數(shù)調(diào)用兩次的情況,和文章的情況不一樣的地方是他輸出的是一個固定的常量地址(難道是counter的地址?),而我的輸出的是counter的原始值。

最后貼出代碼:

print_random
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評論 19 139
  • //Clojure入門教程: Clojure – Functional Programming for the J...
    葡萄喃喃囈語閱讀 4,044評論 0 7
  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,677評論 0 4
  • 工作總結(jié) 初到公司入職,安排在辦公室,五六年建個人職位從主管到辦公室副主任到項目部副部長;獲過獎、受過“處分”;經(jīng)...
    路人甲W閱讀 263評論 0 0
  • 漫渡紅塵路逍遙,幻夜月神不露頭; 疑遇鬼魅身心損,風(fēng)扯衣襟汗?jié)M衫。 步呦手寒心無路,嘆笑世間滄???; 突有歌謠燈火...
    大紅羊閱讀 497評論 13 23

友情鏈接更多精彩內(nèi)容