构造一个缓冲区溢出的C语言的例子,并调试它,使得溢出时EIP的地址为:0x41424344

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了构造一个缓冲区溢出的C语言的例子,并调试它,使得溢出时EIP的地址为:0x41424344相关的知识,希望对你有一定的参考价值。

示例代码:
#include "stdafx.h"
#include "stdio.h"
#include "string.h"
void function(char *str)

char buffer[16];
strcpy(buffer, str);


int main(int argc, char* argv[])

int i;
char string[128];
for (i=0;i<127;i++)
string[i] = 'A';
string[127] = '\0';
function(string);
printf("This is a test!\n");
return 0;


(1) 通过上面的代码,理解为什么出现了溢出?
(2) 在上面的示例中通过调试,判断在第几个字节出现了溢出?
(3) 在上面的示例中增加一个函数,这个函数只需要输出一行信息,但是并不在Main函数中被调用,请恰当的修改string字符串的值,使得这个新增加的函数因为本地溢出,而被意外的调用了。(提示:需要调试获取这个函数的地址,并把这个地址填充在string字符串的恰当位置。)
请给出详细步骤,说明,谢谢!

有意思的“错误” 。看注解吧,太详细解释我也说不清楚,可以探讨一下

void test(void) //这个是增加的“错误调用的显示函数”

printf("有意思的溢出");

void function(char *str)

char buffer[16];
strcpy(buffer, str);


int main(int argc, char *argv[])

int i,p;
void (*pf)(void) = test; //pf 取得test()函数的地址 或者直接得到整数地址也可以
p = (int)pf; //p 保存test()函数的地址
char string[128];
for (i=0;i<127;i++)

string[i] = i+1; //原程序故意误导人,换成i+1后看错误提示一下子就知道从第几个字节溢出的了

string[127] = '\0';

string[28] = (char)p; //将显示函数地址写入溢出的地方
string[29] = (char)(p>>8);
string[30] = (char)(p>>16);
string[31] = (char)(p>>24);

printf("add of string is : 0x%x\n",&string);
printf("add of test() is : 0x%x\n",p);
function(string);
printf("This is a test!\n");
system("PAUSE");
return 0;
参考技术A #include "stdafx.h"
#include "stdio.h"
#include "string.h"
void function(char *str)

char buffer[16];
strcpy(buffer, str);


int main(int argc, char* argv[])

int i;
char string[128];
for (i=0;i<127;i++)
string[i] = 'A';
string[127] = '\0';
i=20;//esp
string[i++] = 0x44;
string[i++] = 0x43;
string[i++] = 0x42;
string[i++] = 0x41;
string[i++] = 0;

printf("This is a test!\n");
function(string);
return 0;

堆缓冲区溢出试图重新分配内存。 C语言

【中文标题】堆缓冲区溢出试图重新分配内存。 C语言【英文标题】:Heap Buffer Overflow trying to reallocate memory. C Language 【发布时间】:2020-06-09 16:42:37 【问题描述】:

我一直在 LeetCode 上为 Min Stack 编写代码。 我遇到的问题是当我尝试重新分配内存(在推送方法上)时,它告诉我“地址清理器:堆缓冲区溢出。”

是什么原因造成的,我该如何解决这个问题?谢谢

另外,解决这个问题的更好方法是什么?

typedef struct 

    int top;
    int *arr;
    int min;
    int size;
 MinStack;

/** initialize your data structure here. */

MinStack* minStackCreate() 
    MinStack* stack = (MinStack*)malloc(sizeof(MinStack));
    stack->size = 10;
    stack->top = -1;
    stack->min = INT_MAX;
    stack->arr = (int*) malloc(sizeof(int)*(stack->size));
    return stack;


void minStackPush(MinStack* obj, int x) 
    //if top+1 is equal to the size of the stack(when stack is full), 
    //I want to multiply the size by 2
    //so more numbers can fit in the stack. 

    if(obj->top+1 == obj->size)
        obj->size = obj->size*2; // this line seems to give me issues. 
        obj->arr = realloc(obj->arr, obj->size);
    

        obj->arr[obj->top+1] = x;
        obj->top++;

【问题讨论】:

不确定这是您问题的整个原因,但obj-&gt;arr = realloc(obj-&gt;arr, obj-&gt;size); 行不应该在前面的ifinside ?否则,您每次推送一个值时都会重新分配内存。 你说得对,我试图让它以不同的方式工作。但这仍然给我带来了问题。如果我只是删除 if 语句,那么它工作得很好。但我希望它只在堆栈已满时增加大小:/ 这也不是realloc 的正确方式。您应该为失败案例保存旧的指针值。是的,根本没有处理故障。 【参考方案1】:

分配不足/不正确。 realloc() 需要字节数,而不仅仅是元素数。

// obj->arr = realloc(obj->arr, obj->size);
obj->arr = realloc(obj->arr, sizeof *(obj->arr) * obj->size);

另外:健壮的代码会在分配给obj-&gt;arr 之前检查realloc() 结果。 @Eugene Sh.

【讨论】:

【参考方案2】:

根据手册页,问题似乎来自您的 realloc 调用: The realloc() function changes the size of the memory block pointed to by ptr to size bytes.

所以你需要有obj-&gt;arr = realloc(obj-&gt;arr, sizeof(int) * obj-&gt;size); 否则你的索引将被关闭。

您似乎在每次调用时都调用realloc,而不是仅在需要增加数组大小时,我建议将该调用移至if(obj-&gt;top+1 == obj-&gt;size) 语句中。

【讨论】:

以上是关于构造一个缓冲区溢出的C语言的例子,并调试它,使得溢出时EIP的地址为:0x41424344的主要内容,如果未能解决你的问题,请参考以下文章

什么是C语言缓冲区溢出漏洞?怎么利用?谁可以提供详细的资料

堆缓冲区溢出试图重新分配内存。 C语言

批评我的非侵入式堆调试器

C语言中为了避免缓冲区溢出应尽量使用哪些函数

软件构造 第七章第四节 调试

C语言中为了避免缓冲区溢出应尽量使用哪些函数