C 随机寄存器

C 随机寄存器,c,gcc,assembly,64-bit,inline-assembly,C,Gcc,Assembly,64 Bit,Inline Assembly,如果某些条件不满足,我想跳到一个随机的位置,使我的程序崩溃。我还想通过如下语句将寄存器随机化 asm("rdtsc \n"); asm ("movq %rax, %r15 \n"); ... asm ("xor %rbp, %r13 \n"); ... 有没有更好/更隐蔽的方法来做到这一点?我很担心,因为rdtsc不是程序中经常使用的语句。调用它也会不断产生类似的结果。除此之外,我能否以某种方式清除/随机化堆栈内容?如果您只是想崩溃,您随机选择的目标可能会跳转到合法的地方。只需运行ud2指令0

如果某些条件不满足,我想跳到一个随机的位置,使我的程序崩溃。我还想通过如下语句将寄存器随机化

asm("rdtsc \n");
asm ("movq %rax, %r15 \n");
...
asm ("xor %rbp, %r13 \n");
...
有没有更好/更隐蔽的方法来做到这一点?我很担心,因为rdtsc不是程序中经常使用的语句。调用它也会不断产生类似的结果。除此之外,我能否以某种方式清除/随机化堆栈内容?

如果您只是想崩溃,您随机选择的目标可能会跳转到合法的地方。只需运行ud2指令0F 0B,这保证会导致无效指令异常,导致未来每个x86 CPU上出现SIGILL。i、 它是保留的,因此未来的指令集扩展永远不会在指令的开头使用该双字节序列

如果您关心高质量的随机性以阻止任何潜在的回溯或堆芯转储,则调用随机数生成器来填充随机数据缓冲区,或者只填充一个您重复的32位随机值。用垃圾数据填充所有寄存器。在32位代码中,可以使用popa指令用垃圾数据填充所有寄存器。在64位模式下,您必须手动加载它们

然后用这些数据在堆栈上涂鸦,这样当你试图写入一个未映射的地址时,你的程序最终会因为SEGFULT而停止,因为你已经超出了堆栈区域

你可以用一个代表stosd或者别的什么来涂鸦

至于隐蔽性,你需要更详细地说明你的威胁模型是什么,以及你试图阻止任何人学习/做什么。i、 e.防止有人修改您的二进制文件使其不会以这种方式崩溃?

如果您只是想崩溃,您随机选择的目的地可能会跳转到合法的地方。只需运行ud2指令0F 0B,这保证会导致无效指令异常,导致未来每个x86 CPU上出现SIGILL。i、 它是保留的,因此未来的指令集扩展永远不会在指令的开头使用该双字节序列

如果您关心高质量的随机性以阻止任何潜在的回溯或堆芯转储,则调用随机数生成器来填充随机数据缓冲区,或者只填充一个您重复的32位随机值。用垃圾数据填充所有寄存器。在32位代码中,可以使用popa指令用垃圾数据填充所有寄存器。在64位模式下,您必须手动加载它们

然后用这些数据在堆栈上涂鸦,这样当你试图写入一个未映射的地址时,你的程序最终会因为SEGFULT而停止,因为你已经超出了堆栈区域

你可以用一个代表stosd或者别的什么来涂鸦


至于隐蔽性,你需要更详细地说明你的威胁模型是什么,以及你试图阻止任何人学习/做什么。i、 e.防止有人修改您的二进制文件,使其不会以这种方式崩溃?

除了Peter Cordes的建议外,我还想补充一点,OP希望编写负责这种混淆的代码,以便更隐蔽地避开范围。导致崩溃的指令需要在其他地方,否则混淆代码将从崩溃转储中显而易见,并且代码将很容易修补以移除炸弹

一个相当简单的解决方案是从一个公共库函数(如read或strlen)中找到RET操作码,然后通过在堆栈上推送地址并执行RET语句跳转到那里。此解决方案并不完美:存在存储执行跟踪的高级调试器,并且能够从崩溃位置回溯到模糊处理程序。为了克服这一点,您可能更愿意进入一个无限循环,而不是崩溃,但该循环可以很容易地找到并删除


你也可以在你的应用程序中嵌入一些复杂的代码,通过以随机方式执行许多不同的函数来计算一段时间,并将其用作从混淆器跳转到的蜜罐。

除了Peter Cordes的建议外,我还想补充一点,OP希望负责这种混淆的代码更隐蔽地远离范围。导致崩溃的指令需要在其他地方,否则混淆代码将从崩溃转储中显而易见,并且代码将很容易修补以移除炸弹

一个相当简单的解决方案是从一个公共库函数(如read或strlen)中找到RET操作码,然后通过在堆栈上推送地址并执行RET语句跳转到那里。此解决方案并不完美:存在存储执行跟踪的高级调试器,并且能够从崩溃位置回溯到模糊处理程序。为了克服这一点,您可能更愿意进入一个无限循环,而不是崩溃,但该循环可以很容易地找到并删除

您还可以在应用程序中嵌入一些复杂的代码,通过随机执行许多不同的函数来计算一段时间,并将其用作从t跳到t的蜜罐
他使用模糊处理工具。

制作一个堆栈展开代码,使每一层的堆栈帧随机化…制作一个堆栈展开代码,使每一层的堆栈帧随机化。。。