假设有一个包含sprintf()的buggy程序,我想将它更改为snprintf,这样它就不会有缓冲区溢出。在IDA里我该怎么做?
发布于 2010-07-01 23:08:08
你真的不想用IDA提供的信息来做这种改变。
尽管IDA的反汇编质量相对较高,但它的质量还不足以支持可执行重写。将对sprintf的调用转换为对snprintf的调用需要将一个新参数推到堆栈上。这就需要引入一个新的指令,它会影响可执行映像中跟随它的所有内容的EA。更新这些有效地址需要极高质量的拆卸。特别是,你需要能够:
艾达不能(可靠地)给你那个信息。此外,如果可执行文件是静态地链接到crt的,那么它可能不包含snpritnf,这将使手动重写变得非常困难。
有一些潜在的解决办法。如果在进行调用的函数中(或之后)有足够的填充可用,您可能只需重写一个函数即可。或者,如果您可以访问对象文件,并且这些对象文件是用/GY开关编译的(假设您使用的是Visual ),那么您可能能够编辑该对象文件。但是,编辑对象文件可能仍然需要大量的修补程序。
但是,如果您可以访问对象文件,那么您可能也可以访问源。改变来源可能是你最好的选择。
https://stackoverflow.com/questions/2301280
复制相似问题