gpt4 book ai didi

c - 缓冲区溢出攻击

转载 作者:太空狗 更新时间:2023-10-29 16:28:51 24 4
gpt4 key购买 nike

我正在尝试执行一个非常简单的缓冲区溢出攻击。我对此几乎是个新手。所以,如果这个问题很愚蠢,请原谅我:-)

代码:

#include<stdio.h>
#include<stdlib.h>

int i, n;

void confused(int i)
{
printf("**Who called me? Why am I here?? *** %x\n ", i);
}

void shell_call(char *c)
{
printf(" ***Now calling \"%s\" shell command *** \n", c);
system(c);
}

void victim_func()
{
int a[4];
printf("Enter n: "); scanf("%d",&n);
printf("~~~~~~~~~~~~~ values and address of n locations ~~~~~~~~~~");
for (i = 0;i <n ;i++)
printf ("\n a[%d] = %x, address = %x", i, a[i], &a[i]);
printf("\nEnter %d HEX Values \n", n);

// Buffer Overflow vulnerability HERE!

for (i=0;i<n;i++) scanf("%x",&a[i]);
printf("Done reading junk numbers\n");
}

int main()
{
victim_func();
printf(“\n done”);
return 0;
}

当我使用 objdump 获取函数地址时,我有以下内容:

main(): 0x804854d
Address of main() where printf() is called: 0x8048563
victim_func(): 0x8048455
confused(): 0x8048414

现在,我想要的是通过溢出那里的缓冲区并将返回地址覆盖为 confused() 的地址,从 victim_func() 跳转到函数“confused()”。而我想从confused()返回到main中的printf()语句,正常退出。因此,我提供以下输入

Enter n: 7
Enter 7 HEX values:
1
2
3
4
5
8048414 (This is to jump to confused)
8048563 (this is to jump to printf() in main)

尽管程序从该 printf 语句打印“完成”,但它会跳回到 victim_func() 并打印“Enter n:”

我做错了什么?任何帮助将不胜感激!

PS:不知道我问的对不对。如果需要更多信息,请告诉我。

最佳答案

缓冲区溢出攻击比这复杂得多。首先,您需要了解汇编程序才能执行此操作。反汇编要定位的程序和函数后,您需要确定执行该函数时的堆栈布局。这是使用 visual studio 的缓冲区溢出示例,但原理是相同的。

#include "stdafx.h"
#include <math.h>

volatile double test;

double function3()
{
test++;
return exp(test);
}

double function2()
{
return log(test);
}

double function1()
{
int a[5] = {0};
a[7] = (int)&function3;
return exp(function2());

}
int _tmain(int argc, _TCHAR* argv[])
{
double a = function1();
test = a;
return a;
}

感谢反汇编,我们知道函数 1 中的 a 在函数保存堆栈帧指针的位置之前分配。后面的值是 function1 完成后应该去的返回地址。

00401090 55               push        ebp    <- we save the stack pointer
00401091 8B EC mov ebp,esp
00401093 83 EC 1C sub esp,1Ch <- save space to allocate a[5]
00401096 B8 CC CC CC CC mov eax,0CCCCCCCCh
0040109B 89 45 E4 mov dword ptr [ebp-1Ch],eax <- crt debug init a[5]
0040109E 89 45 E8 mov dword ptr [ebp-18h],eax
004010A1 89 45 EC mov dword ptr [ebp-14h],eax
004010A4 89 45 F0 mov dword ptr [ebp-10h],eax
004010A7 89 45 F4 mov dword ptr [ebp-0Ch],eax
004010AA 89 45 F8 mov dword ptr [ebp-8],eax
004010AD 89 45 FC mov dword ptr [ebp-4],eax

由此我们可以得出结论,如果我们用不同的地址覆盖 a[7],该函数将不会返回到 main,而是返回我们在 a[7] 中写入的任何地址。

希望这对您有所帮助。

关于c - 缓冲区溢出攻击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7344226/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com