堆栈内存溢出漏洞

内存栈溢出导致的漏洞

example 1 内存内容覆盖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <bits/stdc++.h>
using namespace std;
int main()
{
int cookie;
char buf[8];
printf("%08x %08x\n", &cookie, &buf);
printf("%d\n", cookie);
gets(buf);
if(cookie == 0x41424344)//11111111DCBA
printf("win\n");
printf("%08x\n", cookie);
return 0;
}

上图中的第二条注意:

main函数的返回地址指的是当函数执行完之后,EIP寄存器所应该跳转的地址!

example2 覆盖函数返回地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int copy(char* input)
{
char var[20];
strcpy(var, input);
return 0;
}
int hacked()
{
printf("Can you see me now?\n");
exit(0);
}
int main()
{
char n[100];
char source[] = "11112222333344445555eeee\x80\x10\x40\x00";
copy(source);
return 0;
}

var处于栈内存的顶部,下面存放的是ebp寄存器的内容,这个不是我们关心的。
ebp下面是函数的返回指针,而这时我们修改的重点。将指针指向hacked()函数的首地址。

后来的内存变化:

未解决的问题

文章目录
  1. 1. example 1 内存内容覆盖
  2. 2. example2 覆盖函数返回地址
  3. 3. 未解决的问题
{{ live2d() }}