昨天网上看了篇关于栈溢出的 文章.这里做下写笔记.
调试环境windosxp,vc6.
函数入栈是从右到左的方式压入的.栈是从高地址向低地址增长的.堆则相反.
如函数:
Functio(char* param1, int param2);
{ int 函数内变量1; char 函数内变量2; ..... }
下面是具体代码
#include
<
stdio.h
>
#include < string .h >
#define SRC_BUF_SIZE 8
#define ATTACK_ADD0 (SRC_BUF_SIZE)
#define ATTACK_ADD1 (SRC_BUF_SIZE+1)
#define ATTACK_ADD2 (SRC_BUF_SIZE+2)
#define ATTACK_ADD3 (SRC_BUF_SIZE+3)
static void test( char * );
static void attack_code( void );
int main()
... {
char src_buf[SRC_BUF_SIZE] = ...{0x41,0x42,0x43,0x45,0x45,0x46,0x47,0x48};
//0x00401100就是attack_code函数的返回地址。
src_buf[ATTACK_ADD0] = 0x70;
src_buf[ATTACK_ADD1] = 0x11;
src_buf[ATTACK_ADD2] = 0x40;
src_buf[ATTACK_ADD3] = 0x00;
printf("%p ", &attack_code);
test(src_buf);
return 0;
}
static void test( char * src_buf)
... {
//如果函数内部变量的大小不是4的倍数,那么在计算返回地址时请按4的倍数地址计算
char des_buf[4];
int *p = NULL;
//用词函数是为了覆盖test函数的返回地址
strcpy(des_buf, src_buf);
}
static void attack_code( void )
... {
printf("Attack start! ");
printf("Attack code runing...! ");
}
#include < string .h >
#define SRC_BUF_SIZE 8
#define ATTACK_ADD0 (SRC_BUF_SIZE)
#define ATTACK_ADD1 (SRC_BUF_SIZE+1)
#define ATTACK_ADD2 (SRC_BUF_SIZE+2)
#define ATTACK_ADD3 (SRC_BUF_SIZE+3)
static void test( char * );
static void attack_code( void );
int main()
... {
char src_buf[SRC_BUF_SIZE] = ...{0x41,0x42,0x43,0x45,0x45,0x46,0x47,0x48};
//0x00401100就是attack_code函数的返回地址。
src_buf[ATTACK_ADD0] = 0x70;
src_buf[ATTACK_ADD1] = 0x11;
src_buf[ATTACK_ADD2] = 0x40;
src_buf[ATTACK_ADD3] = 0x00;
printf("%p ", &attack_code);
test(src_buf);
return 0;
}
static void test( char * src_buf)
... {
//如果函数内部变量的大小不是4的倍数,那么在计算返回地址时请按4的倍数地址计算
char des_buf[4];
int *p = NULL;
//用词函数是为了覆盖test函数的返回地址
strcpy(des_buf, src_buf);
}
static void attack_code( void )
... {
printf("Attack start! ");
printf("Attack code runing...! ");
}