假设我们有一个单线程程序,并且希望在发生预定义的中断(例如定时器中断)时捕获程序计数器(PC)的值。
如您所知,这似乎很容易,我们只需要使用一个特殊的关键字编写一个特定的汇编代码__asm__,然后在将移位4字节后将值弹出堆栈顶部即可。
那多线程程序呢?
我们如何从同一进程中运行的另一个线程获取所有线程的值?(从运行在多核处理器中单独内核上的线程获取值似乎非常不可思议)。(在多线程程序中,每个线程都有其堆栈并进行注册)。
我想实现破坏分子。
为了在目标多线程程序中执行故障注入,故障模型为SEU(单错误翻转),这意味着程序计数器寄存器中的任意位被随机修改(位翻转),从而导致违反正确的程序顺序。因此,会发生控制流错误(CFE)。
由于我们的目标程序是一个多线程程序,因此我们必须在所有线程的PC上执行故障注入。这是破坏分子的任务。它应该能够获得线程的PC来执行故障注入。假设我们有这段代码,
main ()
{
foo
}
void foo()
{
__asm__{
pop "%eax"
pop "%ebx" // now ebx holds porgram counter value (for main thread)
// her code injection like 00000111 XOR ebx for example
push ...
push ...
};
}
Run Code Online (Sandbox Code Playgroud)
如果我们的程序是多线程程序。这是否意味着我们有多个堆栈?
当OS执行上下文切换时,这意味着正在运行的线程的堆栈和寄存器已移动到内存中的某个位置。这是否意味着如果我们要获取这些线程的程序计数器的值,就可以在内存中找到它们?哪里?并且在运行时有可能吗?