2011-11-19 139 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