1
我創建使用sprintf()
的格式化字符串一些彙編代碼:GDB - 修改C字符串
...
0x00304272: call 0x557b2 <dyld_stub___sprintf_chk>
...
我試圖找出確切的字符串是如何被格式化,所以我找到了format參數"%s%s"
,存儲在$ecx
寄存器中。現在,我不知道一個字符串在哪裏結束,下一個開始,所以我想將格式參數改爲"%[email protected]%s"
。
我曾嘗試使用set $ecx = "%[email protected]%s"
(這似乎是工作,根據print (char *) $ecx
),但由於某些原因,sprintf()
使用老格式字符串,而不是新的。
我錯過了什麼嗎?如何修改格式字符串?
你確定不應該編輯堆棧嗎? –
@DietrichEpp:你是對的!但我該怎麼做(抱歉,我還是GDB的新手)?我嘗試過設置($ esp + 0xC)=「%s @%s」',但它告訴我'賦值的左操作數不是左值。 – ryyst
由於您的新字符串比原始字符串長,因此您將覆蓋堆棧中的內存並不安全,因爲您會破壞接下來的任何內容。此外,字符串「%s%s」實際上不在堆棧中,只是指向堆棧的指針。無論如何,無論你身在何處,你仍然有腐敗問題。 – TJD