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