if(n % 2 == 1)
// 奇數
else
// 偶數
if(n % 2 != 0)
// 奇數
else
// 偶數
if(n % 2 == 1)
// 奇數
else
// 偶數
if(n % 2 != 0)
// 奇數
else
// 偶數
#include <stdio.h>
int main() {
printf("\n");
printf("-5 %% 2 = %d\n" , -5 % 2);
printf(" 5 %% -2 = %d\n" , 5 % -2);
return 0;
}
a = (a / b) * b + a % b
=> (a % b) = a - (a / b) * b
// a=-5, b=2
-5 % 2 = -5 - (-5 / 2) * 2
= -5 - (-2) * 2
= -5 - (-4)
= -5 + 4
= -1
// a= 5, b=-2
5 % -2 = 5 - (5 / -2) * -2
= 5 - (-2) * -2
= 5 - 4
= 1
if(n % 2 == 1)
// 奇數
else
// 偶數
if(n % 2 != 0)
// 奇數
else
// 偶數
n = -5
n % 2 = -1
-5 是偶數
n = -5
n % 2 = -1
-5 是奇數
int a = -1, b = 1, c;
c = a+++b;
printf("a, b, c = %d, %d, %d\n", a, b, c);
int a = -1, b = 1, c;
c = a+++b;
printf("a, b, c = %d, %d, %d\n", a, b, c);
int a = -1, b = 1, c;
c = a+++b;
printf("a, b, c = %d, %d, %d\n", a, b, c);
#include <stdio.h>
int main()
{
for(int i=1;0<i<10;i++){
printf("NISRA");
}
return 0;
}
#include <stdio.h>
int main()
{
for(int i=1;0<i<10;i++){
printf("NISRA");
}
return 0;
}
第一次迴圈:i=1 → (0<i)=1 → 1<10
第二次迴圈:i=2 → (0<i)=1 → 1<10
.......
#include <stdio.h>
int main()
{
int a = 10, b = 20, c = 30;
if (c > b > a)
printf("True\n");
else
printf("False\n");
}
c > b > a
(c > b) > a (30>20)>a 1 > a
1 > 30 0
先來個簡單的lab
使用for-loop印出右圖
#include <stdio.h>
int main()
{
for(int i = 9; i >= 0; i--){
printf("%d\n",i);
}
}
1
2
4
3
#include <stdio.h>
int main()
{
for(int i = 10; 0 <= --i;){
printf("%d\n",i);
}
}
#include <stdio.h>
int main()
{
for(int i = 10;i-->0;){
printf("%d\n",i);
}
}
#include <stdio.h>
int main()
{
for(int i = 10; 0 <= ~~ --i;){
printf("%d\n",i);
}
}
再來個簡單的lab
使用for-loop印出右圖
再來個簡單的lab
使用for-loop印出右圖
#include <stdio.h>
int main()
{
for (int i = 10, j = 0; i > 0 && j < 10; i--, j++){
printf("%d %d\n",i,j);
}
}
int x=0;
int getNum(){
int x=1214;
{
return x;
}
}
○ 由下而上,由內而外,遇到的第一個
int x=0;
int getNum(){
int x=1214;
{
return x;
}
}
int x=0;
int getNum(){
int x=1214;
{
extern int x;
return x;
}
}
○ 使用 extern
int x=0;
int getNum(){
int x=1214;
{
extern int x;
return x;
}
}
int main(){
{
int x=0;
}
printf("%d\n",x);
}
○ 如果不小心在變數沒有定義的區域使用的話...
int main(){
{
int x=0;
}
printf("%d\n",x);
}
#include <stdio.h>
int main()
{
unsigned int random, key = 0;
random = rand();
printf("Give secret number: ");
scanf("%d", &key);
if( (key ^ random) == 0xdeadbeef ){
printf("You got it!!\n");
return 0;
}
printf("No, keep trying.\n");
return 0;
}
#include <stdio.h>
int main()
{
unsigned int random, key = 0;
random = rand();
printf("Give secret number: ");
scanf("%d", &key);
if( (key ^ random) == 0xdeadbeef ){
printf("You got it!!\n");
return 0;
}
printf("No, keep trying.\n");
return 0;
}
提示:
A ^ B = C
A = B ^ C
int main(){
for(int i=0;i<10;i++){
printf("%u\n",rand());
}
}
int main(){
for(int i=0;i<10;i++){
printf("%u\n",rand());
}
}
○ 加上srand(time(NULL)); 初始化
#include <stdio.h>
int main()
{
unsigned int random, key = 0;
srand(time(NULL));
random = rand();
printf("Give secret number: ");
scanf("%d", &key);
if( (key ^ random) == 0xdeadbeef ){
printf("You got it!!\n");
return 0;
}
printf("No, keep trying.\n");
}
key ^ random = 0xdeadbeef;
key = random ^ 0xdeadbeef;
#include <stdio.h>
int main()
{
unsigned int random, key = 0;
random = rand();
printf("key= %d\n",41^ 0xdeadbeef);
printf("Give secret number: ");
scanf("%d", &key);
if( (key ^ random) == 0xdeadbeef ){
printf("You got it!!\n");
return 0;
}
printf("No, keep trying.\n");
return 0;
}
key ^ random = 0xdeadbeef;
key = random ^ 0xdeadbeef;
#include <stdio.h>
int main()
{
unsigned int random, key = 0;
random = rand();
printf("key= %d\n",random^ 0xdeadbeef);
printf("Give secret number: ");
scanf("%d", &key);
if( (key ^ random) == 0xdeadbeef ){
printf("You got it!!\n");
return 0;
}
printf("No, keep trying.\n");
return 0;
}
while(1){
/* Do something */
}
for(i = 0 ; i < 10 ; i++){
/* Do something */
}
while(1)
{
/* Do something */
}
for(i = 0 ; i < 10 ; i++)
{
/* Do something */
}
寫扣得交作業都來不及了誰還會想到安全問題
在不改動程式碼的前提
輸入 input
印出 "Yes you pass it!"
#include <stdio.h>
#include <string.h>
int main()
{
char pwd[8] = "NISRA";
char input[8];
printf("Give me some input: ");
scanf("%s", input);
if (strcmp(pwd, "admin") == 0)
printf("Yes you pass it!\n\n");
else
printf("No, keep trying.\n\n");
return 0;
}
先來看看下一頁的程式碼有什麼問題
#include <stdio.h>
#include <string.h>
int main()
{
char input[10];
printf("Give me some input: ");
scanf("%s", input);
printf("%s\n", input);
return 0;
}
#include <stdio.h>
#include <string.h>
int main()
{
char input[10];
printf("Give me some input: ");
scanf("%s", input);
printf("%s\n", input);
return 0;
}
沒有限制輸入長度
#include <stdio.h>
#include <string.h>
int main()
{
char input[10];
printf("Give me some input: ");
scanf("%9s", input);
printf("%s\n", input);
return 0;
}
為什麼是9
#include <stdio.h>
#include <string.h>
int main()
{
char input[10];
printf("Give me some input: ");
scanf("%9s", input);
printf("%s\n", input);
return 0;
}
系統保留
區域變數
動態分配
程式全域變數
程式碼
高位址
低位址
系統保留
區域變數
動態分配
程式全域變數
程式碼
系統保留
區域變數
動態分配
程式全域變數
程式碼
系統保留
區域變數
動態分配
程式全域變數
程式碼
系統保留
區域變數
動態分配
程式全域變數
程式碼
系統保留
區域變數
動態分配
程式全域變數
程式碼
系統保留
區域變數
動態分配
程式全域變數
程式碼
#include <stdio.h>
int global = 87; // data
int main()
{
int a = 10; // stack
}
EBP
ESP
EIP
高位址
低位址
#include <stdio.h>
#include <string.h>
int main()
{
char pwd[8] = "NISRA";
char input[8];
printf("Give me some input: ");
scanf("%s", input);
if (strcmp(pwd, "admin") == 0)
printf("Yes you pass it!\n\n");
else
printf("No, keep trying.\n\n");
return 0;
}
index | value |
---|---|
EBP+0x8 | ... |
EBP+0x4 | ... |
EBP | ???? |
EBP-0x4 | ???? |
EBP-0x8 | ???? |
EBP-0xC | ???? |
EBP-0x10 | ???? |
EIP
#include <stdio.h>
#include <string.h>
int main()
{
char pwd[8] = "NISRA";
char input[8];
printf("Give me some input: ");
scanf("%s", input);
if (strcmp(pwd, "admin") == 0)
printf("Yes you pass it!\n\n");
else
printf("No, keep trying.\n\n");
return 0;
}
index | value |
---|---|
EBP+0x8 | ... |
EBP+0x4 | ... |
EBP | EBP |
EBP-0x4 | ???? |
EBP-0x8 | ???? |
EBP-0xC | ???? |
EBP-0x10 | ???? |
EIP
#include <stdio.h>
#include <string.h>
int main()
{
char pwd[8] = "NISRA";
char input[8];
printf("Give me some input: ");
scanf("%s", input);
if (strcmp(pwd, "admin") == 0)
printf("Yes you pass it!\n\n");
else
printf("No, keep trying.\n\n");
return 0;
}
index | value |
---|---|
EBP+0x8 | ... |
EBP+0x4 | ... |
EBP | EBP |
EBP-0x4 | 0x 00000041 |
EBP-0x8 | 0x 5253494E |
EBP-0xC | ???? |
EBP-0x10 | ???? |
EIP
#include <stdio.h>
#include <string.h>
int main()
{
char pwd[8] = "NISRA";
char input[8];
printf("Give me some input: ");
scanf("%s", input);
if (strcmp(pwd, "admin") == 0)
printf("Yes you pass it!\n\n");
else
printf("No, keep trying.\n\n");
return 0;
}
index | value |
---|---|
EBP+0x8 | ... |
EBP+0x4 | ... |
EBP | EBP |
EBP-0x4 | \x00\x00\x00A |
EBP-0x8 | RSIN |
EBP-0xC | ???? |
EBP-0x10 | ???? |
EIP
#include <stdio.h>
#include <string.h>
int main()
{
char pwd[8] = "NISRA";
char input[8];
printf("Give me some input: ");
scanf("%s", input);
if (strcmp(pwd, "admin") == 0)
printf("Yes you pass it!\n\n");
else
printf("No, keep trying.\n\n");
return 0;
}
index | value |
---|---|
EBP+0x8 | ... |
EBP+0x4 | ... |
EBP | EBP |
EBP-0x4 | \x00\x00\x00A |
EBP-0x8 | RSIN |
EBP-0xC | ???? |
EBP-0x10 | ???? |
EIP
e.g. 0x12345678
低位址
高位址
#include <stdio.h>
#include <string.h>
int main()
{
char pwd[8] = "NISRA";
char input[8];
printf("Give me some input: ");
scanf("%s", input);
if (strcmp(pwd, "admin") == 0)
printf("Yes you pass it!\n\n");
else
printf("No, keep trying.\n\n");
return 0;
}
index | value |
---|---|
EBP+0x8 | ... |
EBP+0x4 | ... |
EBP | EBP |
EBP-0x4 | \x00\x00\x00A |
EBP-0x8 | RSIN |
EBP-0xC | ???? |
EBP-0x10 | ???? |
EIP
#include <stdio.h>
#include <string.h>
int main()
{
char pwd[8] = "NISRA";
char input[8];
printf("Give me some input: ");
scanf("%s", input);
if (strcmp(pwd, "admin") == 0)
printf("Yes you pass it!\n\n");
else
printf("No, keep trying.\n\n");
return 0;
}
index | value |
---|---|
EBP+0x8 | ... |
EBP+0x4 | ... |
EBP | EBP |
EBP-0x4 | \x00\x00\x00A |
EBP-0x8 | RSIN |
EBP-0xC | bbbb |
EBP-0x10 | aaaa |
EIP
#include <stdio.h>
#include <string.h>
int main()
{
char pwd[8] = "NISRA";
char input[8];
printf("Give me some input: ");
scanf("%s", input);
if (strcmp(pwd, "admin") == 0)
printf("Yes you pass it!\n\n");
else
printf("No, keep trying.\n\n");
return 0;
}
index | value |
---|---|
EBP+0x8 | ... |
EBP+0x4 | ... |
EBP | EBP |
EBP-0x4 | \x00\x00\x00n |
EBP-0x8 | imda |
EBP-0xC | bbbb |
EBP-0x10 | aaaa |
EIP
#include <stdio.h>
#include <string.h>
int main()
{
char pwd[8] = "NISRA";
char input[8];
printf("Give me some input: ");
scanf("%s", input);
if (strcmp(pwd, "admin") == 0)
printf("Yes you pass it!\n\n");
else
printf("No, keep trying.\n\n");
return 0;
}
index | value |
---|---|
EBP+0x8 | ... |
EBP+0x4 | ... |
EBP | EBP |
EBP-0x4 | \x00\x00\x00n |
EBP-0x8 | imda |
EBP-0xC | bbbb |
EBP-0x10 | aaaa |
EIP