[c/c++] programming之路(3)、转义字符及内存

时间:2023-03-24 08:37:20

一、转义字符

 #include<stdio.h>

 void main(){
printf("hello \nworld\a");// \n换行 \a机器响一声
getchar();//等待
}
 #include<stdio.h>

 void main(){
//printf("hello world");
putchar('h');
putchar('e');
putchar('l');
putchar('l');
putchar('o');
putchar('\n');//转义字符也是一个字符
putchar('w');
getchar();
}
 #include<stdio.h>

 void main1(){
while() putchar('\a');
putchar('A');//输出一个字符
putchar('\n');//换行
getchar();
}
void main(){
//printf("\\");//只有一个“\”会报错
//putchar('\\');
//printf("\"");
putchar('\'');
getchar();
}

二、hello world的N种做法

 #include<stdio.h>

 void hello1(){
printf("hello world");
}
void hello2(){
printf("A%sB","hello world");//hello world取代%s
}
void hello3(){
printf("%c%c%",'h','e');
}
void hello4(){
putchar('h');
putchar('e');
}
void hello5(){
putchar();//ASCLL码
putchar();
}
void notepad(){//练习:用ascll码打印notepad
putchar();
putchar();
putchar();
putchar();
putchar();
putchar();
putchar();
}
void hello6(){//按照8进制输出helloworld
putchar();//前面带0表示8进制
putchar();
putchar();
putchar();
}
void hello7(){//按照16进制输出helloworld
putchar(0x68);//前面带0x表示16进制
putchar(0x65);
putchar(0x6c);
putchar(0x6c);
}
void hello8(){//按照8进制输出helloworld
putchar('\150');//8进制的150所标志的字符
putchar('\145');// '\ddd',3位八进制代表的字符
putchar('\154');
putchar('\154');
}
void hello9(){//按照16进制输出helloworld
putchar('\x68');// '\xhh',16进制数据转换成编号,查找字符
putchar('\x65');
putchar('\x6c');
putchar('\x6c');
}
void hello10(){
puts("hello world");
} void main(){
hello10();
getchar();
}

三、打开程序的n种做法

 #include<stdio.h>
#include<stdlib.h> void main(){
//char str[50]="notepad";
char str[];
//sprintf(str,"%s%s","note","pad");
//sprintf(str,"%s","notepad");
//sprintf(str,"%c%c%c%c",'c','a','l','c');
//sprintf(str,"%c%c%c%c",99,97,108,99);
//sprintf(str,"%c%c%c%c",0143,0141,0154,0143);//8进制
//sprintf(str,"%c%c%c%c",0x63,0x61,0x6c,0x63);//16进制
//sprintf(str,"%c%c%c%c",'\143','\141','\154','\143');//8进制
sprintf(str,"%c%c%c%c",'\x63','\x61','\x6c','\x63');//16进制 printf(str);
system(str);//执行指令
system("pause");//暂停
}

四、通过内存地址改变变量的值

[c/c++] programming之路(3)、转义字符及内存

首先设置断点,进行调试

[c/c++] programming之路(3)、转义字符及内存

到达第一个断点时,打印出num变量的地址,根据地址查看到该地址存储的值为01

[c/c++] programming之路(3)、转义字符及内存

到达第二个断点,值变成了03

[c/c++] programming之路(3)、转义字符及内存

到达第三个断点,值变成了05,对其进行修改,将05改成59

[c/c++] programming之路(3)、转义字符及内存

[c/c++] programming之路(3)、转义字符及内存

16进制的59就等于10进制的89,最终打印出修改后的89,而非之前的5,这就是外挂改血量改蓝改攻击力的原理(找到需要修改数据的地址,然后对其进行修改)

五、加法改值

[c/c++] programming之路(3)、转义字符及内存

[c/c++] programming之路(3)、转义字符及内存

[c/c++] programming之路(3)、转义字符及内存

03改成09

[c/c++] programming之路(3)、转义字符及内存

[c/c++] programming之路(3)、转义字符及内存

六、打开多个程序

[c/c++] programming之路(3)、转义字符及内存

[c/c++] programming之路(3)、转义字符及内存

有的编译器一定要把变量的定义放在最前面,而不能随时定义
char str[50];这条语句需要放在前面声明