From 78c0ec2b8377f5624bb69992a30ecde6c355f545 Mon Sep 17 00:00:00 2001 From: <> Date: Sun, 9 Jul 2023 05:07:56 +0000 Subject: [PATCH] Deployed af20b98 with MkDocs version: 1.4.3 --- .nojekyll | 0 404.html | 543 ++ CNAME | 1 + assets/images/favicon.png | Bin 0 -> 1870 bytes assets/javascripts/bundle.220ee61c.min.js | 29 + assets/javascripts/bundle.220ee61c.min.js.map | 8 + assets/javascripts/lunr/min/lunr.ar.min.js | 1 + assets/javascripts/lunr/min/lunr.da.min.js | 18 + assets/javascripts/lunr/min/lunr.de.min.js | 18 + assets/javascripts/lunr/min/lunr.du.min.js | 18 + assets/javascripts/lunr/min/lunr.es.min.js | 18 + assets/javascripts/lunr/min/lunr.fi.min.js | 18 + assets/javascripts/lunr/min/lunr.fr.min.js | 18 + assets/javascripts/lunr/min/lunr.hi.min.js | 1 + assets/javascripts/lunr/min/lunr.hu.min.js | 18 + assets/javascripts/lunr/min/lunr.hy.min.js | 1 + assets/javascripts/lunr/min/lunr.it.min.js | 18 + assets/javascripts/lunr/min/lunr.ja.min.js | 1 + assets/javascripts/lunr/min/lunr.jp.min.js | 1 + assets/javascripts/lunr/min/lunr.kn.min.js | 1 + assets/javascripts/lunr/min/lunr.ko.min.js | 1 + assets/javascripts/lunr/min/lunr.multi.min.js | 1 + assets/javascripts/lunr/min/lunr.nl.min.js | 18 + assets/javascripts/lunr/min/lunr.no.min.js | 18 + assets/javascripts/lunr/min/lunr.pt.min.js | 18 + assets/javascripts/lunr/min/lunr.ro.min.js | 18 + assets/javascripts/lunr/min/lunr.ru.min.js | 18 + assets/javascripts/lunr/min/lunr.sa.min.js | 1 + .../lunr/min/lunr.stemmer.support.min.js | 1 + assets/javascripts/lunr/min/lunr.sv.min.js | 18 + assets/javascripts/lunr/min/lunr.ta.min.js | 1 + assets/javascripts/lunr/min/lunr.te.min.js | 1 + assets/javascripts/lunr/min/lunr.th.min.js | 1 + assets/javascripts/lunr/min/lunr.tr.min.js | 18 + assets/javascripts/lunr/min/lunr.vi.min.js | 1 + assets/javascripts/lunr/min/lunr.zh.min.js | 1 + assets/javascripts/lunr/tinyseg.js | 206 + assets/javascripts/lunr/wordcut.js | 6708 +++++++++++++++++ .../workers/search.74e28a9f.min.js | 42 + .../workers/search.74e28a9f.min.js.map | 8 + assets/stylesheets/main.26e3688c.min.css | 1 + assets/stylesheets/main.26e3688c.min.css.map | 1 + assets/stylesheets/palette.ecc896b0.min.css | 1 + .../stylesheets/palette.ecc896b0.min.css.map | 1 + css/custom.css | 46 + css/heti.css | 31 + images/cyberchef_encoding.png | Bin 0 -> 234454 bytes images/icon.png | Bin 0 -> 139113 bytes images/tool_pic_ghidra.png | Bin 0 -> 81690 bytes images/tool_pic_ida.png | Bin 0 -> 258533 bytes images/vscode_encoding.png | Bin 0 -> 28483 bytes index.html | 338 + intro/lab0/index.html | 640 ++ intro/misc-lab1/index.html | 593 ++ intro/pwn-lab1/index.html | 399 + intro/rev-lab1/index.html | 373 + intro/tools/index.html | 374 + intro/web-lab1/index.html | 337 + js/katex.js | 39 + search/search_index.json | 1 + sitemap.xml | 38 + sitemap.xml.gz | Bin 0 -> 251 bytes 62 files changed, 11043 insertions(+) create mode 100644 .nojekyll create mode 100644 404.html create mode 100644 CNAME create mode 100644 assets/images/favicon.png create mode 100644 assets/javascripts/bundle.220ee61c.min.js create mode 100644 assets/javascripts/bundle.220ee61c.min.js.map create mode 100644 assets/javascripts/lunr/min/lunr.ar.min.js create mode 100644 assets/javascripts/lunr/min/lunr.da.min.js create mode 100644 assets/javascripts/lunr/min/lunr.de.min.js create mode 100644 assets/javascripts/lunr/min/lunr.du.min.js create mode 100644 assets/javascripts/lunr/min/lunr.es.min.js create mode 100644 assets/javascripts/lunr/min/lunr.fi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.fr.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hu.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hy.min.js create mode 100644 assets/javascripts/lunr/min/lunr.it.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ja.min.js create mode 100644 assets/javascripts/lunr/min/lunr.jp.min.js create mode 100644 assets/javascripts/lunr/min/lunr.kn.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ko.min.js create mode 100644 assets/javascripts/lunr/min/lunr.multi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.nl.min.js create mode 100644 assets/javascripts/lunr/min/lunr.no.min.js create mode 100644 assets/javascripts/lunr/min/lunr.pt.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ro.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ru.min.js create mode 100644 assets/javascripts/lunr/min/lunr.sa.min.js create mode 100644 assets/javascripts/lunr/min/lunr.stemmer.support.min.js create mode 100644 assets/javascripts/lunr/min/lunr.sv.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ta.min.js create mode 100644 assets/javascripts/lunr/min/lunr.te.min.js create mode 100644 assets/javascripts/lunr/min/lunr.th.min.js create mode 100644 assets/javascripts/lunr/min/lunr.tr.min.js create mode 100644 assets/javascripts/lunr/min/lunr.vi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.zh.min.js create mode 100644 assets/javascripts/lunr/tinyseg.js create mode 100644 assets/javascripts/lunr/wordcut.js create mode 100644 assets/javascripts/workers/search.74e28a9f.min.js create mode 100644 assets/javascripts/workers/search.74e28a9f.min.js.map create mode 100644 assets/stylesheets/main.26e3688c.min.css create mode 100644 assets/stylesheets/main.26e3688c.min.css.map create mode 100644 assets/stylesheets/palette.ecc896b0.min.css create mode 100644 assets/stylesheets/palette.ecc896b0.min.css.map create mode 100644 css/custom.css create mode 100644 css/heti.css create mode 100644 images/cyberchef_encoding.png create mode 100644 images/icon.png create mode 100644 images/tool_pic_ghidra.png create mode 100644 images/tool_pic_ida.png create mode 100644 images/vscode_encoding.png create mode 100644 index.html create mode 100644 intro/lab0/index.html create mode 100644 intro/misc-lab1/index.html create mode 100644 intro/pwn-lab1/index.html create mode 100644 intro/rev-lab1/index.html create mode 100644 intro/tools/index.html create mode 100644 intro/web-lab1/index.html create mode 100644 js/katex.js create mode 100644 search/search_index.json create mode 100644 sitemap.xml create mode 100644 sitemap.xml.gz diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/404.html b/404.html new file mode 100644 index 0000000..a61cdce --- /dev/null +++ b/404.html @@ -0,0 +1,543 @@ + + + + + + + + + + + + + + + + + + CTF101-Labs-2023 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ +

404 - Not found

+ +
+
+ + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CNAME b/CNAME new file mode 100644 index 0000000..e9591db --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +courses.zjusec.com \ No newline at end of file diff --git a/assets/images/favicon.png b/assets/images/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..1cf13b9f9d978896599290a74f77d5dbe7d1655c GIT binary patch literal 1870 zcmV-U2eJ5xP)Gc)JR9QMau)O=X#!i9;T z37kk-upj^(fsR36MHs_+1RCI)NNu9}lD0S{B^g8PN?Ww(5|~L#Ng*g{WsqleV}|#l zz8@ri&cTzw_h33bHI+12+kK6WN$h#n5cD8OQt`5kw6p~9H3()bUQ8OS4Q4HTQ=1Ol z_JAocz`fLbT2^{`8n~UAo=#AUOf=SOq4pYkt;XbC&f#7lb$*7=$na!mWCQ`dBQsO0 zLFBSPj*N?#u5&pf2t4XjEGH|=pPQ8xh7tpx;US5Cx_Ju;!O`ya-yF`)b%TEt5>eP1ZX~}sjjA%FJF?h7cX8=b!DZl<6%Cv z*G0uvvU+vmnpLZ2paivG-(cd*y3$hCIcsZcYOGh{$&)A6*XX&kXZd3G8m)G$Zz-LV z^GF3VAW^Mdv!)4OM8EgqRiz~*Cji;uzl2uC9^=8I84vNp;ltJ|q-*uQwGp2ma6cY7 z;`%`!9UXO@fr&Ebapfs34OmS9^u6$)bJxrucutf>`dKPKT%%*d3XlFVKunp9 zasduxjrjs>f8V=D|J=XNZp;_Zy^WgQ$9WDjgY=z@stwiEBm9u5*|34&1Na8BMjjgf3+SHcr`5~>oz1Y?SW^=K z^bTyO6>Gar#P_W2gEMwq)ot3; zREHn~U&Dp0l6YT0&k-wLwYjb?5zGK`W6S2v+K>AM(95m2C20L|3m~rN8dprPr@t)5lsk9Hu*W z?pS990s;Ez=+Rj{x7p``4>+c0G5^pYnB1^!TL=(?HLHZ+HicG{~4F1d^5Awl_2!1jICM-!9eoLhbbT^;yHcefyTAaqRcY zmuctDopPT!%k+}x%lZRKnzykr2}}XfG_ne?nRQO~?%hkzo;@RN{P6o`&mMUWBYMTe z6i8ChtjX&gXl`nvrU>jah)2iNM%JdjqoaeaU%yVn!^70x-flljp6Q5tK}5}&X8&&G zX3fpb3E(!rH=zVI_9Gjl45w@{(ITqngWFe7@9{mX;tO25Z_8 zQHEpI+FkTU#4xu>RkN>b3Tnc3UpWzPXWm#o55GKF09j^Mh~)K7{QqbO_~(@CVq! zS<8954|P8mXN2MRs86xZ&Q4EfM@JB94b=(YGuk)s&^jiSF=t3*oNK3`rD{H`yQ?d; ztE=laAUoZx5?RC8*WKOj`%LXEkgDd>&^Q4M^z`%u0rg-It=hLCVsq!Z%^6eB-OvOT zFZ28TN&cRmgU}Elrnk43)!>Z1FCPL2K$7}gwzIc48NX}#!A1BpJP?#v5wkNprhV** z?Cpalt1oH&{r!o3eSKc&ap)iz2BTn_VV`4>9M^b3;(YY}4>#ML6{~(4mH+?%07*qo IM6N<$f(jP3KmY&$ literal 0 HcmV?d00001 diff --git a/assets/javascripts/bundle.220ee61c.min.js b/assets/javascripts/bundle.220ee61c.min.js new file mode 100644 index 0000000..116072a --- /dev/null +++ b/assets/javascripts/bundle.220ee61c.min.js @@ -0,0 +1,29 @@ +"use strict";(()=>{var Ci=Object.create;var gr=Object.defineProperty;var Ri=Object.getOwnPropertyDescriptor;var ki=Object.getOwnPropertyNames,Ht=Object.getOwnPropertySymbols,Hi=Object.getPrototypeOf,yr=Object.prototype.hasOwnProperty,nn=Object.prototype.propertyIsEnumerable;var rn=(e,t,r)=>t in e?gr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,P=(e,t)=>{for(var r in t||(t={}))yr.call(t,r)&&rn(e,r,t[r]);if(Ht)for(var r of Ht(t))nn.call(t,r)&&rn(e,r,t[r]);return e};var on=(e,t)=>{var r={};for(var n in e)yr.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(e!=null&&Ht)for(var n of Ht(e))t.indexOf(n)<0&&nn.call(e,n)&&(r[n]=e[n]);return r};var Pt=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Pi=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of ki(t))!yr.call(e,o)&&o!==r&&gr(e,o,{get:()=>t[o],enumerable:!(n=Ri(t,o))||n.enumerable});return e};var yt=(e,t,r)=>(r=e!=null?Ci(Hi(e)):{},Pi(t||!e||!e.__esModule?gr(r,"default",{value:e,enumerable:!0}):r,e));var sn=Pt((xr,an)=>{(function(e,t){typeof xr=="object"&&typeof an!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(xr,function(){"use strict";function e(r){var n=!0,o=!1,i=null,s={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function a(O){return!!(O&&O!==document&&O.nodeName!=="HTML"&&O.nodeName!=="BODY"&&"classList"in O&&"contains"in O.classList)}function f(O){var Qe=O.type,De=O.tagName;return!!(De==="INPUT"&&s[Qe]&&!O.readOnly||De==="TEXTAREA"&&!O.readOnly||O.isContentEditable)}function c(O){O.classList.contains("focus-visible")||(O.classList.add("focus-visible"),O.setAttribute("data-focus-visible-added",""))}function u(O){O.hasAttribute("data-focus-visible-added")&&(O.classList.remove("focus-visible"),O.removeAttribute("data-focus-visible-added"))}function p(O){O.metaKey||O.altKey||O.ctrlKey||(a(r.activeElement)&&c(r.activeElement),n=!0)}function m(O){n=!1}function d(O){a(O.target)&&(n||f(O.target))&&c(O.target)}function h(O){a(O.target)&&(O.target.classList.contains("focus-visible")||O.target.hasAttribute("data-focus-visible-added"))&&(o=!0,window.clearTimeout(i),i=window.setTimeout(function(){o=!1},100),u(O.target))}function v(O){document.visibilityState==="hidden"&&(o&&(n=!0),Y())}function Y(){document.addEventListener("mousemove",N),document.addEventListener("mousedown",N),document.addEventListener("mouseup",N),document.addEventListener("pointermove",N),document.addEventListener("pointerdown",N),document.addEventListener("pointerup",N),document.addEventListener("touchmove",N),document.addEventListener("touchstart",N),document.addEventListener("touchend",N)}function B(){document.removeEventListener("mousemove",N),document.removeEventListener("mousedown",N),document.removeEventListener("mouseup",N),document.removeEventListener("pointermove",N),document.removeEventListener("pointerdown",N),document.removeEventListener("pointerup",N),document.removeEventListener("touchmove",N),document.removeEventListener("touchstart",N),document.removeEventListener("touchend",N)}function N(O){O.target.nodeName&&O.target.nodeName.toLowerCase()==="html"||(n=!1,B())}document.addEventListener("keydown",p,!0),document.addEventListener("mousedown",m,!0),document.addEventListener("pointerdown",m,!0),document.addEventListener("touchstart",m,!0),document.addEventListener("visibilitychange",v,!0),Y(),r.addEventListener("focus",d,!0),r.addEventListener("blur",h,!0),r.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&r.host?r.host.setAttribute("data-js-focus-visible",""):r.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if(typeof window!="undefined"&&typeof document!="undefined"){window.applyFocusVisiblePolyfill=e;var t;try{t=new CustomEvent("focus-visible-polyfill-ready")}catch(r){t=document.createEvent("CustomEvent"),t.initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(t)}typeof document!="undefined"&&e(document)})});var cn=Pt(Er=>{(function(e){var t=function(){try{return!!Symbol.iterator}catch(c){return!1}},r=t(),n=function(c){var u={next:function(){var p=c.shift();return{done:p===void 0,value:p}}};return r&&(u[Symbol.iterator]=function(){return u}),u},o=function(c){return encodeURIComponent(c).replace(/%20/g,"+")},i=function(c){return decodeURIComponent(String(c).replace(/\+/g," "))},s=function(){var c=function(p){Object.defineProperty(this,"_entries",{writable:!0,value:{}});var m=typeof p;if(m!=="undefined")if(m==="string")p!==""&&this._fromString(p);else if(p instanceof c){var d=this;p.forEach(function(B,N){d.append(N,B)})}else if(p!==null&&m==="object")if(Object.prototype.toString.call(p)==="[object Array]")for(var h=0;hd[0]?1:0}),c._entries&&(c._entries={});for(var p=0;p1?i(d[1]):"")}})})(typeof global!="undefined"?global:typeof window!="undefined"?window:typeof self!="undefined"?self:Er);(function(e){var t=function(){try{var o=new e.URL("b","http://a");return o.pathname="c d",o.href==="http://a/c%20d"&&o.searchParams}catch(i){return!1}},r=function(){var o=e.URL,i=function(f,c){typeof f!="string"&&(f=String(f)),c&&typeof c!="string"&&(c=String(c));var u=document,p;if(c&&(e.location===void 0||c!==e.location.href)){c=c.toLowerCase(),u=document.implementation.createHTMLDocument(""),p=u.createElement("base"),p.href=c,u.head.appendChild(p);try{if(p.href.indexOf(c)!==0)throw new Error(p.href)}catch(O){throw new Error("URL unable to set base "+c+" due to "+O)}}var m=u.createElement("a");m.href=f,p&&(u.body.appendChild(m),m.href=m.href);var d=u.createElement("input");if(d.type="url",d.value=f,m.protocol===":"||!/:/.test(m.href)||!d.checkValidity()&&!c)throw new TypeError("Invalid URL");Object.defineProperty(this,"_anchorElement",{value:m});var h=new e.URLSearchParams(this.search),v=!0,Y=!0,B=this;["append","delete","set"].forEach(function(O){var Qe=h[O];h[O]=function(){Qe.apply(h,arguments),v&&(Y=!1,B.search=h.toString(),Y=!0)}}),Object.defineProperty(this,"searchParams",{value:h,enumerable:!0});var N=void 0;Object.defineProperty(this,"_updateSearchParams",{enumerable:!1,configurable:!1,writable:!1,value:function(){this.search!==N&&(N=this.search,Y&&(v=!1,this.searchParams._fromString(this.search),v=!0))}})},s=i.prototype,a=function(f){Object.defineProperty(s,f,{get:function(){return this._anchorElement[f]},set:function(c){this._anchorElement[f]=c},enumerable:!0})};["hash","host","hostname","port","protocol"].forEach(function(f){a(f)}),Object.defineProperty(s,"search",{get:function(){return this._anchorElement.search},set:function(f){this._anchorElement.search=f,this._updateSearchParams()},enumerable:!0}),Object.defineProperties(s,{toString:{get:function(){var f=this;return function(){return f.href}}},href:{get:function(){return this._anchorElement.href.replace(/\?$/,"")},set:function(f){this._anchorElement.href=f,this._updateSearchParams()},enumerable:!0},pathname:{get:function(){return this._anchorElement.pathname.replace(/(^\/?)/,"/")},set:function(f){this._anchorElement.pathname=f},enumerable:!0},origin:{get:function(){var f={"http:":80,"https:":443,"ftp:":21}[this._anchorElement.protocol],c=this._anchorElement.port!=f&&this._anchorElement.port!=="";return this._anchorElement.protocol+"//"+this._anchorElement.hostname+(c?":"+this._anchorElement.port:"")},enumerable:!0},password:{get:function(){return""},set:function(f){},enumerable:!0},username:{get:function(){return""},set:function(f){},enumerable:!0}}),i.createObjectURL=function(f){return o.createObjectURL.apply(o,arguments)},i.revokeObjectURL=function(f){return o.revokeObjectURL.apply(o,arguments)},e.URL=i};if(t()||r(),e.location!==void 0&&!("origin"in e.location)){var n=function(){return e.location.protocol+"//"+e.location.hostname+(e.location.port?":"+e.location.port:"")};try{Object.defineProperty(e.location,"origin",{get:n,enumerable:!0})}catch(o){setInterval(function(){e.location.origin=n()},100)}}})(typeof global!="undefined"?global:typeof window!="undefined"?window:typeof self!="undefined"?self:Er)});var qr=Pt((Mt,Nr)=>{/*! + * clipboard.js v2.0.11 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */(function(t,r){typeof Mt=="object"&&typeof Nr=="object"?Nr.exports=r():typeof define=="function"&&define.amd?define([],r):typeof Mt=="object"?Mt.ClipboardJS=r():t.ClipboardJS=r()})(Mt,function(){return function(){var e={686:function(n,o,i){"use strict";i.d(o,{default:function(){return Ai}});var s=i(279),a=i.n(s),f=i(370),c=i.n(f),u=i(817),p=i.n(u);function m(j){try{return document.execCommand(j)}catch(T){return!1}}var d=function(T){var E=p()(T);return m("cut"),E},h=d;function v(j){var T=document.documentElement.getAttribute("dir")==="rtl",E=document.createElement("textarea");E.style.fontSize="12pt",E.style.border="0",E.style.padding="0",E.style.margin="0",E.style.position="absolute",E.style[T?"right":"left"]="-9999px";var H=window.pageYOffset||document.documentElement.scrollTop;return E.style.top="".concat(H,"px"),E.setAttribute("readonly",""),E.value=j,E}var Y=function(T,E){var H=v(T);E.container.appendChild(H);var I=p()(H);return m("copy"),H.remove(),I},B=function(T){var E=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},H="";return typeof T=="string"?H=Y(T,E):T instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(T==null?void 0:T.type)?H=Y(T.value,E):(H=p()(T),m("copy")),H},N=B;function O(j){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?O=function(E){return typeof E}:O=function(E){return E&&typeof Symbol=="function"&&E.constructor===Symbol&&E!==Symbol.prototype?"symbol":typeof E},O(j)}var Qe=function(){var T=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},E=T.action,H=E===void 0?"copy":E,I=T.container,q=T.target,Me=T.text;if(H!=="copy"&&H!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(q!==void 0)if(q&&O(q)==="object"&&q.nodeType===1){if(H==="copy"&&q.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(H==="cut"&&(q.hasAttribute("readonly")||q.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}else throw new Error('Invalid "target" value, use a valid Element');if(Me)return N(Me,{container:I});if(q)return H==="cut"?h(q):N(q,{container:I})},De=Qe;function $e(j){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?$e=function(E){return typeof E}:$e=function(E){return E&&typeof Symbol=="function"&&E.constructor===Symbol&&E!==Symbol.prototype?"symbol":typeof E},$e(j)}function Ei(j,T){if(!(j instanceof T))throw new TypeError("Cannot call a class as a function")}function tn(j,T){for(var E=0;E0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof I.action=="function"?I.action:this.defaultAction,this.target=typeof I.target=="function"?I.target:this.defaultTarget,this.text=typeof I.text=="function"?I.text:this.defaultText,this.container=$e(I.container)==="object"?I.container:document.body}},{key:"listenClick",value:function(I){var q=this;this.listener=c()(I,"click",function(Me){return q.onClick(Me)})}},{key:"onClick",value:function(I){var q=I.delegateTarget||I.currentTarget,Me=this.action(q)||"copy",kt=De({action:Me,container:this.container,target:this.target(q),text:this.text(q)});this.emit(kt?"success":"error",{action:Me,text:kt,trigger:q,clearSelection:function(){q&&q.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(I){return vr("action",I)}},{key:"defaultTarget",value:function(I){var q=vr("target",I);if(q)return document.querySelector(q)}},{key:"defaultText",value:function(I){return vr("text",I)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(I){var q=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return N(I,q)}},{key:"cut",value:function(I){return h(I)}},{key:"isSupported",value:function(){var I=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],q=typeof I=="string"?[I]:I,Me=!!document.queryCommandSupported;return q.forEach(function(kt){Me=Me&&!!document.queryCommandSupported(kt)}),Me}}]),E}(a()),Ai=Li},828:function(n){var o=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}function s(a,f){for(;a&&a.nodeType!==o;){if(typeof a.matches=="function"&&a.matches(f))return a;a=a.parentNode}}n.exports=s},438:function(n,o,i){var s=i(828);function a(u,p,m,d,h){var v=c.apply(this,arguments);return u.addEventListener(m,v,h),{destroy:function(){u.removeEventListener(m,v,h)}}}function f(u,p,m,d,h){return typeof u.addEventListener=="function"?a.apply(null,arguments):typeof m=="function"?a.bind(null,document).apply(null,arguments):(typeof u=="string"&&(u=document.querySelectorAll(u)),Array.prototype.map.call(u,function(v){return a(v,p,m,d,h)}))}function c(u,p,m,d){return function(h){h.delegateTarget=s(h.target,p),h.delegateTarget&&d.call(u,h)}}n.exports=f},879:function(n,o){o.node=function(i){return i!==void 0&&i instanceof HTMLElement&&i.nodeType===1},o.nodeList=function(i){var s=Object.prototype.toString.call(i);return i!==void 0&&(s==="[object NodeList]"||s==="[object HTMLCollection]")&&"length"in i&&(i.length===0||o.node(i[0]))},o.string=function(i){return typeof i=="string"||i instanceof String},o.fn=function(i){var s=Object.prototype.toString.call(i);return s==="[object Function]"}},370:function(n,o,i){var s=i(879),a=i(438);function f(m,d,h){if(!m&&!d&&!h)throw new Error("Missing required arguments");if(!s.string(d))throw new TypeError("Second argument must be a String");if(!s.fn(h))throw new TypeError("Third argument must be a Function");if(s.node(m))return c(m,d,h);if(s.nodeList(m))return u(m,d,h);if(s.string(m))return p(m,d,h);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function c(m,d,h){return m.addEventListener(d,h),{destroy:function(){m.removeEventListener(d,h)}}}function u(m,d,h){return Array.prototype.forEach.call(m,function(v){v.addEventListener(d,h)}),{destroy:function(){Array.prototype.forEach.call(m,function(v){v.removeEventListener(d,h)})}}}function p(m,d,h){return a(document.body,m,d,h)}n.exports=f},817:function(n){function o(i){var s;if(i.nodeName==="SELECT")i.focus(),s=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var a=i.hasAttribute("readonly");a||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),a||i.removeAttribute("readonly"),s=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var f=window.getSelection(),c=document.createRange();c.selectNodeContents(i),f.removeAllRanges(),f.addRange(c),s=f.toString()}return s}n.exports=o},279:function(n){function o(){}o.prototype={on:function(i,s,a){var f=this.e||(this.e={});return(f[i]||(f[i]=[])).push({fn:s,ctx:a}),this},once:function(i,s,a){var f=this;function c(){f.off(i,c),s.apply(a,arguments)}return c._=s,this.on(i,c,a)},emit:function(i){var s=[].slice.call(arguments,1),a=((this.e||(this.e={}))[i]||[]).slice(),f=0,c=a.length;for(f;f{"use strict";/*! + * escape-html + * Copyright(c) 2012-2013 TJ Holowaychuk + * Copyright(c) 2015 Andreas Lubbe + * Copyright(c) 2015 Tiancheng "Timothy" Gu + * MIT Licensed + */var rs=/["'&<>]/;Yo.exports=ns;function ns(e){var t=""+e,r=rs.exec(t);if(!r)return t;var n,o="",i=0,s=0;for(i=r.index;i0&&i[i.length-1])&&(c[0]===6||c[0]===2)){r=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function W(e,t){var r=typeof Symbol=="function"&&e[Symbol.iterator];if(!r)return e;var n=r.call(e),o,i=[],s;try{for(;(t===void 0||t-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(a){s={error:a}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(s)throw s.error}}return i}function D(e,t,r){if(r||arguments.length===2)for(var n=0,o=t.length,i;n1||a(m,d)})})}function a(m,d){try{f(n[m](d))}catch(h){p(i[0][3],h)}}function f(m){m.value instanceof et?Promise.resolve(m.value.v).then(c,u):p(i[0][2],m)}function c(m){a("next",m)}function u(m){a("throw",m)}function p(m,d){m(d),i.shift(),i.length&&a(i[0][0],i[0][1])}}function pn(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=e[Symbol.asyncIterator],r;return t?t.call(e):(e=typeof Ee=="function"?Ee(e):e[Symbol.iterator](),r={},n("next"),n("throw"),n("return"),r[Symbol.asyncIterator]=function(){return this},r);function n(i){r[i]=e[i]&&function(s){return new Promise(function(a,f){s=e[i](s),o(a,f,s.done,s.value)})}}function o(i,s,a,f){Promise.resolve(f).then(function(c){i({value:c,done:a})},s)}}function C(e){return typeof e=="function"}function at(e){var t=function(n){Error.call(n),n.stack=new Error().stack},r=e(t);return r.prototype=Object.create(Error.prototype),r.prototype.constructor=r,r}var It=at(function(e){return function(r){e(this),this.message=r?r.length+` errors occurred during unsubscription: +`+r.map(function(n,o){return o+1+") "+n.toString()}).join(` + `):"",this.name="UnsubscriptionError",this.errors=r}});function Ve(e,t){if(e){var r=e.indexOf(t);0<=r&&e.splice(r,1)}}var Ie=function(){function e(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}return e.prototype.unsubscribe=function(){var t,r,n,o,i;if(!this.closed){this.closed=!0;var s=this._parentage;if(s)if(this._parentage=null,Array.isArray(s))try{for(var a=Ee(s),f=a.next();!f.done;f=a.next()){var c=f.value;c.remove(this)}}catch(v){t={error:v}}finally{try{f&&!f.done&&(r=a.return)&&r.call(a)}finally{if(t)throw t.error}}else s.remove(this);var u=this.initialTeardown;if(C(u))try{u()}catch(v){i=v instanceof It?v.errors:[v]}var p=this._finalizers;if(p){this._finalizers=null;try{for(var m=Ee(p),d=m.next();!d.done;d=m.next()){var h=d.value;try{ln(h)}catch(v){i=i!=null?i:[],v instanceof It?i=D(D([],W(i)),W(v.errors)):i.push(v)}}}catch(v){n={error:v}}finally{try{d&&!d.done&&(o=m.return)&&o.call(m)}finally{if(n)throw n.error}}}if(i)throw new It(i)}},e.prototype.add=function(t){var r;if(t&&t!==this)if(this.closed)ln(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=(r=this._finalizers)!==null&&r!==void 0?r:[]).push(t)}},e.prototype._hasParent=function(t){var r=this._parentage;return r===t||Array.isArray(r)&&r.includes(t)},e.prototype._addParent=function(t){var r=this._parentage;this._parentage=Array.isArray(r)?(r.push(t),r):r?[r,t]:t},e.prototype._removeParent=function(t){var r=this._parentage;r===t?this._parentage=null:Array.isArray(r)&&Ve(r,t)},e.prototype.remove=function(t){var r=this._finalizers;r&&Ve(r,t),t instanceof e&&t._removeParent(this)},e.EMPTY=function(){var t=new e;return t.closed=!0,t}(),e}();var Sr=Ie.EMPTY;function jt(e){return e instanceof Ie||e&&"closed"in e&&C(e.remove)&&C(e.add)&&C(e.unsubscribe)}function ln(e){C(e)?e():e.unsubscribe()}var Le={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var st={setTimeout:function(e,t){for(var r=[],n=2;n0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(r){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,r)},t.prototype._subscribe=function(r){return this._throwIfClosed(),this._checkFinalizedStatuses(r),this._innerSubscribe(r)},t.prototype._innerSubscribe=function(r){var n=this,o=this,i=o.hasError,s=o.isStopped,a=o.observers;return i||s?Sr:(this.currentObservers=null,a.push(r),new Ie(function(){n.currentObservers=null,Ve(a,r)}))},t.prototype._checkFinalizedStatuses=function(r){var n=this,o=n.hasError,i=n.thrownError,s=n.isStopped;o?r.error(i):s&&r.complete()},t.prototype.asObservable=function(){var r=new F;return r.source=this,r},t.create=function(r,n){return new xn(r,n)},t}(F);var xn=function(e){ie(t,e);function t(r,n){var o=e.call(this)||this;return o.destination=r,o.source=n,o}return t.prototype.next=function(r){var n,o;(o=(n=this.destination)===null||n===void 0?void 0:n.next)===null||o===void 0||o.call(n,r)},t.prototype.error=function(r){var n,o;(o=(n=this.destination)===null||n===void 0?void 0:n.error)===null||o===void 0||o.call(n,r)},t.prototype.complete=function(){var r,n;(n=(r=this.destination)===null||r===void 0?void 0:r.complete)===null||n===void 0||n.call(r)},t.prototype._subscribe=function(r){var n,o;return(o=(n=this.source)===null||n===void 0?void 0:n.subscribe(r))!==null&&o!==void 0?o:Sr},t}(x);var Et={now:function(){return(Et.delegate||Date).now()},delegate:void 0};var wt=function(e){ie(t,e);function t(r,n,o){r===void 0&&(r=1/0),n===void 0&&(n=1/0),o===void 0&&(o=Et);var i=e.call(this)||this;return i._bufferSize=r,i._windowTime=n,i._timestampProvider=o,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=n===1/0,i._bufferSize=Math.max(1,r),i._windowTime=Math.max(1,n),i}return t.prototype.next=function(r){var n=this,o=n.isStopped,i=n._buffer,s=n._infiniteTimeWindow,a=n._timestampProvider,f=n._windowTime;o||(i.push(r),!s&&i.push(a.now()+f)),this._trimBuffer(),e.prototype.next.call(this,r)},t.prototype._subscribe=function(r){this._throwIfClosed(),this._trimBuffer();for(var n=this._innerSubscribe(r),o=this,i=o._infiniteTimeWindow,s=o._buffer,a=s.slice(),f=0;f0?e.prototype.requestAsyncId.call(this,r,n,o):(r.actions.push(this),r._scheduled||(r._scheduled=ut.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,n,o){var i;if(o===void 0&&(o=0),o!=null?o>0:this.delay>0)return e.prototype.recycleAsyncId.call(this,r,n,o);var s=r.actions;n!=null&&((i=s[s.length-1])===null||i===void 0?void 0:i.id)!==n&&(ut.cancelAnimationFrame(n),r._scheduled=void 0)},t}(Wt);var Sn=function(e){ie(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0;var n=this._scheduled;this._scheduled=void 0;var o=this.actions,i;r=r||o.shift();do if(i=r.execute(r.state,r.delay))break;while((r=o[0])&&r.id===n&&o.shift());if(this._active=!1,i){for(;(r=o[0])&&r.id===n&&o.shift();)r.unsubscribe();throw i}},t}(Dt);var Oe=new Sn(wn);var M=new F(function(e){return e.complete()});function Vt(e){return e&&C(e.schedule)}function Cr(e){return e[e.length-1]}function Ye(e){return C(Cr(e))?e.pop():void 0}function Te(e){return Vt(Cr(e))?e.pop():void 0}function zt(e,t){return typeof Cr(e)=="number"?e.pop():t}var pt=function(e){return e&&typeof e.length=="number"&&typeof e!="function"};function Nt(e){return C(e==null?void 0:e.then)}function qt(e){return C(e[ft])}function Kt(e){return Symbol.asyncIterator&&C(e==null?void 0:e[Symbol.asyncIterator])}function Qt(e){return new TypeError("You provided "+(e!==null&&typeof e=="object"?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function zi(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var Yt=zi();function Gt(e){return C(e==null?void 0:e[Yt])}function Bt(e){return un(this,arguments,function(){var r,n,o,i;return $t(this,function(s){switch(s.label){case 0:r=e.getReader(),s.label=1;case 1:s.trys.push([1,,9,10]),s.label=2;case 2:return[4,et(r.read())];case 3:return n=s.sent(),o=n.value,i=n.done,i?[4,et(void 0)]:[3,5];case 4:return[2,s.sent()];case 5:return[4,et(o)];case 6:return[4,s.sent()];case 7:return s.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function Jt(e){return C(e==null?void 0:e.getReader)}function U(e){if(e instanceof F)return e;if(e!=null){if(qt(e))return Ni(e);if(pt(e))return qi(e);if(Nt(e))return Ki(e);if(Kt(e))return On(e);if(Gt(e))return Qi(e);if(Jt(e))return Yi(e)}throw Qt(e)}function Ni(e){return new F(function(t){var r=e[ft]();if(C(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function qi(e){return new F(function(t){for(var r=0;r=2;return function(n){return n.pipe(e?A(function(o,i){return e(o,i,n)}):de,ge(1),r?He(t):Dn(function(){return new Zt}))}}function Vn(){for(var e=[],t=0;t=2,!0))}function pe(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new x}:t,n=e.resetOnError,o=n===void 0?!0:n,i=e.resetOnComplete,s=i===void 0?!0:i,a=e.resetOnRefCountZero,f=a===void 0?!0:a;return function(c){var u,p,m,d=0,h=!1,v=!1,Y=function(){p==null||p.unsubscribe(),p=void 0},B=function(){Y(),u=m=void 0,h=v=!1},N=function(){var O=u;B(),O==null||O.unsubscribe()};return y(function(O,Qe){d++,!v&&!h&&Y();var De=m=m!=null?m:r();Qe.add(function(){d--,d===0&&!v&&!h&&(p=$r(N,f))}),De.subscribe(Qe),!u&&d>0&&(u=new rt({next:function($e){return De.next($e)},error:function($e){v=!0,Y(),p=$r(B,o,$e),De.error($e)},complete:function(){h=!0,Y(),p=$r(B,s),De.complete()}}),U(O).subscribe(u))})(c)}}function $r(e,t){for(var r=[],n=2;ne.next(document)),e}function K(e,t=document){return Array.from(t.querySelectorAll(e))}function z(e,t=document){let r=ce(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function ce(e,t=document){return t.querySelector(e)||void 0}function _e(){return document.activeElement instanceof HTMLElement&&document.activeElement||void 0}function tr(e){return L(b(document.body,"focusin"),b(document.body,"focusout")).pipe(ke(1),l(()=>{let t=_e();return typeof t!="undefined"?e.contains(t):!1}),V(e===_e()),J())}function Xe(e){return{x:e.offsetLeft,y:e.offsetTop}}function Kn(e){return L(b(window,"load"),b(window,"resize")).pipe(Ce(0,Oe),l(()=>Xe(e)),V(Xe(e)))}function rr(e){return{x:e.scrollLeft,y:e.scrollTop}}function dt(e){return L(b(e,"scroll"),b(window,"resize")).pipe(Ce(0,Oe),l(()=>rr(e)),V(rr(e)))}var Yn=function(){if(typeof Map!="undefined")return Map;function e(t,r){var n=-1;return t.some(function(o,i){return o[0]===r?(n=i,!0):!1}),n}return function(){function t(){this.__entries__=[]}return Object.defineProperty(t.prototype,"size",{get:function(){return this.__entries__.length},enumerable:!0,configurable:!0}),t.prototype.get=function(r){var n=e(this.__entries__,r),o=this.__entries__[n];return o&&o[1]},t.prototype.set=function(r,n){var o=e(this.__entries__,r);~o?this.__entries__[o][1]=n:this.__entries__.push([r,n])},t.prototype.delete=function(r){var n=this.__entries__,o=e(n,r);~o&&n.splice(o,1)},t.prototype.has=function(r){return!!~e(this.__entries__,r)},t.prototype.clear=function(){this.__entries__.splice(0)},t.prototype.forEach=function(r,n){n===void 0&&(n=null);for(var o=0,i=this.__entries__;o0},e.prototype.connect_=function(){!Wr||this.connected_||(document.addEventListener("transitionend",this.onTransitionEnd_),window.addEventListener("resize",this.refresh),va?(this.mutationsObserver_=new MutationObserver(this.refresh),this.mutationsObserver_.observe(document,{attributes:!0,childList:!0,characterData:!0,subtree:!0})):(document.addEventListener("DOMSubtreeModified",this.refresh),this.mutationEventsAdded_=!0),this.connected_=!0)},e.prototype.disconnect_=function(){!Wr||!this.connected_||(document.removeEventListener("transitionend",this.onTransitionEnd_),window.removeEventListener("resize",this.refresh),this.mutationsObserver_&&this.mutationsObserver_.disconnect(),this.mutationEventsAdded_&&document.removeEventListener("DOMSubtreeModified",this.refresh),this.mutationsObserver_=null,this.mutationEventsAdded_=!1,this.connected_=!1)},e.prototype.onTransitionEnd_=function(t){var r=t.propertyName,n=r===void 0?"":r,o=ba.some(function(i){return!!~n.indexOf(i)});o&&this.refresh()},e.getInstance=function(){return this.instance_||(this.instance_=new e),this.instance_},e.instance_=null,e}(),Gn=function(e,t){for(var r=0,n=Object.keys(t);r0},e}(),Jn=typeof WeakMap!="undefined"?new WeakMap:new Yn,Xn=function(){function e(t){if(!(this instanceof e))throw new TypeError("Cannot call a class as a function.");if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");var r=ga.getInstance(),n=new La(t,r,this);Jn.set(this,n)}return e}();["observe","unobserve","disconnect"].forEach(function(e){Xn.prototype[e]=function(){var t;return(t=Jn.get(this))[e].apply(t,arguments)}});var Aa=function(){return typeof nr.ResizeObserver!="undefined"?nr.ResizeObserver:Xn}(),Zn=Aa;var eo=new x,Ca=$(()=>k(new Zn(e=>{for(let t of e)eo.next(t)}))).pipe(g(e=>L(ze,k(e)).pipe(R(()=>e.disconnect()))),X(1));function he(e){return{width:e.offsetWidth,height:e.offsetHeight}}function ye(e){return Ca.pipe(S(t=>t.observe(e)),g(t=>eo.pipe(A(({target:r})=>r===e),R(()=>t.unobserve(e)),l(()=>he(e)))),V(he(e)))}function bt(e){return{width:e.scrollWidth,height:e.scrollHeight}}function ar(e){let t=e.parentElement;for(;t&&(e.scrollWidth<=t.scrollWidth&&e.scrollHeight<=t.scrollHeight);)t=(e=t).parentElement;return t?e:void 0}var to=new x,Ra=$(()=>k(new IntersectionObserver(e=>{for(let t of e)to.next(t)},{threshold:0}))).pipe(g(e=>L(ze,k(e)).pipe(R(()=>e.disconnect()))),X(1));function sr(e){return Ra.pipe(S(t=>t.observe(e)),g(t=>to.pipe(A(({target:r})=>r===e),R(()=>t.unobserve(e)),l(({isIntersecting:r})=>r))))}function ro(e,t=16){return dt(e).pipe(l(({y:r})=>{let n=he(e),o=bt(e);return r>=o.height-n.height-t}),J())}var cr={drawer:z("[data-md-toggle=drawer]"),search:z("[data-md-toggle=search]")};function no(e){return cr[e].checked}function Ke(e,t){cr[e].checked!==t&&cr[e].click()}function Ue(e){let t=cr[e];return b(t,"change").pipe(l(()=>t.checked),V(t.checked))}function ka(e,t){switch(e.constructor){case HTMLInputElement:return e.type==="radio"?/^Arrow/.test(t):!0;case HTMLSelectElement:case HTMLTextAreaElement:return!0;default:return e.isContentEditable}}function Ha(){return L(b(window,"compositionstart").pipe(l(()=>!0)),b(window,"compositionend").pipe(l(()=>!1))).pipe(V(!1))}function oo(){let e=b(window,"keydown").pipe(A(t=>!(t.metaKey||t.ctrlKey)),l(t=>({mode:no("search")?"search":"global",type:t.key,claim(){t.preventDefault(),t.stopPropagation()}})),A(({mode:t,type:r})=>{if(t==="global"){let n=_e();if(typeof n!="undefined")return!ka(n,r)}return!0}),pe());return Ha().pipe(g(t=>t?M:e))}function le(){return new URL(location.href)}function ot(e){location.href=e.href}function io(){return new x}function ao(e,t){if(typeof t=="string"||typeof t=="number")e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(let r of t)ao(e,r)}function _(e,t,...r){let n=document.createElement(e);if(t)for(let o of Object.keys(t))typeof t[o]!="undefined"&&(typeof t[o]!="boolean"?n.setAttribute(o,t[o]):n.setAttribute(o,""));for(let o of r)ao(n,o);return n}function fr(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function so(){return location.hash.substring(1)}function Dr(e){let t=_("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function Pa(e){return L(b(window,"hashchange"),e).pipe(l(so),V(so()),A(t=>t.length>0),X(1))}function co(e){return Pa(e).pipe(l(t=>ce(`[id="${t}"]`)),A(t=>typeof t!="undefined"))}function Vr(e){let t=matchMedia(e);return er(r=>t.addListener(()=>r(t.matches))).pipe(V(t.matches))}function fo(){let e=matchMedia("print");return L(b(window,"beforeprint").pipe(l(()=>!0)),b(window,"afterprint").pipe(l(()=>!1))).pipe(V(e.matches))}function zr(e,t){return e.pipe(g(r=>r?t():M))}function ur(e,t={credentials:"same-origin"}){return ue(fetch(`${e}`,t)).pipe(fe(()=>M),g(r=>r.status!==200?Ot(()=>new Error(r.statusText)):k(r)))}function We(e,t){return ur(e,t).pipe(g(r=>r.json()),X(1))}function uo(e,t){let r=new DOMParser;return ur(e,t).pipe(g(n=>n.text()),l(n=>r.parseFromString(n,"text/xml")),X(1))}function pr(e){let t=_("script",{src:e});return $(()=>(document.head.appendChild(t),L(b(t,"load"),b(t,"error").pipe(g(()=>Ot(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(l(()=>{}),R(()=>document.head.removeChild(t)),ge(1))))}function po(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function lo(){return L(b(window,"scroll",{passive:!0}),b(window,"resize",{passive:!0})).pipe(l(po),V(po()))}function mo(){return{width:innerWidth,height:innerHeight}}function ho(){return b(window,"resize",{passive:!0}).pipe(l(mo),V(mo()))}function bo(){return G([lo(),ho()]).pipe(l(([e,t])=>({offset:e,size:t})),X(1))}function lr(e,{viewport$:t,header$:r}){let n=t.pipe(ee("size")),o=G([n,r]).pipe(l(()=>Xe(e)));return G([r,t,o]).pipe(l(([{height:i},{offset:s,size:a},{x:f,y:c}])=>({offset:{x:s.x-f,y:s.y-c+i},size:a})))}(()=>{function e(n,o){parent.postMessage(n,o||"*")}function t(...n){return n.reduce((o,i)=>o.then(()=>new Promise(s=>{let a=document.createElement("script");a.src=i,a.onload=s,document.body.appendChild(a)})),Promise.resolve())}var r=class extends EventTarget{constructor(n){super(),this.url=n,this.m=i=>{i.source===this.w&&(this.dispatchEvent(new MessageEvent("message",{data:i.data})),this.onmessage&&this.onmessage(i))},this.e=(i,s,a,f,c)=>{if(s===`${this.url}`){let u=new ErrorEvent("error",{message:i,filename:s,lineno:a,colno:f,error:c});this.dispatchEvent(u),this.onerror&&this.onerror(u)}};let o=document.createElement("iframe");o.hidden=!0,document.body.appendChild(this.iframe=o),this.w.document.open(),this.w.document.write(` + + + + + + + +
+
+
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+ + + +

欢迎来到安全攻防实践 (CTF) 短学期

+

本网站整合了课程中所有实验 / 作业,如有疑问请及时联系助教 / team-aaa@zju.edu.cn

+

关于课程报名

+

根据去年课程的反馈,我们课程的内容相对而言知识点较多较难。为了选课学生的体验,此次选课设置一个 Lab 0,并在此 Lab 中呈现了学习该课程应该具备(或者说快速上手)的基础知识和技能。请有意向选课的同学完成后将实验文档提交至邮箱(team-aaa@zju.edu.cn)进行报名。

+

如果出于时间原因无法按时完成,也请不要慌张,可以将未完成的报告同样提交,我们希望看到的是主动学习的态度 :D

+

如果真的忙到一点也没有时间,也“欢迎”头铁选课(也请于邮箱中提交报名),凭借着付出,一定可以在课程中得到满满收获。

+

注:Lab 0 本身也是小学期的首次作业。

+

报名邮件请包含以下内容:

+
    +
  • Lab 0 的实验报告,具体详细见 Lab 0 页面
  • +
  • 个人信息(姓名、学号、联系方式、QQ)
  • +
  • (可选)个人简历(比如你已经完成了哪些课,以及任何你想和我们传递的信息
  • +
+

关于课程补选

+

在已经截止时间(6 11 )后仍想参与补选课程的同学,请于考试周前的(6 19 日中午 12 )通过邮件提交课程报名;细节同上所述。补选期间的名额更加有限,故我们将同样根据提交的报告 / 简历进行筛选,请补选的同学考虑做 Lab 0 时的体验做补选决定。

+

课程交流群

+

关于选课、Lab 0 等任何与本次短学期课程有关的问题,都可以加 QQ 704639399 交流。

+
+
+
+ +
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/intro/lab0/index.html b/intro/lab0/index.html new file mode 100644 index 0000000..251cba6 --- /dev/null +++ b/intro/lab0/index.html @@ -0,0 +1,640 @@ + + + + + + + + + + +general lab 0: 基础知识及技能 - CTF101-Labs-2023 + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ + + +

Lab 0:基础知识及技能

+

本课程的 Lab 0 由两部分组成 :

+ +
+

鼓励多选,探索自己感兴趣的方向!

+
+

完成的报告请命名为 lab0_姓名_学号.pdf 6 11 日中午 12 点前,以邮件附件的形式提交到 team-aaa@zju.edu.cn;并于邮件中提供个人的联系方式~

+

lab 过程中遇到的问题或者任何与课程相关的问题欢迎加入课程交流群进行讨论,QQ 群号 704639399

+

Prerequisite

+

Challange 1

+

Linux 环境的搭建与简单使用

+

参考难度:★

+

后续课程的许多内容都将在 Linux 操作系统的平台上完成,为了方便,本次课程提供了 ubuntu 虚拟机供下载

+
+

下载链接(其中用户名为 ctfer,密码为 aaa

+
+

虚拟机中预装了课程中将要用到的各类工具及环境。

+
+

当然,如果你已经拥有了熟悉的 Linux 环境,请放心大胆使用。

+
+

具备 Linux 后,请观看 Shell 基础及 CLI 工具推荐 - 2023 春夏计算机学院朋辈辅学 课程视频,并在实验报告中给出任意 4 shell 命令的用法介绍以及在 Linux 环境下的实操截图。

+

hint:

+ +

Challenge 2

+

基础的 python 编程

+

参考难度:★

+

后续的课程中不乏通过编程来:

+
    +
  1. 节省人力成本
  2. +
  3. 解决特定问题
  4. +
+

掌握脚本语言 python 会让这些事半功倍。请完成如下任务,并在实验报告中给出你的代码:

+
+

当然,即使你没有学习过 python 也无需慌张;你可以通过如菜鸟教程和各类慕课进行简单的学习。你无需成为一个 python master,基本的代码阅读能力以及编程能力足以使你通过此课。

+
+
    +
  1. +

    请阅读和执行如下 python 程序,在实验报告中并解释其功能 : +

    #!/usr/bin/python3
    +
    +data = input("give me your string: ")
    +print("length of string:", len(data))
    +
    +data_old = data
    +data_new = ""
    +for d in data:
    +    if d in 'abcdefghijklmnopqrstuvwxyz':
    +        data_new += chr(ord(d) - 32)
    +    elif d in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ':
    +        data_new += chr(ord(d) + 32)
    +    else:
    +        data_new += d
    +
    +print("now your string:", data_new)
    +
    +
  2. +
  3. +

    请通过 python 编程解决校巴 calculator 这道编程题(需要内网访问),在实验报告中给出完整代码、成功解决的截图以及正确的 flag

    +
  4. +
+

hint:

+
    +
  • 如果不知道从哪开始可以查看我们提供的部分代码,已经完成了题目的连接以及数据的接收
      +
    • 或者推荐自学使用 pwntools 这个 CTF 中非常常用的 python 包进行交互
    • +
    +
  • +
  • eval 函数可以用于计算
  • +
+

Challenge 3(选做)

+

二进制相关的课题方向(Pwn 以及 Reverse)都需要 x86 汇编的知识,如果对该两方向有兴趣的话,可选完成这个 asm tour 汇编题目,在实验报告中给出你的解题过程。

+
+

如果完全没有接触过汇编语言,也无需担心,可以学习 hint 提到的资料。对指令、寄存器、调用规定等知识做个基本了解。

+
+

hint:

+ +

Web

+

参考难度:★★

+

请访问网址 http://pumpk1n.com/lab0.php 这个神奇的页面藏着一个 flag,请尝试找到它,并在实验报告中记录你的过程。

+

hint:

+
    +
  • 浏览器中的开发者工具
  • +
+

Pwn

+

参考难度:★★

+
    +
  1. 请阅读附件中的 C 代码 bug_program.c,尝试找到代码中所有的BUG,并在实验报告中给出描述
  2. +
  3. 附件中的 bug_program.elf Linux 平台上编译的可执行 ELF 程序,请在 Linux 环境下执行该程序,并在与其交互的过程中触发找到的漏洞,这些漏洞可以使得程序崩溃么?
  4. +
  5. 请修复 bug_program.c 中发现的漏洞,将新的代码命名为 no_program.c 并提交
  6. +
+

Reverse

+

参考难度:★★★

+

可恶,为什么这个可执行文件无法运行,其中究竟隐藏着什么秘密(该秘密为一串有意义的字符串,格式为 AAA{...}):

+

题目下载链接

+

你需要在实验报告中回答以下几个问题:

+
    +
  1. 可执行文件的入口点地址(Entry Point Address)是多少?
  2. +
  3. 可执行文件无法运行的原因是什么?通过什么方法可以让它正常运行?
  4. +
  5. 可执行文件中隐藏的秘密(即格式为 AAA{...} 的字符串)是?你是如何获得它的?
  6. +
+

hint:

+ +

Misc

+

Challenge 1

+

参考难度:★

+

这里有一串被编码过的神秘的字符串,请找出有意义的原字符串(格式为 AAA{...}):

+
8Q%uH7oV9C7o!2f7oD*@8Oc$J2Gu:s:JO2T78HTV8PrVj9/]^B:0'e_6SgJh7n,=8;)V$M:Gkm:92eJR8Oc-;;`$6b:Gk[5=]\L#7mT%14Ztqk
+
+

请在实验报告中给出你具体的解密过程

+

hint:

+
    +
  • 你可能会需要 CyberChef而且这里有一个功能可以秒杀这个题目
  • +
  • 你可能需要了解一些关于 Base 系列编码的特征
  • +
+

Challenge 2

+

参考难度:★★★

+

下面这张图是 AAA logo。真的……只是一个 logo 吗?其实这张图片中隐藏了一个 flag(格式 AAA{...}),请你找出来。

+

+

请在实验报告中给出你的解题过程,包括你最终得到的 flag 内容。

+

hint:

+
    +
  • flag 被分为了两个部分
  • +
  • 如果你找不到第一部分,仔细观察图片,这使用了一种最基础的图片隐写技术 LSB 隐写,请自行搜索学习如何破解
  • +
  • 如果你找不到第二部分,请仔细查看文件内容
  • +
+

Crypto

+

题目相关背景知识

+

AES 是一种对称加密机制,比 RSA 这样的非对称加密快许多。由于本题只涉及 AddRoundKeySubstitution Bytes 内容,所以只对实验相关部分进行简要说明,而 AES 的完整细节可以在这里阅读学习。

+

bytes2matrix

+

由于 AES 的加密过程中的状态用一个 4x4 的字节矩阵,所以对于字符串形式的明文,首先需要把其表示为一个 4x4 的字节矩阵(对,就是线性代数里那个矩阵),对应题目代码中的 bytes2matrix,然后进行后续加密流程。

+

该部分的代码已经给出,不需要你补全,上述文字只是辅助理解。

+

AddRoundKey

+

AddRoundKey 步骤很简单:它将当前状态 (4x4 的字节矩阵 ) 与当前轮密钥 (4x4 的字节矩阵 ) 进行异或运算。

+

异或需要用到的轮密钥已经给出,对应题目代码中的 round_key,你只需要 add_round_key 中的补全异或算法即可(不超过三行❗️)

+

SubBytes

+

将状态矩阵的每个字节替换为预设 16x16 查找表中的不同字节。查找表称为“Substitution box”或简称“S-box”,或许你可能会对为什么加密过程中需要 substitution 感到疑惑,没关系目前不需要理解相关内容。如果一句话概括原因,是为了使得 AES 的输入输出之间具有高的“非线性性”。

+

值得注意的是,substitution 的算法在加密和解密过程中并没有不同,只是使用的 S-box 变成了原 S-box 的逆而已。为了使得题目看起来短一些,我删除了加密过程中使用的 S-box,只给出了加密的 S-box 的逆,对应题目代码中的 inv_s_box。你只需要补全 sub_bytes 函数即可(同样不超过三行❗️)

+

Challenge

+

参考难度:★★

+

题目下载链接

+

上题是对 AES 的简单抽象,其中需要你补全的 add_round_keysub_bytes 代码符合 AES AddRoundKeySubBytes 的标准实现,请你阅读上述背景或查阅相关文档,实现这两个函数。如果实现正确会输出格式为 AAA{...} flag

+

请在实验报告中给出你的解题过程,包括你最终得到的 flag 内容。

+

hint:

+
    +
  • 一共就不超过 10 行代码,大概不需要 hint;如果真的需要,请搜索一下 AES 相关文档和代码实现。
  • +
+
+
+
+ +
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/intro/misc-lab1/index.html b/intro/misc-lab1/index.html new file mode 100644 index 0000000..6a0be43 --- /dev/null +++ b/intro/misc-lab1/index.html @@ -0,0 +1,593 @@ + + + + + + + + + + +misc lab 1: 编解码及 OSINT - CTF101-Labs-2023 + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ + + +

Misc Lab 1:编解码及 OSINT

+

本节 Lab 由以下两部分组成:

+ +

具体实验报告需要写的内容会在下面具体题目里面描述。对于题目有任何问题都可以在群里 / 私戳 TonyCrane 提问。

+

本次 lab ddl 在发布两周以后即 7 21 日晚 23:59,请注意安排时间。

+

Task 1

+

Background

+

我们课上介绍了字符编码的意义,并且较为详细的讲解了 ASCII、Latin-1、Unicode 以及系列编码的原理。在这个任务中,你将需要自行查阅资料了解 GB 2312、GBK、GB 18030 等国标码的编码方式。之后进一步探索了解各种情况乱码产生的原因,思考恢复乱码的可能性。

+

GB 系列编码

+

这部分留给大家自行查阅资料了解。你需要知道的是 GB 2312、GBK、GB 18030 规定了三个不同大小的字符集,以及针对每个字符的编码。且 GB 18030 兼容 GBK 兼容 GB 2312 兼容 ASCII。更多细节可以自行查阅标准文件、介绍博客等。

+

乱码原因

+

课上我们讲过了,通过一种字符编码来解读另一种字符编码的字节流,就会导致解读出来的字符并非预期,从而产生所谓“乱码”。这里我们将探究一下具体的原因。

+

常见情况下有以下几种情形:

+
    +
  1. GBK 解码 UTF-8 编码的文本
  2. +
  3. UTF-8 解码 GBK 编码的文本
  4. +
  5. latin-1 解码 UTF-8 编码的文本
  6. +
  7. latin-1 解码 GBK 编码的文本
  8. +
  9. 先用 GBK 解码 UTF-8 编码的文本,再用 UTF-8 解码前面的结果
  10. +
  11. 先用 UTF-8 解码 GBK 编码的文本,再用 GBK 解码前面的结果
  12. +
+

注意要想造成乱码,一定说明字符编码之间存在不兼容部分,因此这几种编码互相兼容的 ASCII 编码一定不会出现乱码,而中文文本则会出现乱码。

+

下面我会介绍几种研究乱码的方式,供大家参考。

+
vscode
+

创建一个文本文件,使用 vscode 打开,在右下角你会看到文件的编码方式(一般情况下默认为 UTF-8),说明此时文件存储的二进制为 UTF-8 编码的字节流。这时你可以点击这个位置,选择“通过编码重新打开(Reopen with Encoding)”,选择 GBK 编码,这样你所看见的就是将原有文件字节流通过 GBK 编码解析出来的字符(即前面说到的第 1 种情况),不出意外它应该是乱码。

+

+

或许你也会发现还有一个选项为“通过编码保存(Save with Encoding)”,它的作用就是将你现在看到的字符通过制定的编码方式重新编码为字节流,然后保存回文件中。比如继续上一步,我们看到了乱码,然后选择通过编码保存,选择 GBK,看起来没有任何事情发生。接下来再选择通过编码重新打开,选择 UTF-8,你或许会觉得此时恢复了正常,但有一些位置的字符变成了奇怪的符号,这种情况就是前面说到的第 5 中情况。

+

同理,你可以通过同样的方式研究其他四种乱码。

+
观察十六进制
+

前面我们只看到了解码的结果,而没有看到文件存储字节流的内容。将字节流和解码得到的字符关联起来可以更好的理解乱码产生的原因。因此我们可以在 vscode 的基础上再使用十六进制编辑器来查看文件流的内容,进行比对。

+
CyberChef
+

我们课上提到了,CyberChef Input Output 窗格很清晰地增加了字符编码的选项,因此可以很方便地进行编码的转换。

+

+

但是 CyberChef 也存在一个问题,这个问题和处理 UTF-8 错误编码有关,关于 UTF-8 错误编码的更多信息后面马上就会说到。这是一个 bonus,如果你能够理解为什么 CyberChef vscode 针对第二种情况的乱码结果不一样,你将得到 bonus

+
python
+

利用 python 也可以进行编码的转换,这里是一些例子:

+
In [1]: "测试".encode("UTF-8").decode("GBK") # 第一种情况的乱码
+Out[1]: '娴嬭瘯'
+
+In [2]: "测试".encode("UTF-8")  # 用 UTF-8 编码编码 “测试”
+Out[2]: b'\xe6\xb5\x8b\xe8\xaf\x95'
+
+In [3]: "娴嬭瘯".encode("GBK")  # 用 GBK 编码编码 “娴嬭瘯”
+Out[3]: b'\xe6\xb5\x8b\xe8\xaf\x95'
+
+In [4]: bin(0xe6), bin(0xb5), bin(0x8b) # 将十六进制转换为二进制
+Out[4]: ('0b11100110', '0b10110101', '0b10001011')
+
+In [5]: hex(0b0110_110101_001011)   # 手动解码 UTF-8 得到 Unicode 码位
+Out[5]: '0x6d4b'
+
+In [6]: "\u6d4b"    # 将 Unicode 码位转换为字符
+Out[6]: '测'
+
+

UTF-8 解码错误

+

我们课上讲到了 Latin-1 编码可以解码任意字节流,但 UTF-8 不能,它的编码情况只有以下四种:

+
    +
  • 0xxxxxxx
  • +
  • 110xxxxx 10xxxxxx
  • +
  • 1110xxxx 10xxxxxx 10xxxxxx
  • +
  • 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
  • +
+

所以如果一个字符开头就出现了 10 xxxxxx 这样的字节,UTF-8 就不知道该怎么解码了。其他情况也会引起 UTF-8 解码错误。

+

Python 处理这种错误的默认方法是直接抛出 UnicodeDecodeError,大部分情况下是不方便的,所以一般情况的处理方式是针对错误的字节流进行替换,比如将错误的字节流替换为 U+FFFD(即 �),这也是一些古怪乱码的来源之一。

+

前面提到了 CyberChef 并没有采用这种处理方式,它将错误的字节也解码为了其他奇怪的字符,请你研究其中的原理,这是一个 bonus

+

Task

+

那么总结一下你需要做的事情:

+
    +
  1. 通过你喜欢的方式复现前面提到的六种乱码情况(每种 5 分,共 30 分)
  2. +
  3. 回答以下问题:
      +
    • 在自行研究了 GB 系列编码后,请阐述 GB 系列是如何实现三个版本兼容的(10 分)
    • +
    • 针对六种乱码情况,哪些是你觉得可以恢复的,哪些是不可以恢复的(10 分)
        +
      • 这里我们默认解码之后同时用这种编码方式重新编码,并保存字节流到文件
      • +
      +
    • +
    • 一个老生常谈的乱码“锟斤拷”,实验之后你应该了解了它到底是怎么产生的,请解释为什么会产生这个乱码,以及为什么是这三个特定的汉字(10 分)
    • +
    +
  4. +
  5. bonus:通过探究,解释清楚 CyberChef 是怎么处理 UTF-8 解码错误的(10 分)
  6. +
+

Challenge 1

+

Background

+

我们课上介绍了维吉尼亚(Vigenere)密码,记明文为 \(\mathbf{P}\)、密文为 \(\mathbf{C}\)、密钥为 \(\mathbf{k}\),其加解密方式为:

+
    +
  • 加密:\(\mathbf{C}_i = (\mathbf{P}_i + \mathbf{k}_i) \bmod 26\)
  • +
  • 解密:\(\mathbf{P}_i = (\mathbf{C}_i - \mathbf{k}_i) \bmod 26\)
  • +
+

这里我们将其进行扩展,将字符集从 26 个字母扩展到 97 个字符,并将加法密码改为乘法密码,即:

+
    +
  • 加密:\(\mathbf{C}_i = (\mathbf{P}_i \times \mathbf{k}_i) \bmod 97\)
  • +
  • 解密:\(\mathbf{P}_i = (\mathbf{C}_i \times \mathbf{k}_i^{-1}) \bmod 97\)
      +
    • 注意这里 \(\mathbf{k}_i^{-1}\)\(\mathbf{k}_i\) 在模 \(97\) 意义下的逆元,而非直接求倒数
    • +
    +
  • +
+

维吉尼亚密码的破解方法我们在课上也有介绍过,基本分为几步:

+
    +
  1. 爆破猜测密钥长度
      +
    • 课上的做法是寻找多次重复的密文,这里有些复杂,可以选择另一种方式
    • +
    • 针对每种可能的密钥长度 \(k\),计算密文中第 \(i\) 位和第 \(i+k\) 位的字符重合了几次
        +
      • 选取整体重合次数最多的 \(k\) 即为最可能的密钥长度
      • +
      +
    • +
    +
  2. +
  3. 逐位爆破密钥
      +
    • 确定了密钥长度为 \(k\) 后,密文中 \(i, i+k, i+2k, \cdots\) 位的字符都是用同一个字母加密的,构成一组乘法加密
    • +
    • 乘法加密不会改变字符的统计分布,可以通过 26 个字母的频率分布来猜测该位密钥(a A 算作同一个字母,非字母的都忽略)
    • +
    +
  4. +
  5. 解密
      +
    • 有了猜测的密钥后,就可以对密文进行解密了
    • +
    +
  6. +
+

而我们扩展后的维吉尼亚密码的破解方法也类似,通过你喜欢的语言实现即可(推荐 python,以及有了自动化方式就不要肝手推啦)

+

Task

+

我们选取了一份 TOEFL 阅读文章,随机生成了 15-30 个字符长度的密钥,并对其进行了加密,现将密文提供给你,为了明确加密方法以及简单熟悉 python 使用,我们还提供了加密代码,请你实现对于密文的破解(flag 夹在了明文中间)。

+

附件:encrypt.pycipher.txt

+

这道题目也是校巴中的一道题目,附件也是完全一致的(除了一些代码格式更改),原题链接为 https://zjusec.com/challenges/31

+

请实现对给定密文的破解,拿到其中的 flag,提交到校巴题目中进行验证。实验报告中需要包含你的解题思路、完整解题代码以及 flag

+

如果无法完整完成解密,也请将你的尝试写在报告中,我们会根据完成情况给部分分。

+

Challenge 2

+

选做此题目需要同时完成以下两个任务。

+

Task 1: TonyCrane's easy OSINT

+

这是 TonyCrane 在日本拍的一张照片(请下载图片后做题):

+

+

请你回答以下两个问题:

+
    +
  1. 拍摄这张图片时所在位置的高度为多少(以海平面为基准,尽可能精确)
  2. +
  3. 拍摄这张图片的时间是什么时候(尽可能精确)
  4. +
+

将你的答案以及解题思路写在实验报告中。同样,没有完全做出来也可以写出你的思考,我们也会考虑给出部分分。

+

Task 2: yyy's real OSINT

+

这是 yyy 用手机拍的一张照片(请下载图片后做题):

+

+

请回答以下两个问题:

+
    +
  • 拍摄位置的经纬度
  • +
  • 拍摄的月份,以及是在当日几点钟拍的
  • +
+

请通过 http://nc.tonycrane.cc:65111/ 进行回答并验证(请不要进行任何形式的爆破答案),显示 flag 即为回答正确。将你的结果、回答截屏以及解题思路写在实验报告中。同样,没有完全做出来也可以写出你的思考,我们也会考虑给出部分分。

+
+
+
+ +
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/intro/pwn-lab1/index.html b/intro/pwn-lab1/index.html new file mode 100644 index 0000000..b87001f --- /dev/null +++ b/intro/pwn-lab1/index.html @@ -0,0 +1,399 @@ + + + + + + + + + +pwn lab 1: Code Injection - CTF101-Labs-2023 + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ + + +

Pwn Lab 1: Code Injection

+

本节 Lab 由以下两部分组成:

+
    +
  • 基础部分
      +
    • 课上题目的复现 (80 )
    • +
    • 校巴上的 shellcode 赛题 (20 )
    • +
    +
  • +
  • bonus 部分 (extra 20 )
  • +
+

Task 1 (30 points)

+

课上作为引子的 hello 赛题,请通过其熟悉 pwntools 的使用,并完成攻击远程,取得 flag1 (15 points) flag2 (points)

+
    +
  • 题目附件
  • +
  • 题目部署在 IP:116.62.247.145 , Port: 10100
  • +
+

请在报告中附上漏洞分析以及做法,给出成功拿到 flag 的截图,并将攻击代码以附件形式上传

+

Task 2 (25 points)

+

课上讲解的 injection1 赛题,请逆向分析程序,并实现对其中 Code Injection 漏洞的攻击,取得位于远程服务器上的 flag (25 points)

+
    +
  • 题目附件
  • +
  • 题目部署在 IP:116.62.247.145 , Port: 10101
  • +
+

请在报告中附上漏洞分析以及做法,给出成功拿到 flag 的截图,并将攻击代码以附件形式上传

+
+

注:路径穿越不给分哦 :-)

+
+

Task 3 (25 points)

+

课上讲解的 injection2 赛题,请实现

+
    +
  1. 按题目要求实现 5 种功能的 delegate 代码,完成后取得 FLAG (10 points)
  2. +
  3. 学习 shellcode (5 points) 并通过 shellcode 攻击拿到远程的 shell,并得到另外的 flag 内容 (10 points)
  4. +
+
    +
  • 题目附件
  • +
  • 题目部署在 IP:116.62.247.145 , Port: 10102
  • +
+

请在报告中附上漏洞分析以及做法,给出对于你使用的 shellcode 代码的分析(这个代码到底干了啥),给出成功拿到 flag 的截图,并将攻击代码以附件形式上传

+

Task 4 (20 points)

+

位于校巴的“超老” shellcode 赛题,在完成以上的基础后,做它一定是砍瓜切菜

+ +
+

注:这个题是 32 位架构的 shellcode 哦,不要弄错了

+
+

请在报告中附上漏洞分析以及做法,给出成功拿到 flag 的截图,并将攻击代码以附件形式上传

+

Bonus (extra 20 points)

+

Task 3 的基础上,injection3 赛题对于输入的代码做了一些限制,你还能成功攻击么?请完成

+
    +
  1. 分析 injection3injection2 的不同,实现了怎样的检查?(5 points)
  2. +
  3. 绕过该检查,完成远程弹 shell,并取得 flag (15 points)
  4. +
+
    +
  • 题目附件
  • +
  • 题目部署在 IP:116.62.247.145 , Port: 10103
  • +
+

请在报告中给出你的分析结果,并附上漏洞分析以及做法,给出成功拿到 flag 的截图,并将攻击代码以附件形式上传

+
+
+
+ +
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/intro/rev-lab1/index.html b/intro/rev-lab1/index.html new file mode 100644 index 0000000..be3f4e8 --- /dev/null +++ b/intro/rev-lab1/index.html @@ -0,0 +1,373 @@ + + + + + + + + + + +rev lab 1: Baby Reverse: - CTF101-Labs-2023 + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+ + + +

Rev Lab 1: Baby Reverse

+

本节 Lab 由以下两部分组成:

+ +

Task 1 (70 points)

+

Part 1 (40 points)

+

题目下载链接

+

课上作为练习的 practice 赛题,请回顾课上讲解的内容,完成题目并回答课上提出的 5 个问题:

+
    +
  1. 在题目中有一个函数是加密相关的函数,请找出这个函数的地址Hex 格式作答,5 points)
  2. +
  3. 当你找到了这个加密函数,请找出程序在加密过程中所使用到的密钥 (5 points)
  4. +
  5. 在这个题目中,程序简单封装了短字符串类型,请在 IDA 中恢复它的结构体 (截图或用 C 语言表示该结构, 15 points)
  6. +
  7. 给出你解答的 flag 内容及 Writeup (15 points)
  8. +
+

Part 2 (30 points)

+

题目下载链接

+

practice 赛题的基础上,该题目稍有修改,请你稍加探索完成题目并回答以下问题:

+
    +
  1. 程序中加密函数用到的的密钥是什么,你是如何找到它的(10 points)
  2. +
  3. 给出你解答的 flag 内容及 Writeup(20 points)
  4. +
+

Task 2 (30 points)

+

题目下载链接

+

看似随机却并不随机,看似模糊却又清晰,请你耐心分析并提交:

+
    +
  1. flag 内容及 Writeup (30 points)
  2. +
+
+
+
+ +
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/intro/tools/index.html b/intro/tools/index.html new file mode 100644 index 0000000..7c0606b --- /dev/null +++ b/intro/tools/index.html @@ -0,0 +1,374 @@ + + + + + + + + + + +相关工具的介绍和使用 - CTF101-Labs-2023 + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+ + + +

相关工具的介绍和使用

+

我们在发布的虚拟机

+
+

下载链接(其中用户名为 ctfer,密码为 aaa

+
+

中预装了一些课程中可能会使用到的工具,这里将对其进行展开介绍。同学们也可以根据自身需要,在熟悉的平台中使用这些工具。

+

IDA

+
    +
  • 官网:https://hex-rays.com/ida-pro/
  • +
  • 介绍:无可争议的,最强的逆向工具~二进制程序 F5 一键变回源代码
  • +
  • 使用:在预装的虚拟机桌面双击 IDA Freeware 7.6 即可,启动效果如下图,随后即可通过 New 选择二进制程序进行反编译
  • +
+

+
+

备注:预装的 IDA 是需要联网使用的免费试用版,如果安装其他渠道下载到的破解版,请注意避免中文路径问题。

+
+

解决 SSL 版本过高导致的 server not avaliable

+

由于高版本 ubuntu 使用的是 SSL3+ 的版本,在 IDA 与远端 server 使用时可能会出问题,如果你遇到了 cloud server not avaliable 的问题,其关键原因是 SSL3+ 拿掉了 SSL_get_peer_certificate 这个方法,见链接(又是不向前兼容的设计)

+

为了修复,我们可以将旧版本 SSL1.1 替换目前环境的 SSL3+,请下载修复附件,解压缩后在目标目录执行 fix.sh 脚本(可能需要 sudo 权限),完成后再次测试 IDA 应该就可以正常通过 cloud server 进行 F5

+

ghidra

+
    +
  • 官网:https://ghidra-sre.org/
  • +
  • 介绍:开源的一款逆向工具,在处理特定 IDA 不对付的架构时可以使用
  • +
  • 使用:在预装的虚拟机的命令行中执行 ~/Tools/ghidra_10.3_PUBLIC/ghidraRun 脚本即可启动,效果如下图,使用的教程可以找网上的相关博客,如这一篇
  • +
+

+

gef plugin

+
    +
  • 官网:https://github.com/hugsy/gef
  • +
  • 介绍:Linux gdb 的一款插件,优化调试体验
  • +
  • 使用:在预装的虚拟机下正常使用 gdb 即可以看到插件效果
  • +
+

……

+

除此外还有一些额外的工具,这些工具会后续补充介绍,或在课程使用时会额外给出讲解。

+
+
+
+ +
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/intro/web-lab1/index.html b/intro/web-lab1/index.html new file mode 100644 index 0000000..79de54c --- /dev/null +++ b/intro/web-lab1/index.html @@ -0,0 +1,337 @@ + + + + + + + + + + +web lab 1: 常见漏洞 - CTF101-Labs-2023 + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+ + + +

Web Lab 1

+

Task 1 (70%)

+

Implement a DNS rebinder:

+
    +
  • resolve normally for common hosts
  • +
  • resolve to different ip addresses (A record) in different responses for certain hosts
  • +
  • low TTL
  • +
+

Task 2 (30%)

+

Finish the challenge SSRF in SchoolBus (https://zjusec.com/challenges/47)

+

(Using the rebinder in Task 1 is not required)

+

What to submit

+

For task 1, code with comments (or additional docs) and a running demo.

+

For task 2, your writeup.

+

PDF is recommended.

+
+
+
+ +
+ +
+
+
+
+ + + + + + \ No newline at end of file diff --git a/js/katex.js b/js/katex.js new file mode 100644 index 0000000..6db5642 --- /dev/null +++ b/js/katex.js @@ -0,0 +1,39 @@ +(function () { + 'use strict'; + + var katexMath = (function () { + var maths = document.querySelectorAll('.arithmatex'), + tex; + + for (var i = 0; i < maths.length; i++) { + tex = maths[i].textContent || maths[i].innerText; + if (tex.startsWith('\\(') && tex.endsWith('\\)')) { + katex.render(tex.slice(2, -2), maths[i], {'displayMode': false}); + } else if (tex.startsWith('\\[') && tex.endsWith('\\]')) { + katex.render(tex.slice(2, -2), maths[i], {'displayMode': true}); + } + } + }); + + (function () { + var onReady = function onReady(fn) { + if (document.addEventListener) { + document.addEventListener("DOMContentLoaded", fn); + } else { + document.attachEvent("onreadystatechange", function () { + if (document.readyState === "interactive") { + fn(); + } + }); + } + }; + + onReady(function () { + if (typeof katex !== "undefined") { + katexMath(); + } + }); + })(); + + }()); + \ No newline at end of file diff --git a/search/search_index.json b/search/search_index.json new file mode 100644 index 0000000..a07e626 --- /dev/null +++ b/search/search_index.json @@ -0,0 +1 @@ +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"\u6b22\u8fce\u6765\u5230\u5b89\u5168\u653b\u9632\u5b9e\u8df5 (CTF) \u77ed\u5b66\u671f","text":"

\u672c\u7f51\u7ad9\u6574\u5408\u4e86\u8bfe\u7a0b\u4e2d\u6240\u6709\u5b9e\u9a8c/\u4f5c\u4e1a\uff0c\u5982\u6709\u7591\u95ee\u8bf7\u53ca\u65f6\u8054\u7cfb\u52a9\u6559/team-aaa@zju.edu.cn\u3002

"},{"location":"#_1","title":"\u5173\u4e8e\u8bfe\u7a0b\u62a5\u540d","text":"

\u6839\u636e\u53bb\u5e74\u8bfe\u7a0b\u7684\u53cd\u9988\uff0c\u6211\u4eec\u8bfe\u7a0b\u7684\u5185\u5bb9\u76f8\u5bf9\u800c\u8a00\u77e5\u8bc6\u70b9\u8f83\u591a\u8f83\u96be\u3002\u4e3a\u4e86\u9009\u8bfe\u5b66\u751f\u7684\u4f53\u9a8c\uff0c\u6b64\u6b21\u9009\u8bfe\u8bbe\u7f6e\u4e00\u4e2a Lab 0\uff0c\u5e76\u5728\u6b64 Lab \u4e2d\u5448\u73b0\u4e86\u5b66\u4e60\u8be5\u8bfe\u7a0b\u5e94\u8be5\u5177\u5907\uff08\u6216\u8005\u8bf4\u5feb\u901f\u4e0a\u624b\uff09\u7684\u57fa\u7840\u77e5\u8bc6\u548c\u6280\u80fd\u3002\u8bf7\u6709\u610f\u5411\u9009\u8bfe\u7684\u540c\u5b66\u5b8c\u6210\u540e\u5c06\u5b9e\u9a8c\u6587\u6863\u63d0\u4ea4\u81f3\u90ae\u7bb1\uff08team-aaa@zju.edu.cn\uff09\u8fdb\u884c\u62a5\u540d\u3002

\u5982\u679c\u51fa\u4e8e\u65f6\u95f4\u539f\u56e0\u65e0\u6cd5\u6309\u65f6\u5b8c\u6210\uff0c\u4e5f\u8bf7\u4e0d\u8981\u614c\u5f20\uff0c\u53ef\u4ee5\u5c06\u672a\u5b8c\u6210\u7684\u62a5\u544a\u540c\u6837\u63d0\u4ea4\uff0c\u6211\u4eec\u5e0c\u671b\u770b\u5230\u7684\u662f\u4e3b\u52a8\u5b66\u4e60\u7684\u6001\u5ea6 :D

\u5982\u679c\u771f\u7684\u5fd9\u5230\u4e00\u70b9\u4e5f\u6ca1\u6709\u65f6\u95f4\uff0c\u4e5f\u201c\u6b22\u8fce\u201d\u5934\u94c1\u9009\u8bfe\uff08\u4e5f\u8bf7\u4e8e\u90ae\u7bb1\u4e2d\u63d0\u4ea4\u62a5\u540d\uff09\uff0c\u51ed\u501f\u7740\u4ed8\u51fa\uff0c\u4e00\u5b9a\u53ef\u4ee5\u5728\u8bfe\u7a0b\u4e2d\u5f97\u5230\u6ee1\u6ee1\u6536\u83b7\u3002

\u6ce8\uff1aLab 0 \u672c\u8eab\u4e5f\u662f\u5c0f\u5b66\u671f\u7684\u9996\u6b21\u4f5c\u4e1a\u3002

\u62a5\u540d\u90ae\u4ef6\u8bf7\u5305\u542b\u4ee5\u4e0b\u5185\u5bb9\uff1a

  • Lab 0 \u7684\u5b9e\u9a8c\u62a5\u544a\uff0c\u5177\u4f53\u8be6\u7ec6\u89c1 Lab 0 \u9875\u9762
  • \u4e2a\u4eba\u4fe1\u606f\uff08\u59d3\u540d\u3001\u5b66\u53f7\u3001\u8054\u7cfb\u65b9\u5f0f\u3001QQ\uff09
  • \uff08\u53ef\u9009\uff09\u4e2a\u4eba\u7b80\u5386\uff08\u6bd4\u5982\u4f60\u5df2\u7ecf\u5b8c\u6210\u4e86\u54ea\u4e9b\u8bfe\uff0c\u4ee5\u53ca\u4efb\u4f55\u4f60\u60f3\u548c\u6211\u4eec\u4f20\u9012\u7684\u4fe1\u606f
"},{"location":"#_2","title":"\u5173\u4e8e\u8bfe\u7a0b\u8865\u9009","text":"

\u5728\u5df2\u7ecf\u622a\u6b62\u65f6\u95f4\uff086\u670811\u65e5\uff09\u540e\u4ecd\u60f3\u53c2\u4e0e\u8865\u9009\u8bfe\u7a0b\u7684\u540c\u5b66\uff0c\u8bf7\u4e8e\u8003\u8bd5\u5468\u524d\u7684\uff086\u670819\u65e5\u4e2d\u534812\u70b9\uff09\u901a\u8fc7\u90ae\u4ef6\u63d0\u4ea4\u8bfe\u7a0b\u62a5\u540d\uff1b\u7ec6\u8282\u540c\u4e0a\u6240\u8ff0\u3002\u8865\u9009\u671f\u95f4\u7684\u540d\u989d\u66f4\u52a0\u6709\u9650\uff0c\u6545\u6211\u4eec\u5c06\u540c\u6837\u6839\u636e\u63d0\u4ea4\u7684\u62a5\u544a/\u7b80\u5386\u8fdb\u884c\u7b5b\u9009\uff0c\u8bf7\u8865\u9009\u7684\u540c\u5b66\u8003\u8651\u505a Lab 0 \u65f6\u7684\u4f53\u9a8c\u505a\u8865\u9009\u51b3\u5b9a\u3002

"},{"location":"#_3","title":"\u8bfe\u7a0b\u4ea4\u6d41\u7fa4","text":"

\u5173\u4e8e\u9009\u8bfe\u3001Lab 0 \u7b49\u4efb\u4f55\u4e0e\u672c\u6b21\u77ed\u5b66\u671f\u8bfe\u7a0b\u6709\u5173\u7684\u95ee\u9898\uff0c\u90fd\u53ef\u4ee5\u52a0 QQ \u7fa4 704639399 \u4ea4\u6d41\u3002

"},{"location":"intro/lab0/","title":"Lab 0\uff1a\u57fa\u7840\u77e5\u8bc6\u53ca\u6280\u80fd","text":"

\u672c\u8bfe\u7a0b\u7684 Lab 0 \u7531\u4e24\u90e8\u5206\u7ec4\u6210:

  • Prerequisite \u90e8\u5206\u4ee5\u53ca
  • Misc, Reverse, Pwn, Web, Crypto \u90e8\u5206\u4e94\u9009\u4e00

\u9f13\u52b1\u591a\u9009\uff0c\u63a2\u7d22\u81ea\u5df1\u611f\u5174\u8da3\u7684\u65b9\u5411\uff01

\u5b8c\u6210\u7684\u62a5\u544a\u8bf7\u547d\u540d\u4e3a lab0_\u59d3\u540d_\u5b66\u53f7.pdf \u4e0e6\u670811\u65e5\u4e2d\u534812\u70b9\u524d\uff0c\u4ee5\u90ae\u4ef6\u9644\u4ef6\u7684\u5f62\u5f0f\u63d0\u4ea4\u5230 team-aaa@zju.edu.cn\uff1b\u5e76\u4e8e\u90ae\u4ef6\u4e2d\u63d0\u4f9b\u4e2a\u4eba\u7684\u8054\u7cfb\u65b9\u5f0f\uff5e

lab\u8fc7\u7a0b\u4e2d\u9047\u5230\u7684\u95ee\u9898\u6216\u8005\u4efb\u4f55\u4e0e\u8bfe\u7a0b\u76f8\u5173\u7684\u95ee\u9898\u6b22\u8fce\u52a0\u5165\u8bfe\u7a0b\u4ea4\u6d41\u7fa4\u8fdb\u884c\u8ba8\u8bba\uff0cQQ \u7fa4\u53f7 704639399\u3002

"},{"location":"intro/lab0/#prerequisite","title":"Prerequisite","text":""},{"location":"intro/lab0/#challange-1","title":"Challange 1","text":"

Linux \u73af\u5883\u7684\u642d\u5efa\u4e0e\u7b80\u5355\u4f7f\u7528

\u53c2\u8003\u96be\u5ea6\uff1a\u2605

\u540e\u7eed\u8bfe\u7a0b\u7684\u8bb8\u591a\u5185\u5bb9\u90fd\u5c06\u5728 Linux \u64cd\u4f5c\u7cfb\u7edf\u7684\u5e73\u53f0\u4e0a\u5b8c\u6210\uff0c\u4e3a\u4e86\u65b9\u4fbf\uff0c\u672c\u6b21\u8bfe\u7a0b\u63d0\u4f9b\u4e86 ubuntu \u865a\u62df\u673a\u4f9b\u4e0b\u8f7d

\u4e0b\u8f7d\u94fe\u63a5\uff08\u5176\u4e2d\u7528\u6237\u540d\u4e3a ctfer\uff0c\u5bc6\u7801\u4e3a aaa\uff09

\u865a\u62df\u673a\u4e2d\u9884\u88c5\u4e86\u8bfe\u7a0b\u4e2d\u5c06\u8981\u7528\u5230\u7684\u5404\u7c7b\u5de5\u5177\u53ca\u73af\u5883\u3002

\u5f53\u7136\uff0c\u5982\u679c\u4f60\u5df2\u7ecf\u62e5\u6709\u4e86\u719f\u6089\u7684 Linux \u73af\u5883\uff0c\u8bf7\u653e\u5fc3\u5927\u80c6\u4f7f\u7528\u3002

\u5177\u5907 Linux \u540e\uff0c\u8bf7\u89c2\u770b Shell \u57fa\u7840\u53ca CLI \u5de5\u5177\u63a8\u8350 - 2023 \u6625\u590f\u8ba1\u7b97\u673a\u5b66\u9662\u670b\u8f88\u8f85\u5b66 \u8bfe\u7a0b\u89c6\u9891\uff0c\u5e76\u5728\u5b9e\u9a8c\u62a5\u544a\u4e2d\u7ed9\u51fa\u4efb\u610f4\u4e2a shell \u547d\u4ee4\u7684\u7528\u6cd5\u4ecb\u7ecd\u4ee5\u53ca\u5728 Linux \u73af\u5883\u4e0b\u7684\u5b9e\u64cd\u622a\u56fe\u3002

hint:

  • Linux \u73af\u5883\u7684\u51c6\u5907\u53ef\u4ee5\u53c2\u8003\u53bb\u5e74\u7684\u8bfe\u7a0b\u5185\u5bb9
"},{"location":"intro/lab0/#challenge-2","title":"Challenge 2","text":"

\u57fa\u7840\u7684 python \u7f16\u7a0b

\u53c2\u8003\u96be\u5ea6\uff1a\u2605

\u540e\u7eed\u7684\u8bfe\u7a0b\u4e2d\u4e0d\u4e4f\u901a\u8fc7\u7f16\u7a0b\u6765\uff1a

  1. \u8282\u7701\u4eba\u529b\u6210\u672c
  2. \u89e3\u51b3\u7279\u5b9a\u95ee\u9898

\u638c\u63e1\u811a\u672c\u8bed\u8a00 python \u4f1a\u8ba9\u8fd9\u4e9b\u4e8b\u534a\u529f\u500d\u3002\u8bf7\u5b8c\u6210\u5982\u4e0b\u4efb\u52a1\uff0c\u5e76\u5728\u5b9e\u9a8c\u62a5\u544a\u4e2d\u7ed9\u51fa\u4f60\u7684\u4ee3\u7801\uff1a

\u5f53\u7136\uff0c\u5373\u4f7f\u4f60\u6ca1\u6709\u5b66\u4e60\u8fc7 python \u4e5f\u65e0\u9700\u614c\u5f20\uff1b\u4f60\u53ef\u4ee5\u901a\u8fc7\u5982\u83dc\u9e1f\u6559\u7a0b\u548c\u5404\u7c7b\u6155\u8bfe\u8fdb\u884c\u7b80\u5355\u7684\u5b66\u4e60\u3002\u4f60\u65e0\u9700\u6210\u4e3a\u4e00\u4e2a python master\uff0c\u57fa\u672c\u7684\u4ee3\u7801\u9605\u8bfb\u80fd\u529b\u4ee5\u53ca\u7f16\u7a0b\u80fd\u529b\u8db3\u4ee5\u4f7f\u4f60\u901a\u8fc7\u6b64\u8bfe\u3002

  1. \u8bf7\u9605\u8bfb\u548c\u6267\u884c\u5982\u4e0b python \u7a0b\u5e8f\uff0c\u5728\u5b9e\u9a8c\u62a5\u544a\u4e2d\u5e76\u89e3\u91ca\u5176\u529f\u80fd:

    #!/usr/bin/python3\ndata = input(\"give me your string: \")\nprint(\"length of string:\", len(data))\ndata_old = data\ndata_new = \"\"\nfor d in data:\nif d in 'abcdefghijklmnopqrstuvwxyz':\ndata_new += chr(ord(d) - 32)\nelif d in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ':\ndata_new += chr(ord(d) + 32)\nelse:\ndata_new += d\nprint(\"now your string:\", data_new)\n

  2. \u8bf7\u901a\u8fc7 python \u7f16\u7a0b\u89e3\u51b3\u6821\u5df4\u4e0a calculator \u8fd9\u9053\u7f16\u7a0b\u9898\uff08\u9700\u8981\u5185\u7f51\u8bbf\u95ee\uff09\uff0c\u5728\u5b9e\u9a8c\u62a5\u544a\u4e2d\u7ed9\u51fa\u5b8c\u6574\u4ee3\u7801\u3001\u6210\u529f\u89e3\u51b3\u7684\u622a\u56fe\u4ee5\u53ca\u6b63\u786e\u7684 flag

hint:

  • \u5982\u679c\u4e0d\u77e5\u9053\u4ece\u54ea\u5f00\u59cb\u53ef\u4ee5\u67e5\u770b\u6211\u4eec\u63d0\u4f9b\u7684\u90e8\u5206\u4ee3\u7801\uff0c\u5df2\u7ecf\u5b8c\u6210\u4e86\u9898\u76ee\u7684\u8fde\u63a5\u4ee5\u53ca\u6570\u636e\u7684\u63a5\u6536
    • \u6216\u8005\u63a8\u8350\u81ea\u5b66\u4f7f\u7528 pwntools \u8fd9\u4e2a CTF \u4e2d\u975e\u5e38\u5e38\u7528\u7684 python \u5305\u8fdb\u884c\u4ea4\u4e92
  • eval \u51fd\u6570\u53ef\u4ee5\u7528\u4e8e\u8ba1\u7b97
"},{"location":"intro/lab0/#challenge-3","title":"Challenge 3\uff08\u9009\u505a\uff09","text":"

\u4e8c\u8fdb\u5236\u76f8\u5173\u7684\u8bfe\u9898\u65b9\u5411\uff08Pwn \u4ee5\u53ca Reverse\uff09\u90fd\u9700\u8981 x86 \u6c47\u7f16\u7684\u77e5\u8bc6\uff0c\u5982\u679c\u5bf9\u8be5\u4e24\u65b9\u5411\u6709\u5174\u8da3\u7684\u8bdd\uff0c\u53ef\u9009\u5b8c\u6210\u8fd9\u4e2a asm tour \u6c47\u7f16\u9898\u76ee\uff0c\u5728\u5b9e\u9a8c\u62a5\u544a\u4e2d\u7ed9\u51fa\u4f60\u7684\u89e3\u9898\u8fc7\u7a0b\u3002

\u5982\u679c\u5b8c\u5168\u6ca1\u6709\u63a5\u89e6\u8fc7\u6c47\u7f16\u8bed\u8a00\uff0c\u4e5f\u65e0\u9700\u62c5\u5fc3\uff0c\u53ef\u4ee5\u5b66\u4e60 hint \u63d0\u5230\u7684\u8d44\u6599\u3002\u5bf9\u6307\u4ee4\u3001\u5bc4\u5b58\u5668\u3001\u8c03\u7528\u89c4\u5b9a\u7b49\u77e5\u8bc6\u505a\u4e2a\u57fa\u672c\u4e86\u89e3\u3002

hint:

  • \u5c0f\u767d\u8001\u5e08\u7684\u6c47\u7f16\u8bfe\u7a0b\u8d44\u6599
  • x86\u7684\u6c47\u7f16\u7b14\u8bb0
"},{"location":"intro/lab0/#web","title":"Web","text":"

\u53c2\u8003\u96be\u5ea6\uff1a\u2605\u2605

\u8bf7\u8bbf\u95ee\u7f51\u5740 http://pumpk1n.com/lab0.php \u8fd9\u4e2a\u795e\u5947\u7684\u9875\u9762\u85cf\u7740\u4e00\u4e2a flag\uff0c\u8bf7\u5c1d\u8bd5\u627e\u5230\u5b83\uff0c\u5e76\u5728\u5b9e\u9a8c\u62a5\u544a\u4e2d\u8bb0\u5f55\u4f60\u7684\u8fc7\u7a0b\u3002

hint:

  • \u6d4f\u89c8\u5668\u4e2d\u7684\u5f00\u53d1\u8005\u5de5\u5177
"},{"location":"intro/lab0/#pwn","title":"Pwn","text":"

\u53c2\u8003\u96be\u5ea6\uff1a\u2605\u2605

  1. \u8bf7\u9605\u8bfb\u9644\u4ef6\u4e2d\u7684 C \u4ee3\u7801 bug_program.c\uff0c\u5c1d\u8bd5\u627e\u5230\u4ee3\u7801\u4e2d\u6240\u6709\u7684BUG\uff0c\u5e76\u5728\u5b9e\u9a8c\u62a5\u544a\u4e2d\u7ed9\u51fa\u63cf\u8ff0
  2. \u9644\u4ef6\u4e2d\u7684 bug_program.elf \u662f Linux \u5e73\u53f0\u4e0a\u7f16\u8bd1\u7684\u53ef\u6267\u884c ELF \u7a0b\u5e8f\uff0c\u8bf7\u5728 Linux \u73af\u5883\u4e0b\u6267\u884c\u8be5\u7a0b\u5e8f\uff0c\u5e76\u5728\u4e0e\u5176\u4ea4\u4e92\u7684\u8fc7\u7a0b\u4e2d\u89e6\u53d1\u627e\u5230\u7684\u6f0f\u6d1e\uff0c\u8fd9\u4e9b\u6f0f\u6d1e\u53ef\u4ee5\u4f7f\u5f97\u7a0b\u5e8f\u5d29\u6e83\u4e48\uff1f
  3. \u8bf7\u4fee\u590d bug_program.c \u4e2d\u53d1\u73b0\u7684\u6f0f\u6d1e\uff0c\u5c06\u65b0\u7684\u4ee3\u7801\u547d\u540d\u4e3a no_program.c \u5e76\u63d0\u4ea4
"},{"location":"intro/lab0/#reverse","title":"Reverse","text":"

\u53c2\u8003\u96be\u5ea6\uff1a\u2605\u2605\u2605

\u53ef\u6076\uff0c\u4e3a\u4ec0\u4e48\u8fd9\u4e2a\u53ef\u6267\u884c\u6587\u4ef6\u65e0\u6cd5\u8fd0\u884c\uff0c\u5176\u4e2d\u7a76\u7adf\u9690\u85cf\u7740\u4ec0\u4e48\u79d8\u5bc6\uff01\uff08\u8be5\u79d8\u5bc6\u4e3a\u4e00\u4e32\u6709\u610f\u4e49\u7684\u5b57\u7b26\u4e32\uff0c\u683c\u5f0f\u4e3a AAA{...}\uff09\uff1a

\u9898\u76ee\u4e0b\u8f7d\u94fe\u63a5

\u4f60\u9700\u8981\u5728\u5b9e\u9a8c\u62a5\u544a\u4e2d\u56de\u7b54\u4ee5\u4e0b\u51e0\u4e2a\u95ee\u9898\uff1a

  1. \u53ef\u6267\u884c\u6587\u4ef6\u7684\u5165\u53e3\u70b9\u5730\u5740\uff08Entry Point Address\uff09\u662f\u591a\u5c11\uff1f
  2. \u53ef\u6267\u884c\u6587\u4ef6\u65e0\u6cd5\u8fd0\u884c\u7684\u539f\u56e0\u662f\u4ec0\u4e48\uff1f\u901a\u8fc7\u4ec0\u4e48\u65b9\u6cd5\u53ef\u4ee5\u8ba9\u5b83\u6b63\u5e38\u8fd0\u884c\uff1f
  3. \u53ef\u6267\u884c\u6587\u4ef6\u4e2d\u9690\u85cf\u7684\u79d8\u5bc6\uff08\u5373\u683c\u5f0f\u4e3a AAA{...} \u7684\u5b57\u7b26\u4e32\uff09\u662f\uff1f\u4f60\u662f\u5982\u4f55\u83b7\u5f97\u5b83\u7684\uff1f

hint:

  • \u9700\u8981\u7b80\u5355\u4e86\u89e3 ELF \u53ef\u6267\u884c\u6587\u4ef6\u7684\u683c\u5f0f\u3001\u52a0\u8f7d\u3001\u94fe\u63a5\u6267\u884c
  • \u5982\u679c\u78b0\u5230\u4e86 GLIBC_2.34 not found \u7684\u62a5\u9519\uff0c\u8bf7\u4e0b\u8f7d\u6b64\u7248\u672c\u7684\u9898\u76ee\u9644\u4ef6\uff0c\u94fe\u63a5
"},{"location":"intro/lab0/#misc","title":"Misc","text":""},{"location":"intro/lab0/#challenge-1","title":"Challenge 1","text":"

\u53c2\u8003\u96be\u5ea6\uff1a\u2605

\u8fd9\u91cc\u6709\u4e00\u4e32\u88ab\u7f16\u7801\u8fc7\u7684\u795e\u79d8\u7684\u5b57\u7b26\u4e32\uff0c\u8bf7\u627e\u51fa\u6709\u610f\u4e49\u7684\u539f\u5b57\u7b26\u4e32\uff08\u683c\u5f0f\u4e3a AAA{...}\uff09\uff1a

8Q%uH7oV9C7o!2f7oD*@8Oc$J2Gu:s:JO2T78HTV8PrVj9/]^B:0'e_6SgJh7n,=8;)V$M:Gkm:92eJR8Oc-;;`$6b:Gk[5=]\\L#7mT%14Ztqk\n

\u8bf7\u5728\u5b9e\u9a8c\u62a5\u544a\u4e2d\u7ed9\u51fa\u4f60\u5177\u4f53\u7684\u89e3\u5bc6\u8fc7\u7a0b\u3002

hint:

  • \u4f60\u53ef\u80fd\u4f1a\u9700\u8981 CyberChef\uff08\u800c\u4e14\u8fd9\u91cc\u6709\u4e00\u4e2a\u529f\u80fd\u53ef\u4ee5\u79d2\u6740\u8fd9\u4e2a\u9898\u76ee\uff09
  • \u4f60\u53ef\u80fd\u9700\u8981\u4e86\u89e3\u4e00\u4e9b\u5173\u4e8e Base \u7cfb\u5217\u7f16\u7801\u7684\u7279\u5f81
"},{"location":"intro/lab0/#challenge-2_1","title":"Challenge 2","text":"

\u53c2\u8003\u96be\u5ea6\uff1a\u2605\u2605\u2605

\u4e0b\u9762\u8fd9\u5f20\u56fe\u662f AAA \u7684 logo\u3002\u771f\u7684\u2026\u2026\u53ea\u662f\u4e00\u4e2a logo \u5417\uff1f\u5176\u5b9e\u8fd9\u5f20\u56fe\u7247\u4e2d\u9690\u85cf\u4e86\u4e00\u4e2a flag\uff08\u683c\u5f0f AAA{...}\uff09\uff0c\u8bf7\u4f60\u627e\u51fa\u6765\u3002

\u8bf7\u5728\u5b9e\u9a8c\u62a5\u544a\u4e2d\u7ed9\u51fa\u4f60\u7684\u89e3\u9898\u8fc7\u7a0b\uff0c\u5305\u62ec\u4f60\u6700\u7ec8\u5f97\u5230\u7684 flag \u5185\u5bb9\u3002

hint\uff1a

  • flag \u88ab\u5206\u4e3a\u4e86\u4e24\u4e2a\u90e8\u5206
  • \u5982\u679c\u4f60\u627e\u4e0d\u5230\u7b2c\u4e00\u90e8\u5206\uff0c\u4ed4\u7ec6\u89c2\u5bdf\u56fe\u7247\uff0c\u8fd9\u4f7f\u7528\u4e86\u4e00\u79cd\u6700\u57fa\u7840\u7684\u56fe\u7247\u9690\u5199\u6280\u672f LSB \u9690\u5199\uff0c\u8bf7\u81ea\u884c\u641c\u7d22\u5b66\u4e60\u5982\u4f55\u7834\u89e3
  • \u5982\u679c\u4f60\u627e\u4e0d\u5230\u7b2c\u4e8c\u90e8\u5206\uff0c\u8bf7\u4ed4\u7ec6\u67e5\u770b\u6587\u4ef6\u5185\u5bb9
"},{"location":"intro/lab0/#crypto","title":"Crypto","text":""},{"location":"intro/lab0/#_1","title":"\u9898\u76ee\u76f8\u5173\u80cc\u666f\u77e5\u8bc6","text":"

AES\u662f\u4e00\u79cd\u5bf9\u79f0\u52a0\u5bc6\u673a\u5236\uff0c\u6bd4RSA\u8fd9\u6837\u7684\u975e\u5bf9\u79f0\u52a0\u5bc6\u5feb\u8bb8\u591a\u3002\u7531\u4e8e\u672c\u9898\u53ea\u6d89\u53ca AddRoundKey \u548c Substitution Bytes \u5185\u5bb9\uff0c\u6240\u4ee5\u53ea\u5bf9\u5b9e\u9a8c\u76f8\u5173\u90e8\u5206\u8fdb\u884c\u7b80\u8981\u8bf4\u660e\uff0c\u800c AES \u7684\u5b8c\u6574\u7ec6\u8282\u53ef\u4ee5\u5728\u8fd9\u91cc\u9605\u8bfb\u5b66\u4e60\u3002

"},{"location":"intro/lab0/#bytes2matrix","title":"bytes2matrix","text":"

\u7531\u4e8e AES \u7684\u52a0\u5bc6\u8fc7\u7a0b\u4e2d\u7684\u72b6\u6001\u7528\u4e00\u4e2a 4x4 \u7684\u5b57\u8282\u77e9\u9635\uff0c\u6240\u4ee5\u5bf9\u4e8e\u5b57\u7b26\u4e32\u5f62\u5f0f\u7684\u660e\u6587\uff0c\u9996\u5148\u9700\u8981\u628a\u5176\u8868\u793a\u4e3a\u4e00\u4e2a 4x4 \u7684\u5b57\u8282\u77e9\u9635\uff08\u5bf9\uff0c\u5c31\u662f\u7ebf\u6027\u4ee3\u6570\u91cc\u90a3\u4e2a\u77e9\u9635\uff09\uff0c\u5bf9\u5e94\u9898\u76ee\u4ee3\u7801\u4e2d\u7684 bytes2matrix\uff0c\u7136\u540e\u8fdb\u884c\u540e\u7eed\u52a0\u5bc6\u6d41\u7a0b\u3002

\u8be5\u90e8\u5206\u7684\u4ee3\u7801\u5df2\u7ecf\u7ed9\u51fa\uff0c\u4e0d\u9700\u8981\u4f60\u8865\u5168\uff0c\u4e0a\u8ff0\u6587\u5b57\u53ea\u662f\u8f85\u52a9\u7406\u89e3\u3002

"},{"location":"intro/lab0/#addroundkey","title":"AddRoundKey","text":"

AddRoundKey \u6b65\u9aa4\u5f88\u7b80\u5355\uff1a\u5b83\u5c06\u5f53\u524d\u72b6\u6001(4x4 \u7684\u5b57\u8282\u77e9\u9635)\u4e0e\u5f53\u524d\u8f6e\u5bc6\u94a5(4x4 \u7684\u5b57\u8282\u77e9\u9635)\u8fdb\u884c\u5f02\u6216\u8fd0\u7b97\u3002

\u5f02\u6216\u9700\u8981\u7528\u5230\u7684\u8f6e\u5bc6\u94a5\u5df2\u7ecf\u7ed9\u51fa\uff0c\u5bf9\u5e94\u9898\u76ee\u4ee3\u7801\u4e2d\u7684 round_key\uff0c\u4f60\u53ea\u9700\u8981 add_round_key \u4e2d\u7684\u8865\u5168\u5f02\u6216\u7b97\u6cd5\u5373\u53ef\u3002\uff08\u4e0d\u8d85\u8fc7\u4e09\u884c\u2757\ufe0f\uff09

"},{"location":"intro/lab0/#subbytes","title":"SubBytes","text":"

\u5c06\u72b6\u6001\u77e9\u9635\u7684\u6bcf\u4e2a\u5b57\u8282\u66ff\u6362\u4e3a\u9884\u8bbe 16x16 \u67e5\u627e\u8868\u4e2d\u7684\u4e0d\u540c\u5b57\u8282\u3002\u67e5\u627e\u8868\u79f0\u4e3a\u201cSubstitution box\u201d\u6216\u7b80\u79f0\u201cS-box\u201d\uff0c\u6216\u8bb8\u4f60\u53ef\u80fd\u4f1a\u5bf9\u4e3a\u4ec0\u4e48\u52a0\u5bc6\u8fc7\u7a0b\u4e2d\u9700\u8981 substitution \u611f\u5230\u7591\u60d1\uff0c\u6ca1\u5173\u7cfb\u76ee\u524d\u4e0d\u9700\u8981\u7406\u89e3\u76f8\u5173\u5185\u5bb9\u3002\u5982\u679c\u4e00\u53e5\u8bdd\u6982\u62ec\u539f\u56e0\uff0c\u662f\u4e3a\u4e86\u4f7f\u5f97AES\u7684\u8f93\u5165\u8f93\u51fa\u4e4b\u95f4\u5177\u6709\u9ad8\u7684\u201c\u975e\u7ebf\u6027\u6027\u201d\u3002

\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0csubstitution \u7684\u7b97\u6cd5\u5728\u52a0\u5bc6\u548c\u89e3\u5bc6\u8fc7\u7a0b\u4e2d\u5e76\u6ca1\u6709\u4e0d\u540c\uff0c\u53ea\u662f\u4f7f\u7528\u7684 S-box \u53d8\u6210\u4e86\u539f S-box \u7684\u9006\u800c\u5df2\u3002\u4e3a\u4e86\u4f7f\u5f97\u9898\u76ee\u770b\u8d77\u6765\u77ed\u4e00\u4e9b\uff0c\u6211\u5220\u9664\u4e86\u52a0\u5bc6\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u7684 S-box\uff0c\u53ea\u7ed9\u51fa\u4e86\u52a0\u5bc6\u7684 S-box \u7684\u9006\uff0c\u5bf9\u5e94\u9898\u76ee\u4ee3\u7801\u4e2d\u7684 inv_s_box\u3002\u4f60\u53ea\u9700\u8981\u8865\u5168 sub_bytes \u51fd\u6570\u5373\u53ef\u3002\uff08\u540c\u6837\u4e0d\u8d85\u8fc7\u4e09\u884c\u2757\ufe0f\uff09

"},{"location":"intro/lab0/#challenge","title":"Challenge","text":"

\u53c2\u8003\u96be\u5ea6\uff1a\u2605\u2605

\u9898\u76ee\u4e0b\u8f7d\u94fe\u63a5

\u4e0a\u9898\u662f\u5bf9AES\u7684\u7b80\u5355\u62bd\u8c61\uff0c\u5176\u4e2d\u9700\u8981\u4f60\u8865\u5168\u7684 add_round_key \u548c sub_bytes \u4ee3\u7801\u7b26\u5408AES\u7684 AddRoundKey \u548c SubBytes \u7684\u6807\u51c6\u5b9e\u73b0\uff0c\u8bf7\u4f60\u9605\u8bfb\u4e0a\u8ff0\u80cc\u666f\u6216\u67e5\u9605\u76f8\u5173\u6587\u6863\uff0c\u5b9e\u73b0\u8fd9\u4e24\u4e2a\u51fd\u6570\u3002\u5982\u679c\u5b9e\u73b0\u6b63\u786e\u4f1a\u8f93\u51fa\u683c\u5f0f\u4e3a AAA{...} \u7684 flag\u3002

\u8bf7\u5728\u5b9e\u9a8c\u62a5\u544a\u4e2d\u7ed9\u51fa\u4f60\u7684\u89e3\u9898\u8fc7\u7a0b\uff0c\u5305\u62ec\u4f60\u6700\u7ec8\u5f97\u5230\u7684 flag \u5185\u5bb9\u3002

hint:

  • \u4e00\u5171\u5c31\u4e0d\u8d85\u8fc7 10 \u884c\u4ee3\u7801\uff0c\u5927\u6982\u4e0d\u9700\u8981 hint\uff1b\u5982\u679c\u771f\u7684\u9700\u8981\uff0c\u8bf7\u641c\u7d22\u4e00\u4e0b AES \u76f8\u5173\u6587\u6863\u548c\u4ee3\u7801\u5b9e\u73b0\u3002
"},{"location":"intro/misc-lab1/","title":"Misc Lab 1\uff1a\u7f16\u89e3\u7801\u53ca OSINT","text":"

\u672c\u8282 Lab \u7531\u4ee5\u4e0b\u4e24\u90e8\u5206\u7ec4\u6210\uff1a

  • Task 1: \u4e71\u7801\u60c5\u5f62\u63a2\u7a76\uff0860 \u5206\uff09
  • \u4e24\u9053\u9898\u76ee\u4e8c\u9009\u4e00\u5b8c\u6210\uff0840 \u5206\uff0c\u591a\u505a\u4e3a bonus\uff09
    • Challenge 1: \u7c7b\u7ef4\u5409\u5c3c\u4e9a\u5bc6\u7801\u7834\u89e3
    • Challenge 2: OSINT \u56fe\u7247\u4fe1\u606f\u641c\u96c6\u5b9e\u6218

\u5177\u4f53\u5b9e\u9a8c\u62a5\u544a\u9700\u8981\u5199\u7684\u5185\u5bb9\u4f1a\u5728\u4e0b\u9762\u5177\u4f53\u9898\u76ee\u91cc\u9762\u63cf\u8ff0\u3002\u5bf9\u4e8e\u9898\u76ee\u6709\u4efb\u4f55\u95ee\u9898\u90fd\u53ef\u4ee5\u5728\u7fa4\u91cc/\u79c1\u6233 TonyCrane \u63d0\u95ee\u3002

\u672c\u6b21 lab \u7684 ddl \u5728\u53d1\u5e03\u4e24\u5468\u4ee5\u540e\u5373 7 \u6708 21 \u65e5\u665a 23:59\uff0c\u8bf7\u6ce8\u610f\u5b89\u6392\u65f6\u95f4\u3002

"},{"location":"intro/misc-lab1/#task-1","title":"Task 1","text":""},{"location":"intro/misc-lab1/#background","title":"Background","text":"

\u6211\u4eec\u8bfe\u4e0a\u4ecb\u7ecd\u4e86\u5b57\u7b26\u7f16\u7801\u7684\u610f\u4e49\uff0c\u5e76\u4e14\u8f83\u4e3a\u8be6\u7ec6\u7684\u8bb2\u89e3\u4e86 ASCII\u3001Latin-1\u3001Unicode \u4ee5\u53ca\u7cfb\u5217\u7f16\u7801\u7684\u539f\u7406\u3002\u5728\u8fd9\u4e2a\u4efb\u52a1\u4e2d\uff0c\u4f60\u5c06\u9700\u8981\u81ea\u884c\u67e5\u9605\u8d44\u6599\u4e86\u89e3 GB 2312\u3001GBK\u3001GB 18030 \u7b49\u56fd\u6807\u7801\u7684\u7f16\u7801\u65b9\u5f0f\u3002\u4e4b\u540e\u8fdb\u4e00\u6b65\u63a2\u7d22\u4e86\u89e3\u5404\u79cd\u60c5\u51b5\u4e71\u7801\u4ea7\u751f\u7684\u539f\u56e0\uff0c\u601d\u8003\u6062\u590d\u4e71\u7801\u7684\u53ef\u80fd\u6027\u3002

"},{"location":"intro/misc-lab1/#gb","title":"GB \u7cfb\u5217\u7f16\u7801","text":"

\u8fd9\u90e8\u5206\u7559\u7ed9\u5927\u5bb6\u81ea\u884c\u67e5\u9605\u8d44\u6599\u4e86\u89e3\u3002\u4f60\u9700\u8981\u77e5\u9053\u7684\u662f GB 2312\u3001GBK\u3001GB 18030 \u89c4\u5b9a\u4e86\u4e09\u4e2a\u4e0d\u540c\u5927\u5c0f\u7684\u5b57\u7b26\u96c6\uff0c\u4ee5\u53ca\u9488\u5bf9\u6bcf\u4e2a\u5b57\u7b26\u7684\u7f16\u7801\u3002\u4e14 GB 18030 \u517c\u5bb9 GBK \u517c\u5bb9 GB 2312 \u517c\u5bb9 ASCII\u3002\u66f4\u591a\u7ec6\u8282\u53ef\u4ee5\u81ea\u884c\u67e5\u9605\u6807\u51c6\u6587\u4ef6\u3001\u4ecb\u7ecd\u535a\u5ba2\u7b49\u3002

"},{"location":"intro/misc-lab1/#_1","title":"\u4e71\u7801\u539f\u56e0","text":"

\u8bfe\u4e0a\u6211\u4eec\u8bb2\u8fc7\u4e86\uff0c\u901a\u8fc7\u4e00\u79cd\u5b57\u7b26\u7f16\u7801\u6765\u89e3\u8bfb\u53e6\u4e00\u79cd\u5b57\u7b26\u7f16\u7801\u7684\u5b57\u8282\u6d41\uff0c\u5c31\u4f1a\u5bfc\u81f4\u89e3\u8bfb\u51fa\u6765\u7684\u5b57\u7b26\u5e76\u975e\u9884\u671f\uff0c\u4ece\u800c\u4ea7\u751f\u6240\u8c13\u201c\u4e71\u7801\u201d\u3002\u8fd9\u91cc\u6211\u4eec\u5c06\u63a2\u7a76\u4e00\u4e0b\u5177\u4f53\u7684\u539f\u56e0\u3002

\u5e38\u89c1\u60c5\u51b5\u4e0b\u6709\u4ee5\u4e0b\u51e0\u79cd\u60c5\u5f62\uff1a

  1. \u7528 GBK \u89e3\u7801 UTF-8 \u7f16\u7801\u7684\u6587\u672c
  2. \u7528 UTF-8 \u89e3\u7801 GBK \u7f16\u7801\u7684\u6587\u672c
  3. \u7528 latin-1 \u89e3\u7801 UTF-8 \u7f16\u7801\u7684\u6587\u672c
  4. \u7528 latin-1 \u89e3\u7801 GBK \u7f16\u7801\u7684\u6587\u672c
  5. \u5148\u7528 GBK \u89e3\u7801 UTF-8 \u7f16\u7801\u7684\u6587\u672c\uff0c\u518d\u7528 UTF-8 \u89e3\u7801\u524d\u9762\u7684\u7ed3\u679c
  6. \u5148\u7528 UTF-8 \u89e3\u7801 GBK \u7f16\u7801\u7684\u6587\u672c\uff0c\u518d\u7528 GBK \u89e3\u7801\u524d\u9762\u7684\u7ed3\u679c

\u6ce8\u610f\u8981\u60f3\u9020\u6210\u4e71\u7801\uff0c\u4e00\u5b9a\u8bf4\u660e\u5b57\u7b26\u7f16\u7801\u4e4b\u95f4\u5b58\u5728\u4e0d\u517c\u5bb9\u90e8\u5206\uff0c\u56e0\u6b64\u8fd9\u51e0\u79cd\u7f16\u7801\u4e92\u76f8\u517c\u5bb9\u7684 ASCII \u7f16\u7801\u4e00\u5b9a\u4e0d\u4f1a\u51fa\u73b0\u4e71\u7801\uff0c\u800c\u4e2d\u6587\u6587\u672c\u5219\u4f1a\u51fa\u73b0\u4e71\u7801\u3002

\u4e0b\u9762\u6211\u4f1a\u4ecb\u7ecd\u51e0\u79cd\u7814\u7a76\u4e71\u7801\u7684\u65b9\u5f0f\uff0c\u4f9b\u5927\u5bb6\u53c2\u8003\u3002

"},{"location":"intro/misc-lab1/#vscode","title":"vscode","text":"

\u521b\u5efa\u4e00\u4e2a\u6587\u672c\u6587\u4ef6\uff0c\u4f7f\u7528 vscode \u6253\u5f00\uff0c\u5728\u53f3\u4e0b\u89d2\u4f60\u4f1a\u770b\u5230\u6587\u4ef6\u7684\u7f16\u7801\u65b9\u5f0f\uff08\u4e00\u822c\u60c5\u51b5\u4e0b\u9ed8\u8ba4\u4e3a UTF-8\uff09\uff0c\u8bf4\u660e\u6b64\u65f6\u6587\u4ef6\u5b58\u50a8\u7684\u4e8c\u8fdb\u5236\u4e3a UTF-8 \u7f16\u7801\u7684\u5b57\u8282\u6d41\u3002\u8fd9\u65f6\u4f60\u53ef\u4ee5\u70b9\u51fb\u8fd9\u4e2a\u4f4d\u7f6e\uff0c\u9009\u62e9\u201c\u901a\u8fc7\u7f16\u7801\u91cd\u65b0\u6253\u5f00\uff08Reopen with Encoding\uff09\u201d\uff0c\u9009\u62e9 GBK \u7f16\u7801\uff0c\u8fd9\u6837\u4f60\u6240\u770b\u89c1\u7684\u5c31\u662f\u5c06\u539f\u6709\u6587\u4ef6\u5b57\u8282\u6d41\u901a\u8fc7 GBK \u7f16\u7801\u89e3\u6790\u51fa\u6765\u7684\u5b57\u7b26\uff08\u5373\u524d\u9762\u8bf4\u5230\u7684\u7b2c 1 \u79cd\u60c5\u51b5\uff09\uff0c\u4e0d\u51fa\u610f\u5916\u5b83\u5e94\u8be5\u662f\u4e71\u7801\u3002

\u6216\u8bb8\u4f60\u4e5f\u4f1a\u53d1\u73b0\u8fd8\u6709\u4e00\u4e2a\u9009\u9879\u4e3a\u201c\u901a\u8fc7\u7f16\u7801\u4fdd\u5b58\uff08Save with Encoding\uff09\u201d\uff0c\u5b83\u7684\u4f5c\u7528\u5c31\u662f\u5c06\u4f60\u73b0\u5728\u770b\u5230\u7684\u5b57\u7b26\u901a\u8fc7\u5236\u5b9a\u7684\u7f16\u7801\u65b9\u5f0f\u91cd\u65b0\u7f16\u7801\u4e3a\u5b57\u8282\u6d41\uff0c\u7136\u540e\u4fdd\u5b58\u56de\u6587\u4ef6\u4e2d\u3002\u6bd4\u5982\u7ee7\u7eed\u4e0a\u4e00\u6b65\uff0c\u6211\u4eec\u770b\u5230\u4e86\u4e71\u7801\uff0c\u7136\u540e\u9009\u62e9\u901a\u8fc7\u7f16\u7801\u4fdd\u5b58\uff0c\u9009\u62e9 GBK\uff0c\u770b\u8d77\u6765\u6ca1\u6709\u4efb\u4f55\u4e8b\u60c5\u53d1\u751f\u3002\u63a5\u4e0b\u6765\u518d\u9009\u62e9\u901a\u8fc7\u7f16\u7801\u91cd\u65b0\u6253\u5f00\uff0c\u9009\u62e9 UTF-8\uff0c\u4f60\u6216\u8bb8\u4f1a\u89c9\u5f97\u6b64\u65f6\u6062\u590d\u4e86\u6b63\u5e38\uff0c\u4f46\u6709\u4e00\u4e9b\u4f4d\u7f6e\u7684\u5b57\u7b26\u53d8\u6210\u4e86\u5947\u602a\u7684\u7b26\u53f7\uff0c\u8fd9\u79cd\u60c5\u51b5\u5c31\u662f\u524d\u9762\u8bf4\u5230\u7684\u7b2c 5 \u4e2d\u60c5\u51b5\u3002

\u540c\u7406\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7\u540c\u6837\u7684\u65b9\u5f0f\u7814\u7a76\u5176\u4ed6\u56db\u79cd\u4e71\u7801\u3002

"},{"location":"intro/misc-lab1/#_2","title":"\u89c2\u5bdf\u5341\u516d\u8fdb\u5236","text":"

\u524d\u9762\u6211\u4eec\u53ea\u770b\u5230\u4e86\u89e3\u7801\u7684\u7ed3\u679c\uff0c\u800c\u6ca1\u6709\u770b\u5230\u6587\u4ef6\u5b58\u50a8\u5b57\u8282\u6d41\u7684\u5185\u5bb9\u3002\u5c06\u5b57\u8282\u6d41\u548c\u89e3\u7801\u5f97\u5230\u7684\u5b57\u7b26\u5173\u8054\u8d77\u6765\u53ef\u4ee5\u66f4\u597d\u7684\u7406\u89e3\u4e71\u7801\u4ea7\u751f\u7684\u539f\u56e0\u3002\u56e0\u6b64\u6211\u4eec\u53ef\u4ee5\u5728 vscode \u7684\u57fa\u7840\u4e0a\u518d\u4f7f\u7528\u5341\u516d\u8fdb\u5236\u7f16\u8f91\u5668\u6765\u67e5\u770b\u6587\u4ef6\u6d41\u7684\u5185\u5bb9\uff0c\u8fdb\u884c\u6bd4\u5bf9\u3002

"},{"location":"intro/misc-lab1/#cyberchef","title":"CyberChef","text":"

\u6211\u4eec\u8bfe\u4e0a\u63d0\u5230\u4e86\uff0cCyberChef \u7684 Input \u548c Output \u7a97\u683c\u5f88\u6e05\u6670\u5730\u589e\u52a0\u4e86\u5b57\u7b26\u7f16\u7801\u7684\u9009\u9879\uff0c\u56e0\u6b64\u53ef\u4ee5\u5f88\u65b9\u4fbf\u5730\u8fdb\u884c\u7f16\u7801\u7684\u8f6c\u6362\u3002

\u4f46\u662f CyberChef \u4e5f\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u8fd9\u4e2a\u95ee\u9898\u548c\u5904\u7406 UTF-8 \u9519\u8bef\u7f16\u7801\u6709\u5173\uff0c\u5173\u4e8e UTF-8 \u9519\u8bef\u7f16\u7801\u7684\u66f4\u591a\u4fe1\u606f\u540e\u9762\u9a6c\u4e0a\u5c31\u4f1a\u8bf4\u5230\u3002\u8fd9\u662f\u4e00\u4e2a bonus\uff0c\u5982\u679c\u4f60\u80fd\u591f\u7406\u89e3\u4e3a\u4ec0\u4e48 CyberChef \u548c vscode \u9488\u5bf9\u7b2c\u4e8c\u79cd\u60c5\u51b5\u7684\u4e71\u7801\u7ed3\u679c\u4e0d\u4e00\u6837\uff0c\u4f60\u5c06\u5f97\u5230 bonus\u3002

"},{"location":"intro/misc-lab1/#python","title":"python","text":"

\u5229\u7528 python \u4e5f\u53ef\u4ee5\u8fdb\u884c\u7f16\u7801\u7684\u8f6c\u6362\uff0c\u8fd9\u91cc\u662f\u4e00\u4e9b\u4f8b\u5b50\uff1a

In [1]: \"\u6d4b\u8bd5\".encode(\"UTF-8\").decode(\"GBK\") # \u7b2c\u4e00\u79cd\u60c5\u51b5\u7684\u4e71\u7801\nOut[1]: '\u5a34\u5b2d\u762f'\nIn [2]: \"\u6d4b\u8bd5\".encode(\"UTF-8\")  # \u7528 UTF-8 \u7f16\u7801\u7f16\u7801 \u201c\u6d4b\u8bd5\u201d\nOut[2]: b'\\xe6\\xb5\\x8b\\xe8\\xaf\\x95'\nIn [3]: \"\u5a34\u5b2d\u762f\".encode(\"GBK\")  # \u7528 GBK \u7f16\u7801\u7f16\u7801 \u201c\u5a34\u5b2d\u762f\u201d\nOut[3]: b'\\xe6\\xb5\\x8b\\xe8\\xaf\\x95'\nIn [4]: bin(0xe6), bin(0xb5), bin(0x8b) # \u5c06\u5341\u516d\u8fdb\u5236\u8f6c\u6362\u4e3a\u4e8c\u8fdb\u5236\nOut[4]: ('0b11100110', '0b10110101', '0b10001011')\nIn [5]: hex(0b0110_110101_001011)   # \u624b\u52a8\u89e3\u7801 UTF-8 \u5f97\u5230 Unicode \u7801\u4f4d\nOut[5]: '0x6d4b'\nIn [6]: \"\\u6d4b\"    # \u5c06 Unicode \u7801\u4f4d\u8f6c\u6362\u4e3a\u5b57\u7b26\nOut[6]: '\u6d4b'\n
"},{"location":"intro/misc-lab1/#utf-8","title":"UTF-8 \u89e3\u7801\u9519\u8bef","text":"

\u6211\u4eec\u8bfe\u4e0a\u8bb2\u5230\u4e86 Latin-1 \u7f16\u7801\u53ef\u4ee5\u89e3\u7801\u4efb\u610f\u5b57\u8282\u6d41\uff0c\u4f46 UTF-8 \u4e0d\u80fd\uff0c\u5b83\u7684\u7f16\u7801\u60c5\u51b5\u53ea\u6709\u4ee5\u4e0b\u56db\u79cd\uff1a

  • 0xxxxxxx
  • 110xxxxx 10xxxxxx
  • 1110xxxx 10xxxxxx 10xxxxxx
  • 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

\u6240\u4ee5\u5982\u679c\u4e00\u4e2a\u5b57\u7b26\u5f00\u5934\u5c31\u51fa\u73b0\u4e86 10xxxxxx \u8fd9\u6837\u7684\u5b57\u8282\uff0cUTF-8 \u5c31\u4e0d\u77e5\u9053\u8be5\u600e\u4e48\u89e3\u7801\u4e86\u3002\u5176\u4ed6\u60c5\u51b5\u4e5f\u4f1a\u5f15\u8d77 UTF-8 \u89e3\u7801\u9519\u8bef\u3002

Python \u5904\u7406\u8fd9\u79cd\u9519\u8bef\u7684\u9ed8\u8ba4\u65b9\u6cd5\u662f\u76f4\u63a5\u629b\u51fa UnicodeDecodeError\uff0c\u5927\u90e8\u5206\u60c5\u51b5\u4e0b\u662f\u4e0d\u65b9\u4fbf\u7684\uff0c\u6240\u4ee5\u4e00\u822c\u60c5\u51b5\u7684\u5904\u7406\u65b9\u5f0f\u662f\u9488\u5bf9\u9519\u8bef\u7684\u5b57\u8282\u6d41\u8fdb\u884c\u66ff\u6362\uff0c\u6bd4\u5982\u5c06\u9519\u8bef\u7684\u5b57\u8282\u6d41\u66ff\u6362\u4e3a U+FFFD\uff08\u5373 \ufffd\uff09\uff0c\u8fd9\u4e5f\u662f\u4e00\u4e9b\u53e4\u602a\u4e71\u7801\u7684\u6765\u6e90\u4e4b\u4e00\u3002

\u524d\u9762\u63d0\u5230\u4e86 CyberChef \u5e76\u6ca1\u6709\u91c7\u7528\u8fd9\u79cd\u5904\u7406\u65b9\u5f0f\uff0c\u5b83\u5c06\u9519\u8bef\u7684\u5b57\u8282\u4e5f\u89e3\u7801\u4e3a\u4e86\u5176\u4ed6\u5947\u602a\u7684\u5b57\u7b26\uff0c\u8bf7\u4f60\u7814\u7a76\u5176\u4e2d\u7684\u539f\u7406\uff0c\u8fd9\u662f\u4e00\u4e2a bonus\u3002

"},{"location":"intro/misc-lab1/#task","title":"Task","text":"

\u90a3\u4e48\u603b\u7ed3\u4e00\u4e0b\u4f60\u9700\u8981\u505a\u7684\u4e8b\u60c5\uff1a

  1. \u901a\u8fc7\u4f60\u559c\u6b22\u7684\u65b9\u5f0f\u590d\u73b0\u524d\u9762\u63d0\u5230\u7684\u516d\u79cd\u4e71\u7801\u60c5\u51b5\uff08\u6bcf\u79cd 5 \u5206\uff0c\u5171 30 \u5206\uff09
  2. \u56de\u7b54\u4ee5\u4e0b\u95ee\u9898\uff1a
    • \u5728\u81ea\u884c\u7814\u7a76\u4e86 GB \u7cfb\u5217\u7f16\u7801\u540e\uff0c\u8bf7\u9610\u8ff0 GB \u7cfb\u5217\u662f\u5982\u4f55\u5b9e\u73b0\u4e09\u4e2a\u7248\u672c\u517c\u5bb9\u7684\uff0810 \u5206\uff09
    • \u9488\u5bf9\u516d\u79cd\u4e71\u7801\u60c5\u51b5\uff0c\u54ea\u4e9b\u662f\u4f60\u89c9\u5f97\u53ef\u4ee5\u6062\u590d\u7684\uff0c\u54ea\u4e9b\u662f\u4e0d\u53ef\u4ee5\u6062\u590d\u7684\uff0810 \u5206\uff09
      • \u8fd9\u91cc\u6211\u4eec\u9ed8\u8ba4\u89e3\u7801\u4e4b\u540e\u540c\u65f6\u7528\u8fd9\u79cd\u7f16\u7801\u65b9\u5f0f\u91cd\u65b0\u7f16\u7801\uff0c\u5e76\u4fdd\u5b58\u5b57\u8282\u6d41\u5230\u6587\u4ef6
    • \u4e00\u4e2a\u8001\u751f\u5e38\u8c08\u7684\u4e71\u7801\u201c\u951f\u65a4\u62f7\u201d\uff0c\u5b9e\u9a8c\u4e4b\u540e\u4f60\u5e94\u8be5\u4e86\u89e3\u4e86\u5b83\u5230\u5e95\u662f\u600e\u4e48\u4ea7\u751f\u7684\uff0c\u8bf7\u89e3\u91ca\u4e3a\u4ec0\u4e48\u4f1a\u4ea7\u751f\u8fd9\u4e2a\u4e71\u7801\uff0c\u4ee5\u53ca\u4e3a\u4ec0\u4e48\u662f\u8fd9\u4e09\u4e2a\u7279\u5b9a\u7684\u6c49\u5b57\uff0810 \u5206\uff09
  3. bonus\uff1a\u901a\u8fc7\u63a2\u7a76\uff0c\u89e3\u91ca\u6e05\u695a CyberChef \u662f\u600e\u4e48\u5904\u7406 UTF-8 \u89e3\u7801\u9519\u8bef\u7684\uff0810 \u5206\uff09
"},{"location":"intro/misc-lab1/#challenge-1","title":"Challenge 1","text":""},{"location":"intro/misc-lab1/#background_1","title":"Background","text":"

\u6211\u4eec\u8bfe\u4e0a\u4ecb\u7ecd\u4e86\u7ef4\u5409\u5c3c\u4e9a\uff08Vigenere\uff09\u5bc6\u7801\uff0c\u8bb0\u660e\u6587\u4e3a \\(\\mathbf{P}\\)\u3001\u5bc6\u6587\u4e3a \\(\\mathbf{C}\\)\u3001\u5bc6\u94a5\u4e3a \\(\\mathbf{k}\\)\uff0c\u5176\u52a0\u89e3\u5bc6\u65b9\u5f0f\u4e3a\uff1a

  • \u52a0\u5bc6\uff1a\\(\\mathbf{C}_i = (\\mathbf{P}_i + \\mathbf{k}_i) \\bmod 26\\)
  • \u89e3\u5bc6\uff1a\\(\\mathbf{P}_i = (\\mathbf{C}_i - \\mathbf{k}_i) \\bmod 26\\)

\u8fd9\u91cc\u6211\u4eec\u5c06\u5176\u8fdb\u884c\u6269\u5c55\uff0c\u5c06\u5b57\u7b26\u96c6\u4ece 26 \u4e2a\u5b57\u6bcd\u6269\u5c55\u5230 97 \u4e2a\u5b57\u7b26\uff0c\u5e76\u5c06\u52a0\u6cd5\u5bc6\u7801\u6539\u4e3a\u4e58\u6cd5\u5bc6\u7801\uff0c\u5373\uff1a

  • \u52a0\u5bc6\uff1a\\(\\mathbf{C}_i = (\\mathbf{P}_i \\times \\mathbf{k}_i) \\bmod 97\\)
  • \u89e3\u5bc6\uff1a\\(\\mathbf{P}_i = (\\mathbf{C}_i \\times \\mathbf{k}_i^{-1}) \\bmod 97\\)
    • \u6ce8\u610f\u8fd9\u91cc \\(\\mathbf{k}_i^{-1}\\) \u662f \\(\\mathbf{k}_i\\) \u5728\u6a21 \\(97\\) \u610f\u4e49\u4e0b\u7684\u9006\u5143\uff0c\u800c\u975e\u76f4\u63a5\u6c42\u5012\u6570

\u7ef4\u5409\u5c3c\u4e9a\u5bc6\u7801\u7684\u7834\u89e3\u65b9\u6cd5\u6211\u4eec\u5728\u8bfe\u4e0a\u4e5f\u6709\u4ecb\u7ecd\u8fc7\uff0c\u57fa\u672c\u5206\u4e3a\u51e0\u6b65\uff1a

  1. \u7206\u7834\u731c\u6d4b\u5bc6\u94a5\u957f\u5ea6
    • \u8bfe\u4e0a\u7684\u505a\u6cd5\u662f\u5bfb\u627e\u591a\u6b21\u91cd\u590d\u7684\u5bc6\u6587\uff0c\u8fd9\u91cc\u6709\u4e9b\u590d\u6742\uff0c\u53ef\u4ee5\u9009\u62e9\u53e6\u4e00\u79cd\u65b9\u5f0f
    • \u9488\u5bf9\u6bcf\u79cd\u53ef\u80fd\u7684\u5bc6\u94a5\u957f\u5ea6 \\(k\\)\uff0c\u8ba1\u7b97\u5bc6\u6587\u4e2d\u7b2c \\(i\\) \u4f4d\u548c\u7b2c \\(i+k\\) \u4f4d\u7684\u5b57\u7b26\u91cd\u5408\u4e86\u51e0\u6b21
      • \u9009\u53d6\u6574\u4f53\u91cd\u5408\u6b21\u6570\u6700\u591a\u7684 \\(k\\) \u5373\u4e3a\u6700\u53ef\u80fd\u7684\u5bc6\u94a5\u957f\u5ea6
  2. \u9010\u4f4d\u7206\u7834\u5bc6\u94a5
    • \u786e\u5b9a\u4e86\u5bc6\u94a5\u957f\u5ea6\u4e3a \\(k\\) \u540e\uff0c\u5bc6\u6587\u4e2d \\(i, i+k, i+2k, \\cdots\\) \u4f4d\u7684\u5b57\u7b26\u90fd\u662f\u7528\u540c\u4e00\u4e2a\u5b57\u6bcd\u52a0\u5bc6\u7684\uff0c\u6784\u6210\u4e00\u7ec4\u4e58\u6cd5\u52a0\u5bc6
    • \u4e58\u6cd5\u52a0\u5bc6\u4e0d\u4f1a\u6539\u53d8\u5b57\u7b26\u7684\u7edf\u8ba1\u5206\u5e03\uff0c\u53ef\u4ee5\u901a\u8fc7 26 \u4e2a\u5b57\u6bcd\u7684\u9891\u7387\u5206\u5e03\u6765\u731c\u6d4b\u8be5\u4f4d\u5bc6\u94a5\uff08a \u548c A \u7b97\u4f5c\u540c\u4e00\u4e2a\u5b57\u6bcd\uff0c\u975e\u5b57\u6bcd\u7684\u90fd\u5ffd\u7565\uff09
  3. \u89e3\u5bc6
    • \u6709\u4e86\u731c\u6d4b\u7684\u5bc6\u94a5\u540e\uff0c\u5c31\u53ef\u4ee5\u5bf9\u5bc6\u6587\u8fdb\u884c\u89e3\u5bc6\u4e86

\u800c\u6211\u4eec\u6269\u5c55\u540e\u7684\u7ef4\u5409\u5c3c\u4e9a\u5bc6\u7801\u7684\u7834\u89e3\u65b9\u6cd5\u4e5f\u7c7b\u4f3c\uff0c\u901a\u8fc7\u4f60\u559c\u6b22\u7684\u8bed\u8a00\u5b9e\u73b0\u5373\u53ef\u3002\uff08\u63a8\u8350 python\uff0c\u4ee5\u53ca\u6709\u4e86\u81ea\u52a8\u5316\u65b9\u5f0f\u5c31\u4e0d\u8981\u809d\u624b\u63a8\u5566\uff09

"},{"location":"intro/misc-lab1/#task_1","title":"Task","text":"

\u6211\u4eec\u9009\u53d6\u4e86\u4e00\u4efd TOEFL \u9605\u8bfb\u6587\u7ae0\uff0c\u968f\u673a\u751f\u6210\u4e86 15-30 \u4e2a\u5b57\u7b26\u957f\u5ea6\u7684\u5bc6\u94a5\uff0c\u5e76\u5bf9\u5176\u8fdb\u884c\u4e86\u52a0\u5bc6\uff0c\u73b0\u5c06\u5bc6\u6587\u63d0\u4f9b\u7ed9\u4f60\uff0c\u4e3a\u4e86\u660e\u786e\u52a0\u5bc6\u65b9\u6cd5\u4ee5\u53ca\u7b80\u5355\u719f\u6089 python \u4f7f\u7528\uff0c\u6211\u4eec\u8fd8\u63d0\u4f9b\u4e86\u52a0\u5bc6\u4ee3\u7801\uff0c\u8bf7\u4f60\u5b9e\u73b0\u5bf9\u4e8e\u5bc6\u6587\u7684\u7834\u89e3\uff08flag \u5939\u5728\u4e86\u660e\u6587\u4e2d\u95f4\uff09\u3002

\u9644\u4ef6\uff1aencrypt.py\u3001cipher.txt\u3002

\u8fd9\u9053\u9898\u76ee\u4e5f\u662f\u6821\u5df4\u4e2d\u7684\u4e00\u9053\u9898\u76ee\uff0c\u9644\u4ef6\u4e5f\u662f\u5b8c\u5168\u4e00\u81f4\u7684\uff08\u9664\u4e86\u4e00\u4e9b\u4ee3\u7801\u683c\u5f0f\u66f4\u6539\uff09\uff0c\u539f\u9898\u94fe\u63a5\u4e3a https://zjusec.com/challenges/31\u3002

\u8bf7\u5b9e\u73b0\u5bf9\u7ed9\u5b9a\u5bc6\u6587\u7684\u7834\u89e3\uff0c\u62ff\u5230\u5176\u4e2d\u7684 flag\uff0c\u63d0\u4ea4\u5230\u6821\u5df4\u9898\u76ee\u4e2d\u8fdb\u884c\u9a8c\u8bc1\u3002\u5b9e\u9a8c\u62a5\u544a\u4e2d\u9700\u8981\u5305\u542b\u4f60\u7684\u89e3\u9898\u601d\u8def\u3001\u5b8c\u6574\u89e3\u9898\u4ee3\u7801\u4ee5\u53ca flag\u3002

\u5982\u679c\u65e0\u6cd5\u5b8c\u6574\u5b8c\u6210\u89e3\u5bc6\uff0c\u4e5f\u8bf7\u5c06\u4f60\u7684\u5c1d\u8bd5\u5199\u5728\u62a5\u544a\u4e2d\uff0c\u6211\u4eec\u4f1a\u6839\u636e\u5b8c\u6210\u60c5\u51b5\u7ed9\u90e8\u5206\u5206\u3002

"},{"location":"intro/misc-lab1/#challenge-2","title":"Challenge 2","text":"

\u9009\u505a\u6b64\u9898\u76ee\u9700\u8981\u540c\u65f6\u5b8c\u6210\u4ee5\u4e0b\u4e24\u4e2a\u4efb\u52a1\u3002

"},{"location":"intro/misc-lab1/#task-1-tonycranes-easy-osint","title":"Task 1: TonyCrane's easy OSINT","text":"

\u8fd9\u662f TonyCrane \u5728\u65e5\u672c\u62cd\u7684\u4e00\u5f20\u7167\u7247\uff08\u8bf7\u4e0b\u8f7d\u56fe\u7247\u540e\u505a\u9898\uff09\uff1a

\u8bf7\u4f60\u56de\u7b54\u4ee5\u4e0b\u4e24\u4e2a\u95ee\u9898\uff1a

  1. \u62cd\u6444\u8fd9\u5f20\u56fe\u7247\u65f6\u6240\u5728\u4f4d\u7f6e\u7684\u9ad8\u5ea6\u4e3a\u591a\u5c11\uff1f\uff08\u4ee5\u6d77\u5e73\u9762\u4e3a\u57fa\u51c6\uff0c\u5c3d\u53ef\u80fd\u7cbe\u786e\uff09
  2. \u62cd\u6444\u8fd9\u5f20\u56fe\u7247\u7684\u65f6\u95f4\u662f\u4ec0\u4e48\u65f6\u5019\uff1f\uff08\u5c3d\u53ef\u80fd\u7cbe\u786e\uff09

\u5c06\u4f60\u7684\u7b54\u6848\u4ee5\u53ca\u89e3\u9898\u601d\u8def\u5199\u5728\u5b9e\u9a8c\u62a5\u544a\u4e2d\u3002\u540c\u6837\uff0c\u6ca1\u6709\u5b8c\u5168\u505a\u51fa\u6765\u4e5f\u53ef\u4ee5\u5199\u51fa\u4f60\u7684\u601d\u8003\uff0c\u6211\u4eec\u4e5f\u4f1a\u8003\u8651\u7ed9\u51fa\u90e8\u5206\u5206\u3002

"},{"location":"intro/misc-lab1/#task-2-yyys-real-osint","title":"Task 2: yyy's real OSINT","text":"

\u8fd9\u662f yyy \u7528\u624b\u673a\u62cd\u7684\u4e00\u5f20\u7167\u7247\uff08\u8bf7\u4e0b\u8f7d\u56fe\u7247\u540e\u505a\u9898\uff09\uff1a

\u8bf7\u56de\u7b54\u4ee5\u4e0b\u4e24\u4e2a\u95ee\u9898\uff1a

  • \u62cd\u6444\u4f4d\u7f6e\u7684\u7ecf\u7eac\u5ea6
  • \u62cd\u6444\u7684\u6708\u4efd\uff0c\u4ee5\u53ca\u662f\u5728\u5f53\u65e5\u51e0\u70b9\u949f\u62cd\u7684

\u8bf7\u901a\u8fc7 http://nc.tonycrane.cc:65111/ \u8fdb\u884c\u56de\u7b54\u5e76\u9a8c\u8bc1\uff08\u8bf7\u4e0d\u8981\u8fdb\u884c\u4efb\u4f55\u5f62\u5f0f\u7684\u7206\u7834\u7b54\u6848\uff09\uff0c\u663e\u793a flag \u5373\u4e3a\u56de\u7b54\u6b63\u786e\u3002\u5c06\u4f60\u7684\u7ed3\u679c\u3001\u56de\u7b54\u622a\u5c4f\u4ee5\u53ca\u89e3\u9898\u601d\u8def\u5199\u5728\u5b9e\u9a8c\u62a5\u544a\u4e2d\u3002\u540c\u6837\uff0c\u6ca1\u6709\u5b8c\u5168\u505a\u51fa\u6765\u4e5f\u53ef\u4ee5\u5199\u51fa\u4f60\u7684\u601d\u8003\uff0c\u6211\u4eec\u4e5f\u4f1a\u8003\u8651\u7ed9\u51fa\u90e8\u5206\u5206\u3002

"},{"location":"intro/pwn-lab1/","title":"Pwn Lab 1: Code Injection","text":"

\u672c\u8282 Lab \u7531\u4ee5\u4e0b\u4e24\u90e8\u5206\u7ec4\u6210\uff1a

  • \u57fa\u7840\u90e8\u5206
    • \u8bfe\u4e0a\u9898\u76ee\u7684\u590d\u73b0 (80\u5206)
    • \u6821\u5df4\u4e0a\u7684 shellcode \u8d5b\u9898 (20\u5206)
  • bonus\u90e8\u5206 (extra 20\u5206)
"},{"location":"intro/pwn-lab1/#task-1-30-points","title":"Task 1 (30 points)","text":"

\u8bfe\u4e0a\u4f5c\u4e3a\u5f15\u5b50\u7684 hello \u8d5b\u9898\uff0c\u8bf7\u901a\u8fc7\u5176\u719f\u6089 pwntools \u7684\u4f7f\u7528\uff0c\u5e76\u5b8c\u6210\u653b\u51fb\u8fdc\u7a0b\uff0c\u53d6\u5f97 flag1 (15 points) \u4e0e flag2 (points)

  • \u9898\u76ee\u9644\u4ef6
  • \u9898\u76ee\u90e8\u7f72\u5728 IP: 116.62.247.145, Port: 10100

\u8bf7\u5728\u62a5\u544a\u4e2d\u9644\u4e0a\u6f0f\u6d1e\u5206\u6790\u4ee5\u53ca\u505a\u6cd5\uff0c\u7ed9\u51fa\u6210\u529f\u62ff\u5230 flag \u7684\u622a\u56fe\uff0c\u5e76\u5c06\u653b\u51fb\u4ee3\u7801\u4ee5\u9644\u4ef6\u5f62\u5f0f\u4e0a\u4f20

"},{"location":"intro/pwn-lab1/#task-2-25-points","title":"Task 2 (25 points)","text":"

\u8bfe\u4e0a\u8bb2\u89e3\u7684 injection1 \u8d5b\u9898\uff0c\u8bf7\u9006\u5411\u5206\u6790\u7a0b\u5e8f\uff0c\u5e76\u5b9e\u73b0\u5bf9\u5176\u4e2dCode Injection\u6f0f\u6d1e\u7684\u653b\u51fb\uff0c\u53d6\u5f97\u4f4d\u4e8e\u8fdc\u7a0b\u670d\u52a1\u5668\u4e0a\u7684 flag (25 points)

  • \u9898\u76ee\u9644\u4ef6
  • \u9898\u76ee\u90e8\u7f72\u5728 IP: 116.62.247.145, Port: 10101

\u8bf7\u5728\u62a5\u544a\u4e2d\u9644\u4e0a\u6f0f\u6d1e\u5206\u6790\u4ee5\u53ca\u505a\u6cd5\uff0c\u7ed9\u51fa\u6210\u529f\u62ff\u5230 flag \u7684\u622a\u56fe\uff0c\u5e76\u5c06\u653b\u51fb\u4ee3\u7801\u4ee5\u9644\u4ef6\u5f62\u5f0f\u4e0a\u4f20

\u6ce8\uff1a\u8def\u5f84\u7a7f\u8d8a\u4e0d\u7ed9\u5206\u54e6 :-)

"},{"location":"intro/pwn-lab1/#task-3-25-points","title":"Task 3 (25 points)","text":"

\u8bfe\u4e0a\u8bb2\u89e3\u7684 injection2 \u8d5b\u9898\uff0c\u8bf7\u5b9e\u73b0

  1. \u6309\u9898\u76ee\u8981\u6c42\u5b9e\u73b0 5 \u79cd\u529f\u80fd\u7684 delegate \u4ee3\u7801\uff0c\u5b8c\u6210\u540e\u53d6\u5f97 FLAG (10 points)
  2. \u5b66\u4e60 shellcode (5 points) \u5e76\u901a\u8fc7 shellcode \u653b\u51fb\u62ff\u5230\u8fdc\u7a0b\u7684 shell\uff0c\u5e76\u5f97\u5230\u53e6\u5916\u7684 flag \u5185\u5bb9 (10 points)
  • \u9898\u76ee\u9644\u4ef6
  • \u9898\u76ee\u90e8\u7f72\u5728 IP: 116.62.247.145, Port: 10102

\u8bf7\u5728\u62a5\u544a\u4e2d\u9644\u4e0a\u6f0f\u6d1e\u5206\u6790\u4ee5\u53ca\u505a\u6cd5\uff0c\u7ed9\u51fa\u5bf9\u4e8e\u4f60\u4f7f\u7528\u7684 shellcode \u4ee3\u7801\u7684\u5206\u6790\uff08\u8fd9\u4e2a\u4ee3\u7801\u5230\u5e95\u5e72\u4e86\u5565\uff09\uff0c\u7ed9\u51fa\u6210\u529f\u62ff\u5230 flag \u7684\u622a\u56fe\uff0c\u5e76\u5c06\u653b\u51fb\u4ee3\u7801\u4ee5\u9644\u4ef6\u5f62\u5f0f\u4e0a\u4f20

"},{"location":"intro/pwn-lab1/#task-4-20-points","title":"Task 4 (20 points)","text":"

\u4f4d\u4e8e\u6821\u5df4\u7684\u201c\u8d85\u8001\u201d shellcode \u8d5b\u9898\uff0c\u5728\u5b8c\u6210\u4ee5\u4e0a\u7684\u57fa\u7840\u540e\uff0c\u505a\u5b83\u4e00\u5b9a\u662f\u780d\u74dc\u5207\u83dc

  • \u9898\u76ee\u4fe1\u606f

\u6ce8\uff1a\u8fd9\u4e2a\u9898\u662f 32 \u4f4d\u67b6\u6784\u7684 shellcode \u54e6\uff0c\u4e0d\u8981\u5f04\u9519\u4e86

\u8bf7\u5728\u62a5\u544a\u4e2d\u9644\u4e0a\u6f0f\u6d1e\u5206\u6790\u4ee5\u53ca\u505a\u6cd5\uff0c\u7ed9\u51fa\u6210\u529f\u62ff\u5230 flag \u7684\u622a\u56fe\uff0c\u5e76\u5c06\u653b\u51fb\u4ee3\u7801\u4ee5\u9644\u4ef6\u5f62\u5f0f\u4e0a\u4f20

"},{"location":"intro/pwn-lab1/#bonus-extra-20-points","title":"Bonus (extra 20 points)","text":"

\u5728 Task 3 \u7684\u57fa\u7840\u4e0a\uff0cinjection3 \u8d5b\u9898\u5bf9\u4e8e\u8f93\u5165\u7684\u4ee3\u7801\u505a\u4e86\u4e00\u4e9b\u9650\u5236\uff0c\u4f60\u8fd8\u80fd\u6210\u529f\u653b\u51fb\u4e48\uff1f\u8bf7\u5b8c\u6210

  1. \u5206\u6790 injection3 \u548c injection2 \u7684\u4e0d\u540c\uff0c\u5b9e\u73b0\u4e86\u600e\u6837\u7684\u68c0\u67e5\uff1f(5 points)
  2. \u7ed5\u8fc7\u8be5\u68c0\u67e5\uff0c\u5b8c\u6210\u8fdc\u7a0b\u5f39 shell\uff0c\u5e76\u53d6\u5f97 flag (15 points)
  • \u9898\u76ee\u9644\u4ef6
  • \u9898\u76ee\u90e8\u7f72\u5728 IP: 116.62.247.145, Port: 10103

\u8bf7\u5728\u62a5\u544a\u4e2d\u7ed9\u51fa\u4f60\u7684\u5206\u6790\u7ed3\u679c\uff0c\u5e76\u9644\u4e0a\u6f0f\u6d1e\u5206\u6790\u4ee5\u53ca\u505a\u6cd5\uff0c\u7ed9\u51fa\u6210\u529f\u62ff\u5230 flag \u7684\u622a\u56fe\uff0c\u5e76\u5c06\u653b\u51fb\u4ee3\u7801\u4ee5\u9644\u4ef6\u5f62\u5f0f\u4e0a\u4f20

"},{"location":"intro/rev-lab1/","title":"Rev Lab 1: Baby Reverse","text":"

\u672c\u8282 Lab \u7531\u4ee5\u4e0b\u4e24\u90e8\u5206\u7ec4\u6210\uff1a

  • Task 1: \u8bfe\u5802\u4f8b\u9898++\uff0870 \u5206\uff09
    • \u8bfe\u4e0a\u7ec3\u4e60\u9898\u590d\u73b0 (40\u5206)
    • \u4fee\u6539\u540e\u7684\u7ec3\u4e60\u9898 (30\u5206)
  • Task 2: \u4f2a\u968f\u673a\uff1f (30\u5206)
"},{"location":"intro/rev-lab1/#task-1-70-points","title":"Task 1 (70 points)","text":""},{"location":"intro/rev-lab1/#part-1-40-points","title":"Part 1 (40 points)","text":"

\u9898\u76ee\u4e0b\u8f7d\u94fe\u63a5

\u8bfe\u4e0a\u4f5c\u4e3a\u7ec3\u4e60\u7684 practice \u8d5b\u9898\uff0c\u8bf7\u56de\u987e\u8bfe\u4e0a\u8bb2\u89e3\u7684\u5185\u5bb9\uff0c\u5b8c\u6210\u9898\u76ee\u5e76\u56de\u7b54\u8bfe\u4e0a\u63d0\u51fa\u7684 5 \u4e2a\u95ee\u9898\uff1a

  1. \u5728\u9898\u76ee\u4e2d\u6709\u4e00\u4e2a\u51fd\u6570\u662f\u52a0\u5bc6\u76f8\u5173\u7684\u51fd\u6570\uff0c\u8bf7\u627e\u51fa\u8fd9\u4e2a\u51fd\u6570\u7684\u5730\u5740\uff08Hex \u683c\u5f0f\u4f5c\u7b54\uff0c5 points\uff09
  2. \u5f53\u4f60\u627e\u5230\u4e86\u8fd9\u4e2a\u52a0\u5bc6\u51fd\u6570\uff0c\u8bf7\u627e\u51fa\u7a0b\u5e8f\u5728\u52a0\u5bc6\u8fc7\u7a0b\u4e2d\u6240\u4f7f\u7528\u5230\u7684\u5bc6\u94a5 \uff085 points\uff09
  3. \u5728\u8fd9\u4e2a\u9898\u76ee\u4e2d\uff0c\u7a0b\u5e8f\u7b80\u5355\u5c01\u88c5\u4e86\u77ed\u5b57\u7b26\u4e32\u7c7b\u578b\uff0c\u8bf7\u5728 IDA \u4e2d\u6062\u590d\u5b83\u7684\u7ed3\u6784\u4f53 \uff08\u622a\u56fe\u6216\u7528 C \u8bed\u8a00\u8868\u793a\u8be5\u7ed3\u6784\uff0c 15 points\uff09
  4. \u7ed9\u51fa\u4f60\u89e3\u7b54\u7684 flag \u5185\u5bb9\u53ca Writeup \uff0815 points\uff09
"},{"location":"intro/rev-lab1/#part-2-30-points","title":"Part 2 (30 points)","text":"

\u9898\u76ee\u4e0b\u8f7d\u94fe\u63a5

\u5728 practice \u8d5b\u9898\u7684\u57fa\u7840\u4e0a\uff0c\u8be5\u9898\u76ee\u7a0d\u6709\u4fee\u6539\uff0c\u8bf7\u4f60\u7a0d\u52a0\u63a2\u7d22\u5b8c\u6210\u9898\u76ee\u5e76\u56de\u7b54\u4ee5\u4e0b\u95ee\u9898\uff1a

  1. \u7a0b\u5e8f\u4e2d\u52a0\u5bc6\u51fd\u6570\u7528\u5230\u7684\u7684\u5bc6\u94a5\u662f\u4ec0\u4e48\uff0c\u4f60\u662f\u5982\u4f55\u627e\u5230\u5b83\u7684\uff0810 points\uff09
  2. \u7ed9\u51fa\u4f60\u89e3\u7b54\u7684 flag \u5185\u5bb9\u53ca Writeup\uff0820 points\uff09
"},{"location":"intro/rev-lab1/#task-2-30-points","title":"Task 2 (30 points)","text":"

\u9898\u76ee\u4e0b\u8f7d\u94fe\u63a5

\u770b\u4f3c\u968f\u673a\u5374\u5e76\u4e0d\u968f\u673a\uff0c\u770b\u4f3c\u6a21\u7cca\u5374\u53c8\u6e05\u6670\uff0c\u8bf7\u4f60\u8010\u5fc3\u5206\u6790\u5e76\u63d0\u4ea4\uff1a

  1. flag \u5185\u5bb9\u53ca Writeup (30 points)
"},{"location":"intro/tools/","title":"\u76f8\u5173\u5de5\u5177\u7684\u4ecb\u7ecd\u548c\u4f7f\u7528","text":"

\u6211\u4eec\u5728\u53d1\u5e03\u7684\u865a\u62df\u673a

\u4e0b\u8f7d\u94fe\u63a5\uff08\u5176\u4e2d\u7528\u6237\u540d\u4e3a ctfer\uff0c\u5bc6\u7801\u4e3a aaa\uff09

\u4e2d\u9884\u88c5\u4e86\u4e00\u4e9b\u8bfe\u7a0b\u4e2d\u53ef\u80fd\u4f1a\u4f7f\u7528\u5230\u7684\u5de5\u5177\uff0c\u8fd9\u91cc\u5c06\u5bf9\u5176\u8fdb\u884c\u5c55\u5f00\u4ecb\u7ecd\u3002\u540c\u5b66\u4eec\u4e5f\u53ef\u4ee5\u6839\u636e\u81ea\u8eab\u9700\u8981\uff0c\u5728\u719f\u6089\u7684\u5e73\u53f0\u4e2d\u4f7f\u7528\u8fd9\u4e9b\u5de5\u5177\u3002

"},{"location":"intro/tools/#ida","title":"IDA","text":"
  • \u5b98\u7f51\uff1ahttps://hex-rays.com/ida-pro/
  • \u4ecb\u7ecd\uff1a\u65e0\u53ef\u4e89\u8bae\u7684\uff0c\u6700\u5f3a\u7684\u9006\u5411\u5de5\u5177\uff5e\u4e8c\u8fdb\u5236\u7a0b\u5e8f F5 \u4e00\u952e\u53d8\u56de\u6e90\u4ee3\u7801
  • \u4f7f\u7528\uff1a\u5728\u9884\u88c5\u7684\u865a\u62df\u673a\u684c\u9762\u53cc\u51fb IDA Freeware 7.6 \u5373\u53ef\uff0c\u542f\u52a8\u6548\u679c\u5982\u4e0b\u56fe\uff0c\u968f\u540e\u5373\u53ef\u901a\u8fc7 New \u9009\u62e9\u4e8c\u8fdb\u5236\u7a0b\u5e8f\u8fdb\u884c\u53cd\u7f16\u8bd1

\u5907\u6ce8\uff1a\u9884\u88c5\u7684 IDA \u662f\u9700\u8981\u8054\u7f51\u4f7f\u7528\u7684\u514d\u8d39\u8bd5\u7528\u7248\uff0c\u5982\u679c\u5b89\u88c5\u5176\u4ed6\u6e20\u9053\u4e0b\u8f7d\u5230\u7684\u7834\u89e3\u7248\uff0c\u8bf7\u6ce8\u610f\u907f\u514d\u4e2d\u6587\u8def\u5f84\u95ee\u9898\u3002

"},{"location":"intro/tools/#ssl-server-not-avaliable","title":"\u89e3\u51b3 SSL \u7248\u672c\u8fc7\u9ad8\u5bfc\u81f4\u7684 server not avaliable","text":"

\u7531\u4e8e\u9ad8\u7248\u672c ubuntu \u4f7f\u7528\u7684\u662f SSL3+ \u7684\u7248\u672c\uff0c\u5728 IDA \u4e0e\u8fdc\u7aef server \u4f7f\u7528\u65f6\u53ef\u80fd\u4f1a\u51fa\u95ee\u9898\uff0c\u5982\u679c\u4f60\u9047\u5230\u4e86 cloud server not avaliable \u7684\u95ee\u9898\uff0c\u5176\u5173\u952e\u539f\u56e0\u662f SSL3+ \u62ff\u6389\u4e86 SSL_get_peer_certificate \u8fd9\u4e2a\u65b9\u6cd5\uff0c\u89c1\u94fe\u63a5\uff08\u53c8\u662f\u4e0d\u5411\u524d\u517c\u5bb9\u7684\u8bbe\u8ba1\uff09

\u4e3a\u4e86\u4fee\u590d\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u65e7\u7248\u672c SSL1.1 \u66ff\u6362\u76ee\u524d\u73af\u5883\u7684 SSL3+\uff0c\u8bf7\u4e0b\u8f7d\u4fee\u590d\u9644\u4ef6\uff0c\u89e3\u538b\u7f29\u540e\u5728\u76ee\u6807\u76ee\u5f55\u6267\u884c fix.sh \u811a\u672c\uff08\u53ef\u80fd\u9700\u8981 sudo \u6743\u9650\uff09\uff0c\u5b8c\u6210\u540e\u518d\u6b21\u6d4b\u8bd5 IDA \u5e94\u8be5\u5c31\u53ef\u4ee5\u6b63\u5e38\u901a\u8fc7 cloud server \u8fdb\u884c F5 \u4e86

"},{"location":"intro/tools/#ghidra","title":"ghidra","text":"
  • \u5b98\u7f51\uff1ahttps://ghidra-sre.org/
  • \u4ecb\u7ecd\uff1a\u5f00\u6e90\u7684\u4e00\u6b3e\u9006\u5411\u5de5\u5177\uff0c\u5728\u5904\u7406\u7279\u5b9a IDA \u4e0d\u5bf9\u4ed8\u7684\u67b6\u6784\u65f6\u53ef\u4ee5\u4f7f\u7528
  • \u4f7f\u7528\uff1a\u5728\u9884\u88c5\u7684\u865a\u62df\u673a\u7684\u547d\u4ee4\u884c\u4e2d\u6267\u884c ~/Tools/ghidra_10.3_PUBLIC/ghidraRun \u811a\u672c\u5373\u53ef\u542f\u52a8\uff0c\u6548\u679c\u5982\u4e0b\u56fe\uff0c\u4f7f\u7528\u7684\u6559\u7a0b\u53ef\u4ee5\u627e\u7f51\u4e0a\u7684\u76f8\u5173\u535a\u5ba2\uff0c\u5982\u8fd9\u4e00\u7bc7
"},{"location":"intro/tools/#gef-plugin","title":"gef plugin","text":"
  • \u5b98\u7f51\uff1ahttps://github.com/hugsy/gef
  • \u4ecb\u7ecd\uff1aLinux \u4e0b gdb \u7684\u4e00\u6b3e\u63d2\u4ef6\uff0c\u4f18\u5316\u8c03\u8bd5\u4f53\u9a8c
  • \u4f7f\u7528\uff1a\u5728\u9884\u88c5\u7684\u865a\u62df\u673a\u4e0b\u6b63\u5e38\u4f7f\u7528 gdb \u5373\u53ef\u4ee5\u770b\u5230\u63d2\u4ef6\u6548\u679c

\u2026\u2026

\u9664\u6b64\u5916\u8fd8\u6709\u4e00\u4e9b\u989d\u5916\u7684\u5de5\u5177\uff0c\u8fd9\u4e9b\u5de5\u5177\u4f1a\u540e\u7eed\u8865\u5145\u4ecb\u7ecd\uff0c\u6216\u5728\u8bfe\u7a0b\u4f7f\u7528\u65f6\u4f1a\u989d\u5916\u7ed9\u51fa\u8bb2\u89e3\u3002

"},{"location":"intro/web-lab1/","title":"Web Lab 1","text":""},{"location":"intro/web-lab1/#task-1-70","title":"Task 1 (70%)","text":"

Implement a DNS rebinder:

  • resolve normally for common hosts
  • resolve to different ip addresses (A record) in different responses for certain hosts
  • low TTL
"},{"location":"intro/web-lab1/#task-2-30","title":"Task 2 (30%)","text":"

Finish the challenge SSRF in SchoolBus (https://zjusec.com/challenges/47)

(Using the rebinder in Task 1 is not required)

"},{"location":"intro/web-lab1/#what-to-submit","title":"What to submit","text":"

For task 1, code with comments (or additional docs) and a running demo.

For task 2, your writeup.

PDF is recommended.

"}]} \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 0000000..3bc7faf --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,38 @@ + + + + https://courses.zjusec.com/ + 2023-07-09 + daily + + + https://courses.zjusec.com/intro/lab0/ + 2023-07-09 + daily + + + https://courses.zjusec.com/intro/misc-lab1/ + 2023-07-09 + daily + + + https://courses.zjusec.com/intro/pwn-lab1/ + 2023-07-09 + daily + + + https://courses.zjusec.com/intro/rev-lab1/ + 2023-07-09 + daily + + + https://courses.zjusec.com/intro/tools/ + 2023-07-09 + daily + + + https://courses.zjusec.com/intro/web-lab1/ + 2023-07-09 + daily + + \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz new file mode 100644 index 0000000000000000000000000000000000000000..10549da6c64080af1e858ca63994ef0d8a620634 GIT binary patch literal 251 zcmVDMVrbdyPlvu zfP*JC6)+BiL)+6ACsE~XHxaV|zMei$ENBj2&Q=!)WYD*4%O$J8YwV35TK4h&R==== z+B9>p1hLAnrepKH0#$UR$OdhGlFrvPWwcgB7+HBK*l|j}bj1Ld(iJ13rGotu93S+A*Cqc>>K9?vg^0}r006rs BcWD3s literal 0 HcmV?d00001