C语言基础01--初见C语言

  • A+
所属分类:安全开发

本周分享知识星球里面的二进制逆向成员,C语言基础教程,适合新手练习。这次跟大家分享其中的课程。

本文作者:kn0sky(MS08067安全实验室二进制逆向成员)




C语言基础--初见C语言




常见函数


默认情况下,main函数是C语言的起点


printf()函数是格式化输出函数 (来自stdio.h)


单行注释:/    单行内容 /


多行注释:/* 多行内容 */

使用VS2015创建项目: 


1. 新建项目


2. 依次选择vc++ ,win32  ,win32控制台程序


3.随便写个项目名称


4. 应用程序向导里选择空项目,其他默认


5. 从源文件添加新建项,创建.c文件


第一个程序:

#include<stdio.h>
int main() { printf("hello world!n"); return 0;}


程序分析


vs2015反汇编代码如下


#include<stdio.h>
int main() {
;前面这块用于保障程序稳定性,把栈抬高,然后可以随便弄,弄完再把栈还原,再把寄存器的值还原;将ebp存起来,然后把栈抬高0C0H位
00C41760 push ebp00C41761 mov ebp,esp00C41763 sub esp,0C0h;把ebx,esi,edi入栈 00C41769 push ebx00C4176A push esi00C4176B push edi
;把栈抬高的位置放到edi,然后从edi刷CCCCCCCCh
00C4176C lea edi,[ebp-0C0h]00C41772 mov ecx,30h00C41777 mov eax,0CCCCCCCCh00C4177C  rep stos  dword ptr es:[ed

;这里是直接把字符串push进去,然后调用printf,然后平栈printf("hello world!n");00C4177E  push  offset string "hello world!n" (0C46BD0h)00C41783  call  _printf (0C41316h)00C41788  add  esp,4
return 0;;等价于eax清零,比mov eax ,0效率高00C4178B  xor  eax,eax}
;把edi,esi,ebx取出来 00C4178D pop edi00C4178E pop esi00C4178F pop ebx;把栈放回去 00C41790 add esp,0C0h;比较一下栈是否还在原来的位置00C41796 cmp ebp,esp00C41798 call __RTC_CheckEsp (0C4110Eh);还原esp和ebp 00C4179D mov esp,ebp00C4179F pop ebp;函数执行结束 00C417A0  ret

先把栈抬高,清空,用完再还原,可以实现不影响以前的栈

C语言关键字: 

C语言基础01--初见C语言

C语言保留标识符: 


1. 下划线开始的标识符


2. 标准库函数名


C语言数据类型: 

#include<stdio.h>#include<stdbool.h>//C99之前没有布尔类型,要用需要通过typedef的方式自己构造 int main(){//int家族short num0; //2字节int  num1; //4字节long num2; //8字节,大部分情况下 long = int 都是4字节 long long num3;unsigned short num4;  // 无符号短整型unsigned int  num5;unsigned long  num6;
//字符char ctmp = 'A'//此处需要用单引号,双引号是字符串
//浮点型,存小数,也支持科学技术法float f1;//32位double f2;//64位long double f3;//128位
//boolbool ff = true;//1bool ft = false;//0
//指针char * pch;
//union联合体//struct结构体//enum枚举
return 0;}


C语言输入输出函数: 


输入函数:scanf("%?",temp);


输出函数:printf("%?",temp);


实例:输入输出字符串

#include<stdio.h>
int main() { int len = 0; char str1[20]; scanf("%s", str1); len = strlen(str1); printf("hello world:%s,long:%d",str1,len); return 0;}


默认情况下scanf被禁用了,因为存在安全问题,需要包含一个宏才能用:


1. 项目--属性--C/C++--预处理器--编辑


2. 把报错里说的宏复制进去


C语言命名规则: 


 由字母,数字,下划线组成

 只能以字符和下划线开头,不能用数字开头

 匈牙利命名法:变量名前+属性+类型

 下划线划分

 大驼峰命名:所有单词首字母大写

 小驼峰命名:第一个单词首字母小写,其他首字母大写

C语言运算符: 


算数运算符


C语言基础01--初见C语言


关系运算符


C语言基础01--初见C语言


逻辑运算符


C语言基础01--初见C语言


位运算符


C语言基础01--初见C语言


赋值运算符


C语言基础01--初见C语言


其他运算符


C语言基础01--初见C语言


运算符优先级


https://baike.baidu.com/item/%E8%BF%90%E7%AE%97%E7%AC%A6%E4%BC%98%E5%85%88%E 7%BA%A7/4752611#3







扫描下方二维码加入星球学习

加入后会邀请你进入内部微信群,内部微信群永久有效!

C语言基础01--初见C语言 C语言基础01--初见C语言

C语言基础01--初见C语言 C语言基础01--初见C语言

目前25000+人已关注加入我们

C语言基础01--初见C语言


本文始发于微信公众号(Ms08067安全实验室):C语言基础01--初见C语言

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: