0%

9-正向基础

正向基础

有趣的返回地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void HelloWorld()
{
printf("Hello World");
getchar();
}
void fun()
{
int arr[5]={1,2,3,4,5};
arr[6] = (int)HelloWorld;
}
int main()
{
fun();
return 0;
}

永不磨灭的Hello World

1
2
3
4
5
6
7
8
9
10
void Fun()
{
int i;
int arr[5] = {0};
for(i=0; i<=5; i++)
{
arr[i] = 0;
printf("Hello World\n");
}
}

以上两题找出原因,并解释

这个原因我就不自己测试了

第一题,arr[6]覆盖了返回地址,傻逼了,因为arr[5]就能覆盖ebp,arr[6] 肯定能覆盖返回地址啊

第二题, arr[i]覆盖了i,至于为什么先定义的能被覆盖,想想堆栈,先定义的,就是说我需要一块一个这个的内存空间,所以int i肯定是比较靠近ebp的,接下来才是arr[5],所以覆盖得到i

类型转换

movsx 先符号扩展,在传送 (有符号用)

1
2
3
4
mov al,0ff
movsx cx,al # 取al的符号位,最前面是1,所以全补1
mov al,80 # 取al符号位,全补0
movsx cx,al

movzx 先零扩展,在传送 (无符号用)

1
2
mov al,0ff
movzx cx,al #只在前面补0
1
2
3
4
5
6
void test()
{
char i = 0xff; //用movsx转换
short j = i;
int k = i;
}
1
2
3
4
5
6
void test()
{
unsigned char i = 0xff; //用movzx转换
unsigned short j = i;
unsigned int k = i;
}

大转小,利用宽度就行,想想内存中如何存值

1
2
3
4
5
6
void test()
{
int i =0x12345678;
short j = i;
char k = i;
}

0x0: 78563412 实际存储

short的话,肯定就是5678

char的话肯定就是78

有符号跟无符号相加 变成有符号

无符号跟有符号相加 变成无符号

是以自身为基准

还有一些C语言的不做笔记了,因为学过了

本文作者:NoOne
本文地址https://noonegroup.xyz/posts/78c05853/
版权声明:转载请注明出处!