C 缓冲区溢出:执行加载到内存中的字符数组

C 缓冲区溢出:执行加载到内存中的字符数组,c,linux,assembly,x86,buffer-overflow,C,Linux,Assembly,X86,Buffer Overflow,我是一个道德黑客的学生,我被作为一个练习。我已经坚持了两天了 我们正在编写一个故意易受“缓冲区溢出”攻击的程序 或将其复制到缓冲区阵列的位置: 0x080482f4 <badf+160>: movl $0x0,-0x4(%ebp) 0x080482fb <badf+167>: jmp 0x8048316 <badf+194> 0x080482fd <badf+169>: mov

我是一个道德黑客的学生,我被作为一个练习。我已经坚持了两天了

我们正在编写一个故意易受“缓冲区溢出”攻击的程序

或将其复制到缓冲区阵列的位置:

   0x080482f4 <badf+160>:       movl   $0x0,-0x4(%ebp)
   0x080482fb <badf+167>:       jmp    0x8048316 <badf+194>
   0x080482fd <badf+169>:       mov    -0x4(%ebp),%edx
   0x08048300 <badf+172>:       mov    0x10(%ebp),%eax
.....
0x080482f4:movl$0x0,-0x4(%ebp)
0x080482fb:jmp 0x8048316
0x080482fd:mov-0x4(%ebp),%edx
0x08048300:mov 0x10(%ebp),%eax
.....
但这当然不是我们想要的

我如何通过在缓冲区数组中写入已加载的机器代码来找到执行该代码的指令指针地址?


编辑:ddd是我们正在使用的调试器,还请注意,我们正在使用32位linux。使用
-fno stack operator
标志编译代码,禁用编译器自动检查缓冲区溢出。

由于您将
myCode
复制到缓冲区中,您只需使用
buffer
本身即可:

假设有一个小小的endian机器:

// Overwrite Instruction Pointer
buffer[41] = (char)(((uintptr_t)buffer) >> 0);
buffer[42] = (char)(((uintptr_t)buffer) >> 8);
buffer[43] = (char)(((uintptr_t)buffer) >> 16);
buffer[44] = (char)(((uintptr_t)buffer) >> 24);

我不知道如何使用ddd,但您可以使用如下打印语句修改
badf
以打印
mycode
地址:

printf("mycode address: %p", (void *) mycode);

查看打印的内容,然后将其写入指令指针

badf+12处中断
并转储
ebp-0x29的地址
,但这是一个基指针地址否?我试过了,但是我的程序失败了,我不知道我的机器代码是否错了。我认为我没有得到正确的地址,我通过查找0xeb在堆栈中的位置来计算“bfff f427”。我想这一定是错的。DDD中是否有命令或其他内容来转储ebp-0x29的地址?感谢您的建议,我尝试了它,但是mycode地址每次执行都会发生变化。然后尝试下面答案中的medinoc方法。我需要知道如何查找此地址,而不仅仅是使用缓冲区的地址。代码的地址以0xbf开头是否正常,因为它位于堆栈上?我们在练习中使用的大多数其他指令指针地址都是从0x08开始的,但在这种情况下可能会出现0xbf?我确实尝试过,但我只是遇到了一个分段错误。对于恶意代码,我需要考虑little endian吗?
// Overwrite Instruction Pointer
buffer[41] = (char)(((uintptr_t)buffer) >> 0);
buffer[42] = (char)(((uintptr_t)buffer) >> 8);
buffer[43] = (char)(((uintptr_t)buffer) >> 16);
buffer[44] = (char)(((uintptr_t)buffer) >> 24);
printf("mycode address: %p", (void *) mycode);