据我所知,典型的缓冲区溢出攻击发生在攻击溢出堆栈上的内存缓冲区时,从而允许攻击者注入恶意代码并重写堆栈上的返回地址以指向该代码。
在使用盲目地将数据从一个区域复制到另一个区域的函数(如sscanf)时,这是一个常见的问题,检查一个区域的终止字节:
char str[8]; /* holds up to 8 bytes of data */
char *buf = "lots and lots of foobars"; /* way more than 8 bytes of data */
sscanf(buf,
假设我有这种代码:
// In revision.c
char *path_name(const struct name_path *path, const char *name) // by design, name_path->len is a 32 bits int, but this doesn’t concern name
{
const struct name_path *p;
char *n, *m;
int nlen = strlen(name); // the size is converted to a positive numbe
我是刚刚开始对缓冲区溢出攻击的理解,并想知道我目前对缓冲区溢出攻击的理解是否正确。假设操作地址空间为3个地址,指令空间为2个地址,相邻的1个地址指令指针:
(箭头是指令指针的当前位置。)
==>000x243
001xFFF
002x26B
003x4FF
004x14C
005x000 (points to address 000 as the next instruction)
缓冲区溢出是否将操作空间替换为4个地址,将指令指针调用覆盖到操作空间之一的操作空间,从而使下一个执行的机器代码成为开发人员的选择之一?如下所示:
000x243
001xFFF
==
我正在尝试学习基于堆栈的溢出,并编写一个简单的代码来利用堆栈。但不知何故,它根本不能工作,只是在我的机器上显示了中止陷阱(mac os leopard)。
我猜Mac os对待溢出的方式不同,它不允许我通过c代码重写内存。例如,
strcpy(buffer, input) // lets say char buffer[6] but input is 7 bytes
在Linux机器上,此代码成功覆盖下一个堆栈,但在mac os上被阻止(中止陷阱)
有人知道如何在mac机器上执行简单的基于堆栈的溢出吗?
我在mac和linux上运行了以下代码:
#include <stdio.h>
#include <string.h>
int main (int argc, char *argv[]){
int value = 5;
char buffer_one[8], buffer_two[8];
strcpy(buffer_one, "one");
strcpy(buffer_two, "two");
printf("[BEFORE] buffer_two is at %p and contains \'%s\'\