滴水逆向学习笔记

滴水逆向学习笔记

十一月 25, 2022

指针1:
1,带有*的变量类型的标准写法,变量类型星号 变量名
2,任何类型都可以带 星号,带上星号以后是新的类型
3,星号可以任意多个
4,带星号类型的宽度始终是4个字节
5,赋值要转型
char:一个字节;short:两个字节;int:四个字节
局部变量,不到四个字节,都是按照四个字节分的
在这里插入图片描述

此时的a++,b++,c++,得出的结果都是104,而去掉一个星号时,也就是char* a,结果却是 101,102,104.是因为判断++的时候是根据自身宽度类型+的。一个星号的时候就是char short int,两个星号的时候,就是带星号类型,宽度始终为4字节。

在这里插入图片描述

结果是105,110,120;加上类型宽度x5
减法一样
不能乘除(编译器决定的)

在这里插入图片描述

结果是25(只有相同类型才能相减);结果除自身宽度

二:
&:地址符。类型是其后面加一个星号,任何变量都可以使用&来获取地址,但不能用在常量上
int

1
2
3
4
int a;
&a;得到的是a变量的地址,其类型是 int*
如:int ***x=(int***)10
int ****y=&x

每多一个星号就是多了四个字节
在这里插入图片描述
星号px(带星的)给x1的是px里面存储的值,不像&,给的是地址
在这里插入图片描述

①把10这个值给到了ebp-4这个地址里面(值放地址里
②把ebp-4的地址给到了eax的值里面(值的地址放值里
③eax的值给到了ebp-8的地址里(又是“值”【但这次是地址】放地址里
④ebp-8的地址给到ecx的值里(又是“值”的地址放值里
关键:⑤ecx里面地址指向的值给edx的值里(变成了值,不是地址了,edx里面是0A
⑥edx的值给ebp-0c的地址里(给了值,也就是0A

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
void main(){
char arr[5] = {1,2,3,4,5};

char* p = arr;

for(short i=0;i<5;i++)
{

printf("%d\n",*(p+i));

}
return 0;
}
*(p+i):地址的遍历,每次都是+ix1
如果换个类型
void main(){
short arr[5] = {1,2,3,4,5};

short* p = arr;

for(short i=0;i<5;i++)
{

printf("%d\n",*(p+i));

}
return 0;
}
*(p+i):是p+ix2,for循环不需要进行改变

CE:

在这里插入图片描述
黑的:可能在堆里,是局部变量(地址可能会发生变化)
绿的:基址,全局变量(地址不会变化)
内存中,高位低位是反着的,小端存储

内存寻址:

一个字节遍历;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>

char data[20] = {
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
0x0A,0x0B,0x64,0x0C,0x0D,0x0E,0x0F,0x01,0x02,0x03
};
void FindBloodAddr(){
char p = data;

//printf("%x\n",p);

for(int i=0;i<10;i++){
if(*(p+i) == 0x64)
{
printf("%x\n",*(p+i));//带星号是去地址指向的值,不带是值
}
}
}
void main(){
FindBloodAddr();
return 0;
}

两个字节遍历:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>

char data[20] = {
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
0x0A,0x0B,0x64,0x0C,0x0D,0x0E,0x0F,0x01,0x02,0x03
};
void FindBloodAddr(){
short* p = (short*)data;

//printf("%x\n",p);



for(int i=0;i<10;i++){
//if(*(p+i) == 0x64)
//{
printf("%x\n",*(p+i));
//}

}
}
void main(){
FindBloodAddr();
return 0;
}

四个字节遍历:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>

char data[20] = {
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
0x0A,0x0B,0x64,0x0C,0x0D,0x0E,0x0F,0x01,0x02,0x03
};
void FindBloodAddr(){
int* p = (int*)data;

//printf("%x\n",p);



for(int i=0;i<10;i++){
//if(*(p+i) == 0x64)
//{
printf("%x\n",*(p+i));
//}

}
}
void main(){
FindBloodAddr();
return 0;
}

以自己的理解写了一个内存寻址的逐个多字节遍历:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>

char data[20] = {
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
0x0A,0x0B,0x64,0x0C,0x0D,0x0E,0x0F,0x01,0x02,0x03
};
void FindBloodAddr(){
short* p = (short*)data;
char* q = data;
//printf("%x\n",p);

for(int i=0;i<20;i++){
q = data + i;
int j=0;

p = q ;
if(j<5)
{
// if(*(p+j) == 0x100){
printf("%x\n",*(p+j));
// }
j++;
}

}
}
void main(){
FindBloodAddr();
return 0;
}

内存分布:

在这里插入图片描述
这个变量(len)定义到函数里面,空间是在栈里分,如果定义到函数外面,则会在全局变量里分
在这里插入图片描述