9/24 pwn学习
知道了一次完整的pwn攻击流程,现在我们正式开始学习pwn基础知识
—————————pwn方向以 难入门 难提升著称
基础知识-C语言学习-1
由于pwn要求c语言必须掌握,所以我们先进行一段时间的的C语言学习
学习视频:浙江大学翁恺教你C语言程序设计!C语言基础入门!
做判断
if ( im < 0){im = 60 + im;ih --;
}
当im<0时,将会执行if{}里面的所有内容,如果im!<0,那么将会跳过大括号里的内容去执行后面的代码。
if(条件成立){}
if语句的格式
判断的条件
- 计算两个值之间的关系,叫做关系运算
运算符 | 意义 |
---|---|
= = | 相等 |
!= | 不想等 |
> | 大于 |
>= | 大于或等于 |
< | 小于 |
<= | 小于或等于 |
- 当两个值的关系符合关系运算符的预期时,关系运算的结果为整数1,否则为整数0
比如
printf("%d\n",5==3);
不成立,那么输出的结果就是0
优先级
- 所有的关系运算符的优先级比算术运算的低,但是比赋值运算的高
例如
printf("%d\n",7>=3+4);
输出的结果将是1
- 判断是否相等的==和!=的优先级比其他的低,而连续的关系运算是从左到右进行的
找零计算器
- 两个动作:
- 输入购买金额
- 根据支付的票面进行找零,或告知用户余额不足以购买
- 程序需要读入用户的两个输入,然后进行一些计算和判断,最后输出结果
//这是一个注释,计算机不会管它
//初始化
int price = 0;
int bill = 0;
//读入金额和票面
print("请输入金额:");
scanf("%d",price);
printf("请输入票面:");
scanf("%d",bill);
//计算找零
if ( bill >= price ) {print("应该找您:%d\n" , bill - price);
}
否则的话
接上文,如果钱不够怎么办?
- 如果程序运行,钱不够,就没有下文了,所以我们需要else
- esls = 否则的话
//这是一个注释,计算机不会管它
//初始化
int price = 0;
int bill = 0;
//读入金额和票面
printf("请输入金额:");
scanf("%d",price);
printf("请输入票面:");
scanf("%d",bill);
//计算找零
if ( bill >= price ) {print("应该找您:%d\n" , bill - price);
}else{print("你的钱不够\n");
}
return 0;
if语句再探
- 一个基本的if语句由一个关键字if开头,跟上在括号里的一个表示条件的逻辑表达式,然后是一对大括号“{}”之间的若干条语句。如果表示条件的逻辑表达式的结果不是零,那么就执行后面跟着的这对大括号中的语句,否则就跳过这些语句不执行,而继续下面的其他语句
也可以没有大括号
if(total > amout)total = amount+10;
注意第一行没有分号,没有写错
同理else也可以没有大括号,就不演示了
大括号的作用是满足条件后执行多行代码,两者是不一样的
嵌套的if-else
- 如果要求输入三个整数,输出其中最大的,应该怎么做?
当if的条件满足或者不满足的时候要执行的语句也可以是if或if-else语句,这就是嵌套的if语句
if (code == READY )if (count < 20 )printf("一切正常\n");elseprintf("继续等待\n");
return 0;
(嵌套函数示例)
else的匹配
- else总是和最近的if匹配
如果加了大括号,else的意义就发生了变化
if (code == READY ){if (count < 20 )printf("一切正常\n");
} elseprintf("继续等待\n");
return 0;
else就和最上面的if匹配,假设count是24,那么输出的结果就是0,不会进入后面那个else(有点混乱)
嵌套的if
if(gameover == 0)if(player2move == 2)print("YOUR TURN\n");
elseprint("MY TURN\n");
大括号另一个作用:确认else究竟是哪个if的
tips
- 在if或else后面总是用{}
- 即使只有一条语句的时候
今天的C语言就学到这里
NewStar pwn题目的wp
由于比赛要求,应该不能在比赛结束之前泄露解题办法,所以将在比赛结束后上传wp
不过今天也是成功写完了wp
不过学长说写的太详细了,打算下次只给个思路就好了
pwn基础知识 栈的工作原理-1
栈的工作原理的每一个基础知识,都要求背的很熟练,才有实力去做题目
程序的编译与链接
c语言和c++市场占用率很难下去,目前具有不可替代性,但是也有挑战者rust,由于出生时间晚,所以市场占有率很低,所以我们现在研究c语言和c++还大有市场
linux不能通过改后缀名来欺骗操作系统它是个什么文件,它是用文件头来识别的,linux中用file
命令来识别文件类型
我们运行的程序储存在磁盘上,运行后载入内存,在内存中与我们交互
在底层中,计算机只认识0和1,比如A,在底层保存为0100 0001,16进制可以直接作为二进制的表示码,0x41就是大写的A,换行符就是0x0A
用gcc
命令编译c语言源代码
从c源代码到可执行文件的生成过程
- 编译
- 由c语言代码生成汇编代码
- 汇编
- 由汇编代码生成机器码
- 链接
- 将多个机器码的目标文件链接成一个可执行文件
C语言代码—>汇编代码—>目标文件—>可执行文件
gcc -S
可以将源代码汇编成汇编文件
linux中执行可执行文件./文件名
(当前目录)
1. 如果我们直接vim二进制文件,就会发现全是乱码
为什么是乱码呢
因为在计算机底层编码中,只有特定的一些范围的值,是可以表示成字符的,比如ASCII码的可见范围是10-127,超出这个范围之外的值,就是乱码了
我们可以转换为二进制内容查看
太晚了,明早继续
2024/9/24 23:52