我一直在解决一些漏洞,并且我下载的每个文件在“说明”中都说:“显然不允许修补”。这意味着什么?以及如何修补文件?

评论

简而言之,修补与编辑文件相同。

嗨,欢迎来到RE.SE。在这种情况下,我想这个主意是不允许使用成熟的技术来简化工作,从而“作弊”吗?我不确定如何解释它。磁盘上的可执行映像中是否不允许修补?没地方吗诸如挂钩,LD_PRELOAD和朋友之类的自动化仪器或技术呢? ...

@ 0xC0000022L通常意味着对于依靠补丁程序(静态文件修改)的crackme挑战提交的解决方案将不会被crackme作者接受。我认为DLL注入通常是可以的,除非crackme作者明确指出并非如此。 (使用LD_PRELOAD获得了很多成功)

对于OP,您可以共享crackme链接吗?

@ 0xC0000022L没问题,对了,LD_PRELOAD是一件美丽的事情。我忘了提到通常可以接受的原因是,如果crackme作者担心DLL注入,他们将提供静态链接的二进制文件,而不是说“ No LD_PRELOAD”。

#1 楼

以下引用来自unix.stackexchange:


修补文件意味着对其进行修改,意味着修改通常很小。


因此,修补可执行文件是更改其内容的过程,通常是为了更改其原始行为而执行的。

显然不允许进行修补,这意味着特定crackme的作者希望您在不对其进行修改的情况下就对其进行破解。内容。例如,考虑一个简单的程序:

ask_user_for_password();
read_input();
if (isPasswordCorrect())
    printf(“Congratulations, you have cracked it!\n”);
else
    printf(“Wrong password! Try again!\n”);


当然可以对其进行打补丁,以便它始终显示“恭喜[...]”消息,但要点这个非常简单的破解方法实际上是通过某种方式找到该密码(例如,通过找到解密密钥)。

通常,要修补文件,您要:


找到要更改的位置/指令(如@Axel Munoz所说,可能是jnzjz,但也可能是包含要执行代码的位置的jmp)。
找出代表您要放入的指令的机器代码是什么-可以通过首先编译用汇编语言编写的程序然后将其反汇编来完成。如果您使用的是x86架构,也可以使用此站点。
在十六进制编辑器中打开二进制文件,找到要放置代码的偏移量,然后粘贴上一步中获得的机器代码。


#2 楼

术语“修补[二进制]”是指修改指令集。例如,如果有条件跳转需要将某些内存设置为特定值,而不是修改内存(这可能是破解目标),那么我可以简单地修补二进制文件以始终采用该跳转(通过更改从jnz跳到jz的条件)。通过调试器进行修补很容易,我可以更改指令,保存新的二进制文件然后运行它。

这里有一些更多信息。

评论


您说修补意味着修改指令集,但是您说的很不准确,但是链接很好。

–滚动
19年8月14日在10:33



老实说,我从来不了解反转条件的意义(从jnz到jz)。当完全存在无条件跳转时,将一个条件跳转转换为另一条件跳转似乎很奇怪。

– 0xC0000022L♦
19年8月14日在10:57

@ 0xC0000022L如果程序中有错误,并且您想要反转if-else块以修复它,则可能会很有用。但是我同意这种情况很少见。

–bart1e
19年8月14日在11:04



@Croll我同意这不是最好的表达方式,您会怎么说呢?

– Axel Munoz
19年8月14日在11:17

我知道您的意思(修改二进制代码/逻辑),但是“指令集”是指CPU识别的指令集,并与CPU体系结构捆绑在一起。例如,x86指令集与MIPS指令集不同

– julian♦
19年8月14日在12:42