Tag: 利用

C:函数的返回地址(mac)

以下简短c程序: void foo(int a, int b) { printf(“a = %pb = %p\n”, &a, &b); } main() { foo(1, 2); } 好的,现在我用gdb来查看这个程序。 我得到了输出: a = 0x7fff5fbff9ac b = 0x7fff5fbff9a8 并在输出后停止执行(在foo()中)。 现在我检查了0x7fff5fbff9ac,内容是: 1 ….正确 那么0x7fff5fbff9a8和内容: 2 …正确 现在我想查看函数的返回地址并检查(a + 4个字节): x / g 0x7fff5fbff9b1(8字节!!地址,因此“g”(巨字)) 其内容是: (gdb) x/g 0x7fff5fbff9b1 0x7fff5fbff9b1: 0xd700007fff5fbff9 但是:这不是主要的回报! 我的错在哪里?

在ARM Cortex-M3上编写一个简单的C任意代码执行漏洞?

我正在尝试用C语言编写一个概念certificate,它演示了ARM Cortex-M3上堆栈中内存缓冲区的代码执行。 这将有助于certificate正确使用ARM MPU可以防止此类攻击。 我想一个快速而肮脏的方法来将一些代码放入堆栈中是从常规函数中复制它然后使用goto跳转到它,如下所示: static void loopit(void) { printf(“loopit\n”); while (1); } void attack(void) { uint8_t buffer[64] __attribute__((aligned(4))); memcpy(buffer, loopit, sizeof(buffer)); goto *((void *) (int) buffer); } 我希望当我调用攻击函数时,它会将代码复制到堆栈中,跳转到它,打印消息并进入无限循环。 但是,我在故障寄存器中得到以下值的exception: HFSR = 0x40000000 CFSR = 0x00020000 PSR = 0x60000000 这似乎是UFSR中的INVSTATE位,表示“非法使用EPSR”,我读到的通常是由于BX指令试图跳转到LSB设置为0的地址,处理器将其解释为函数其中包含非Thumb代码,但Cortex-M处理器仅允许Thumb代码。 我看到memcpy被赋予了loopit函数的奇数地址,因为我假设编译器正在将实际内存地址与1或运算。 所以我认为修复就像重写我的攻击函数一样: void attack(void) { uint8_t buffer[64] __attribute__((aligned(4))); memcpy(buffer, ((int) loopit) & ~1, sizeof(buffer)); goto […]