2011-11-19 103 views
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()使用格式字符串,而不是新的。

我錯過了什麼嗎?如何修改格式字符串?

+3

你確定不應該編輯堆棧嗎? –

+0

@DietrichEpp:你是對的!但我該怎麼做(抱歉,我還是GDB的新手)?我嘗試過設置($ esp + 0xC)=「%s @%s」',但它告訴我'賦值的左操作數不是左值。 – ryyst

+0

由於您的新字符串比原始字符串長,因此您將覆蓋堆棧中的內存並不安全,因爲您會破壞接下來的任何內容。此外,字符串「%s%s」實際上不在堆棧中,只是指向堆棧的指針。無論如何,無論你身在何處,你仍然有腐敗問題。 – TJD

回答

1

我曾嘗試使用一套$ ECX = 「%S @%的」

如果您是在32位模式下(我假設你,因爲你已經使用ecx,而不是rcx),當您在call ...sprintf上停止時,sprintf的參數已被輸入堆棧。

如果參數來自%ecx,你需要新的價值之前的值壓入堆棧重新分配給%ecx