0

假设有一个包含 sprintf() 的错误程序,我想将其更改为 snprintf,这样它就不会出现缓冲区溢出。我该如何在 IDA 中做到这一点?

4

1 回答 1

3

您真的不想使用来自 IDA pro 的信息进行这种更改。

虽然 IDA 的反汇编质量比较高,但质量不足以支持可执行重写。将对 sprintf 的调用转换为对 snprintf 的调用需要将一个新参数压入堆栈。这需要引入一条新指令,该指令会影响可执行映像中跟随它的所有内容的 EA。更新这些有效地址需要极高的反汇编质量。特别是,您需要能够:

  1. 识别可执行文件中的哪些地址是数据,哪些是代码
  2. 识别哪些指令操作数是符号的(地址引用)以及哪些指令操作数是数字的。

艾达不能(可靠地)给你这些信息。此外,如果可执行文件与 crt 静态链接,它可能不包含 snpritnf,这将使手动执行重写非常困难。

有一些潜在的解决方法。如果在进行调用的函数中(或之后)有足够的填充可用,您可能只需要重写一个函数就可以逃脱。或者,如果您有权访问目标文件,并且这些目标文件是使用 /GY 开关编译的(假设您使用的是 Visual Studio),那么您可以编辑目标文件。但是,编辑目标文件可能仍需要大量修复。

但是,据推测,如果您可以访问目标文件,您可能也可以访问源文件。更改来源可能是您最好的选择。

于 2010-07-01T23:08:08.047 回答