讨论栈地址高低位分析:
遇到一道栈溢出的题,发现对入栈地址高低位储存还是不清晰,打算研究一下,
常见架构如 x86 和 x86-64 默认使用小端字节序。
以下基于x86 32位程序
写一个函数,将字符,数字入栈
`void __stdcall aa(char *s,int a)
{
char s1[32];
int b=0x45678912;
strcpy(s1,s);
printf("%d\n",&b);
printf("%d\n%d",&s1,&s1[1]);
}
int main()
{
int b=123456789123456789;
char* sa="aaa1234567890123456789aaa";
aa(sa,b);
}`
存
printf("%d\n",&b);
printf("%d\n%d",&s1,&s1[1]);
61是a,31是1的ascill码
说明右边是低地址左边是高地址;
对于int b=0x45678912;为小端存储。。。
回忆一下小端储存
注:0x01 00 00 04
观察栈中地址储存,发现
地址和数字一样。是小端。
但对与字符串是大端。。
所以在栈溢出时
Eip覆盖的字符串为ddee,转ascill码64与65,在栈里存储是65656464;所以地址是65656464而不是64646565.即eedd而不是ddee