還不快點登入,你們這些看小說都不登入就離開的。
登入可以幫助你收藏跟紀錄愛書,大叔的心血要多來支持。
不然管理員會難過。
《從零開始的CTFer生活》Chapter.四 清晨,人生,異或加密算法
  翌日“清晨”,刺眼的陽光透過窗戶照射到筱懿明的床上——其實已經是中午12點了,但對於第二天上午沒有課的男性大學生筱懿明而言,中午12點就是他的清晨——當然,其實他第二天早上是有課的,但是對於他這種作息日夜顛倒極其不規律的人來說,即便早上有課他也會直接睡過去,現代智能手機的鈴聲根本不足以吵醒他——手機的性能一代比一代高,鈴聲音量倒是一代比一代小了,甚至還比不上各種“老人機”——所以四舍五入還是等於沒有課。

  不過比起翹了「計算機導論與程序設計」這種名字聽起來像是很高大上的課程實際上僅僅是教授C語言的一門“水課”而言,筱懿明更加關心CTF的事情——當然,僅僅是對於筱懿明這種高中有著OI基礎的人而言是水到不能再水的水課,相當一部分高校的計算機相關專業的學生哪怕到了大學畢業都用不利索指針、寫不利索一些基本的算法——但那又如何呢,python、Java這類高級語言會自動幫你處理好一切的垃圾回收,各路大神準備的各種庫幫你解決了一切底層的細節問題,大部分程序員只需要知道如何去調用一個庫就行了——但在筱懿明這種“造輪子狂熱者”看來,這種“簡單易用”的語言寫得越多,腦子就會變得越來越笨——他一直是那種信奉著“對於每一個工程項目都要針對其特性親手寫一套不一樣的動態內存管理器”這樣的理念的人——雖然說以他現在的軟件開發水平而言可能連 ptmalloc (glibc默認的堆內存管理器)的性能的一半都沒法達到——或許類似 musl c 那種結構的他倒是還能開發出一個殘次品,不過有的時候他倒也樂意去享受 C++裡諸如「智能指針」這樣方便的語法糖——但也僅限於此。

  不過他現在倒是沒有心思去想傳統編程相關的東西,自從昨天成功地交了那一個以後,心裡一直到現在都還是迷迷糊糊的。

  “信息安全...麽...”

  筱懿明呈一個“木”字躺在床上,靜靜地望著眼前這熟悉而又陌生的天花板,身邊的一切似乎都在提醒自己:自己來到江洲科學技術大學已經一個月了。

  筱懿明的高考成績並不理想——向來數學能拿130以上的他這一次卻隻拿了個90分出頭,語文、英語和理綜老三樣倒是和往常一樣,最終總分只有640,勉勉強強在教育不算發達的老家所在的省份內拿了個3000左右的排名——當然,在全省幾十萬考生當中這個成績已然能排到前2%,可謂是“人上人上人上人”——但在自己諸多考上那兩所最高學府的高中同班同學面前,這個分數實在是講不出口——雖然如此,他最終還是沒有複讀一年的勇氣。

  在仔細做了各種調研之後,他選擇了江洲科學技術大學這所“性價比最高”的計算機類高校,最終也順利地被其所錄取,用父母的話來說就是“三年的努力終究沒有白費”——當然,對於筱懿明而言,不過是六年又三年,三年又三年,三年又四年,運氣好的話四年又三年,然後三年又三年,這苦日子可何時是個頭?但筱懿明深知,相比起每天 996 的「社畜生活」而言,學生時代無疑是人生中最為輕松的一段時光。

  不過盡早進入社會成為一名“社畜”倒是可以早點實現經濟獨立,對筱懿明而言經濟獨立便意味著有閑錢享受新的生活,更何況他讀的還是目前畢業底薪久據第一梯隊的計算機類專業——可惜在還完房貸車貸彩禮貸之前,

他可能會在35歲因“公司人員結構優化”等理由而裁員——對外美其名曰「向社會輸出人才」,但那個時候他這樣的大齡程序員又如何競爭得過那批自願內卷的畢業生?為了養家糊口最後只能去某個小廠繼續 996,最後在某個不為人知的夜晚先一步倒在公司的工位上——當然,在大廠開啟“硬核奮鬥模式”的那段時間他可能就已經倒下了。  想到這裡,筱懿明倒是挺想做一個妹子——看多了隔壁島國二次元動漫的人或許心裡都會有過這種奇妙的想法,不過此時的筱懿明倒不是出於“啊啊啊啊啊二次元妹子怎麽這麽可愛啊嗚嗚嗚嗚我也要當妹子穿JKs小裙子Lolita白絲過膝襪”這樣詭異的心理——在他看來,就當下的社會情況而言,當一個妹子自然是比做一個男人要更加舒服,不需要還房貸、車貸,也不需要準備高達幾十萬的彩禮送給女方好讓她們家的弟弟能夠有錢買房子娶老婆,無論是做一個新時代女性、還是做一個傳統女性,在兩性關系中都是較為輕松的一方——當然,這一切的觀念都飽含著他對這個世界的各種偏見,他也深知自己內心的這些想法若是在微博這樣的平台上發出來,不到一個小時時間他就會被人肉個底朝天,然後就是傳統的**+**+**+**網暴一條龍服務。

  不過當下而言他的首要任務還是好好地做好大學生的本分——但什麽是大學生的本分?努力學習整個績點4.0?按時上課認真聽課作業按時交?天天泡圖書館然後考研到兩所最高學府?但大多數大學生的人生都是這樣過來的,筱懿明也不是什麽“天選之子”,他深知自己或許也不例外——最終泯然眾人矣。

  但是,就這樣做一個正常的大學生,平平穩穩地度過這四年,最後進入各種企業化身碼農,真的好麽——雖然說當個正常的大學生好像也沒什麽不好,對於一個比較保守的人而言,喜歡安穩也不算什麽壞事,但是——

  “若是一直隨波逐流的話...或許就沒法抓到自己想要的東西吧...”

  筱懿明搖了搖頭,思索片刻之後翻身下床,坐回電腦桌前,重新打開了紫京電子科技大學信息安全新生賽(GeekerCTF)的頁面。

  在國內,信息安全仍舊是一個較為小眾的圈子,哪怕是筱懿明這樣“精通計算機的人”,對“黑客”的領域也是一知半解——雖然他初中的時候就為自己喜歡的遊戲做過 mod ,高中打OI還拿過獎(雖然只是省獎),但比起《CPP》上所教授的“不要使用帶有安全隱患的gets()函數讀入字符串”而言,信息安全,毫無疑問,是一個要深奧得多的領域——當然,最初他在這個平台上注冊帳號,只是因為回憶裡妹子的那一句“黑客很帥”,但是現在,他的內心有著不同的想法。

  這一次他點開了「Reverse」分類的第二道題——

  xor xor xor!!!

  異或真的是一種美妙的操作呢~

  “這次的題目說明倒是挺短的...”,筱懿明這樣想著,將二進製文件下載到自己的計算機中,拖入 IDA 進行分析,在找到 main 函數之後熟練地按下了 F5 ——

  int __cdecl main(int argc, const char **argv, const char **envp)

  {

  _main();

  printf(“GeekerCTF 2021 SimpleRe --by Xe0nReval\\nInput :“);

  scanf(“%32s“, x);

  enc(x);

  return 0;

  }

  雙擊 enc()函數進行跟進,這一次的程序倒是比第一題要複雜很多——

  int __fastcall enc(char *a1)

  {

  int result;// eax

  int i4;//[rsp+20h][rbp-40h]

  int i3;//[rsp+24h][rbp-3Ch]

  int i2;//[rsp+28h][rbp-38h]

  int i1;//[rsp+2Ch][rbp-34h]

  int nn;//[rsp+30h][rbp-30h]

  int mm;//[rsp+34h][rbp-2Ch]

  int ll;//[rsp+38h][rbp-28h]

  int kk;//[rsp+3Ch][rbp-24h]

  int jj;//[rsp+40h][rbp-20h]

  int ii;//[rsp+44h][rbp-1Ch]

  int n;//[rsp+48h][rbp-18h]

  int m;//[rsp+4Ch][rbp-14h]

  int l;//[rsp+50h][rbp-10h]

  int k;//[rsp+54h][rbp-Ch]

  int j;//[rsp+58h][rbp-8h]

  int i;//[rsp+5Ch][rbp-4h]

  for ( i = 0; i <= 30;++i )

  out[i]= a1[i]^ 0x17;

  for ( j = 0; j <= 30;++j )

  out[j]^= 0x39u;

  for ( k = 0; k <= 30;++k )

  out[k]^= 0x4Bu;

  for ( l = 0; l <= 30;++l )

  out[l]^= 0x4Au;

  for ( m = 0; m <= 30;++m )

  out[m]^= 0x49u;

  for ( n = 0; n <= 30;++n )

  out[n]^= 0x26u;

  for ( ii = 0; ii <= 30;++ii )

  out[ii]^= 0x15u;

  for ( jj = 0; jj <= 30;++jj )

  out[jj]^= 0x61u;

  for ( kk = 0; kk <= 30;++kk )

  out[kk]^= 0x56u;

  for ( ll = 0; ll <= 30;++ll )

  out[ll]^= 0x1Bu;

  for ( mm = 0; mm <= 30;++mm )

  out[mm]^= 0x21u;

  for ( nn = 0; nn <= 30;++nn )

  out[nn]^= 0x40u;

  for ( i1 = 0; i1 <= 30;++i1 )

  out[i1]^= 0x57u;

  for ( i2 = 0; i2 <= 30;++i2 )

  out[i2]^= 0x2Eu;

  for ( i3 = 0; i3 <= 30;++i3 )

  out[i3]^= 0x49u;

  for ( i4 = 0; i4 <= 30;++i4 )

  out[i4]^= 0x37u;

  byte_40807F = 0;

  if (!strcmp(out, aim))

  result = puts(“!“);

  else

  result = puts(“no...Don't Give up!“);

  return result;

  }

  字符串 aim 位於程序的.data 段,筱懿明雙擊跟進之後是一個奇特的字符串——看來是被加密過的。

  “程序邏輯似乎是將輸入的字符串與相應數據進行多次的異或操作?”筱懿明思索著,雙擊跟進上層函數調用的參數,他看到了一個奇特的數據——「xzztzmkydg/[email protected]@xm,_(>b」,似乎不像是能夠通過人腦直接猜測出來的數據。

  但此時的筱懿明注意到,這個加密程序中大量使用了異或操作,而——

  “異或運算有一個特性:一個數與同一個數進行兩次異或之後,所得的結果還是他自己,那麽我只需要逆著程序的邏輯將解密代碼寫出來並運行就可以獲得了。”

  異或運算是邏輯學當中的一種很奇妙的基本運算——只有當兩個輸入不同時,輸出才為“真”,若兩個輸入相同,無論是“真”還是“假”,其結果都為“假”,這也令異或操作具有可逆性——二次異或等於沒有異或(通過窮舉法可以快速證明這個特性)。

  對於早已有著幾年編程經驗的筱懿明而言,寫這種簡單的解密程序並不算什麽難事,不到五分鍾解密程序就寫好了——

  #include

  #include

  #include

  using namespace std;

  int main(void)

  {

  int result;// eax

  signed int i4;//[rsp+20h][rbp-40h]

  signed int i3;//[rsp+24h][rbp-3Ch]

  signed int i2;//[rsp+28h][rbp-38h]

  signed int i1;//[rsp+2Ch][rbp-34h]

  signed int nn;//[rsp+30h][rbp-30h]

  signed int mm;//[rsp+34h][rbp-2Ch]

  signed int ll;//[rsp+38h][rbp-28h]

  signed int kk;//[rsp+3Ch][rbp-24h]

  signed int jj;//[rsp+40h][rbp-20h]

  signed int ii;//[rsp+44h][rbp-1Ch]

  signed int n;//[rsp+48h][rbp-18h]

  signed int m;//[rsp+4Ch][rbp-14h]

  signed int l;//[rsp+50h][rbp-10h]

  signed int k;//[rsp+54h][rbp-Ch]

  signed int j;//[rsp+58h][rbp-8h]

  signed int i;//[rsp+5Ch][rbp-4h]

  char ch[100]=“xzztzmkydg/[email protected]@xm,_(>b“;

  for ( i4 = 0; i4
鍵盤左右鍵 ← → 可以切換章節
章節問題回報:
翻譯有問題
章節內容不符
章節內容空白
章節內容殘缺
上下章節連動錯誤
小說很久沒更新了
章節顯示『本章節內容更新中』
其他訊息