陳麒升

@rota1001

Pwner & Cryptor & Reverser & Competitive Programmer

Joined on Oct 29, 2021

  • contributed by < rota1001 > 想法 在 rooty 這個專案可以看到它利用 filep_open 去找到特定路徑的 file_operations 結構體,以劫持對應目錄的 VFS 界面。這個方法的價值是不管對應的檔案操作函式的 symbol 有沒有被釋放出來,只要我知道那個目錄的路徑我都能獲得它所有的檔案操作函式。然而,專案內使用的 readdir 函式在 linux 3.11 之後就已經從 file_operations 裡面移除了。而目前我實驗上,如果我建立一個 process file,使用 filep_open 打開之後,那個 file 結構體裡面的 file_operations 結構體和我用來註冊的 proc_ops 結構體裡面的函式是不一樣的,所以需要去找到新的方法做這件事情。 以下做的事情是去了解 proc_dir_entry 的資料結構,並且利用創建惡意檔案來得到根目錄的地址。另外,在 linux 原始碼中這個結構體有 __randomize_layout,所以以下會在不知道結構體內部實作的前提下,利用紅黑樹結點的結構去計算出偏移量。 這樣可以做到什麼事情呢?舉個例子,在 /proc 底下有 kallsyms,可以讀 symbol,那我利用這個方法獲取了 proc_dir_entry 結構體,又計算出 proc_ops 的偏移量,所以我能找到 proc_read 的函式指標,所以就能獲取 symbol。 實驗環境
     Like  Bookmark
  • contributed by < rota1001 > 以下有些使用與上面重複的手法就不再提及了 參考資料 https://github.com/milabs/awesome-linux-rootkits https://richardweiyang-2.gitbook.io/kernel-exploring 實驗環境 若未提及則為以下環境:
     Like  Bookmark
  • contributed by < rota1001 > Q3 測驗 1 :::danger 不要列出參考題解,專注題目本身 ::: AAAA: 這個函式是要計算向上取整,於是使用 $\lceil \frac{n}{d} \rceil = \lfloor \frac{n+d-1}{d} \rfloor$ 的概念去實作:​​​​static size_t ceil_div(size_t n, size_t d)
     Like  Bookmark
  • 以下兩個部份由於書寫時間關係,我用的 linux 版本是不同的,但可以用相同的方式做到。 使用 buildroot 編譯 Linux 核心 首先要編譯 linux 核心,我之前嘗試在 ubuntu 24.04 去編譯,但是失敗了,還沒找到原因,看到別人的筆記使用 ubuntu 20.04 的環境,所以去嘗試了一下就成功了。 參考資料 linux-kernel-debugging buildroot 快速入門 操作步驟
     Like  Bookmark
  • contributed by < rota1001 > Q1 間接指標、鏈結串列與記憶體配置 測驗 1 static inline void list_insert_before(list_t *l, list_item_t *before, list_item_t *item) { list_item_t **p; for(p = &l->head; *p != before; p = &(*p)->next)
     Like  Bookmark
  • contributed by < rota1001 > :::danger 注意書寫規範! ::: :::info 以下本文中的圖(非引用的部份),只要涉及定點數的運算,縱軸都是乘上 1<<Q 的結果。 :::
     Like  Bookmark
  • kecho 修正 kthread_run 失敗時的錯誤回傳 pull request https://github.com/sysprog21/kecho/pull/13 我發現在 kecho_init_module 裡面,如果 kthread_run 失敗了會去關閉 socket,但是依然會回傳 0,讓核心模組成功的被掛載。這樣不是預期行為,而且在移除模組的時候會去重複的釋放資源,造成核心錯誤,於是送了這個 pull request。我利用直接把 echo_server 指定成 ERR_PTR(-ENOMEM) 去模擬這個錯誤的發生,並且如預期的遇到了這樣的錯誤。 echo_server = kthread_run(echo_server_daemon, &param, MODULE_NAME); if (IS_ERR(echo_server)) { printk(KERN_ERR MODULE_NAME ": cannot start server daemon\n"); close_listen(listen_sock);
     Like  Bookmark
  • 資安讀書會 3/30 最近頗忙,這裡簡單寫個東西,然後中間有一些東西我沒有 bottom up 的去理解原理,只是觀察他的行為找規律而已。 為什麼會有這篇分享呢?因為有次 jserv 上課說 printf 可以做到圖靈完備,所以就開始亂玩,順便水一次讀書會。 完整程式碼在這:printf-turing 概述 能在以下程式碼中的 ... 地方插入除了 C 語言函數呼叫以外的東西,達成圖靈完備: #include <stdio.h>
     Like 1 Bookmark
  • contributed by < rota1001 > 因為自動飲料機而延畢的那一年 看完 〈因為自動飲料機而延畢的那一年〉,我對於願意花一年的時間去解決一個實際的、有難度的問題的學生感到敬佩。我也開始慶幸我是搞軟體的,如果我想看現在工業標準的實作,最大的成本就是翻開 linux 的程式碼,並閱讀它。這不簡單,但是不花錢。看了這篇文章後,我覺得身為一個資工系的學生,在大學期間如果沒有把作業系統和編譯器這些電腦科學的基礎元件寫一遍,那我這四年算是白讀了。這兩件事情其實早就在我 2025 年的目標清單上面了,來修這堂課也是為了這個目標去做的準備。 我對作業系統的認知分為三個階段。一年級時,覺得作業系統離我非常遙遠,也許我一輩子都不會去寫那種東西,也無法想像他是怎麼組成的。聽到同學程式設計(二)的期末專題想要寫一個作業系統,我就想這個怎麼可能是幾個禮拜就寫得出來的東西。在去年暑假,我去寫了 MIT 6.S081 的一些作業(那時甚至連中文和英文之間要有空白都還不知道),看了 xv6 這個小的作業系統案例的一部分,發現作業系統可以小到一個我可以想像的大小,這個時候的我以為寫作業系統就比寫一個網頁難一些而已。後來寒假的時候用一些零碎時間跟著 OS in 1000 line 去寫了一個可以在使用者空間裡 printf("Helloworld") 的作業系統,就覺得自己好棒。接下來就到了這個學期,我選擇修了這門 linux 核心設計。經過前幾週的課程,我發現我根本連作業系統的皮毛都還沒有碰到。光是一個排程器在 linux 核心中就佔了 3 萬行的程式碼,而整個發展的歷程和其中的考量也不是三言兩語就講的完的,要不然老師也不用寫〈Demystifying the Linux CPU Scheduler〉這本書了。而作業系統的難度不只在知道什麼是作業系統和 C 語言怎麼寫上,更多的是在各種元件的目標是什麼?怎麼達成這些目標?怎麼去確定我們達成這些目標了? 前六週學習狀況 前六週教材進度我還算有跟上,所有東西都有看過,現在記得大概 65% 左右的概念。
     Like  Bookmark
  • 閱讀 Linux 核心的紅黑樹的過程中遇到了一些理解上的困難,於是以下去讀了 Linux 核心中的程式碼: lib/rbtree.c linux/include/linux/rbtree_augmented.h 並且在閱讀過程中發現了註解的問題,向 Linux 核心提交了 patch,看起來沒有回應 以下有些地方,我判斷程式碼並沒有幫助理解就只留註解。 刪除節點 rb_erase
     Like  Bookmark
  • 安裝 安裝 qemu-user sudo apt install qemu-user 安裝 pwndbg(非必要但幫助頗大) git clone https://github.com/pwndbg/pwndbg.git cd pwndbg ./setup.sh 使用步驟 首先編譯出一個執行檔:
     Like  Bookmark
  • 剛才向 Linux 核心提交了我的第一個 patch,修正了 lib/rbtree.c 中的註解錯誤。 patch 內容 在 lib/rbtree.c 中的 ____rb_erase_color,有以下這段程式碼。紅黑樹的註解中會以大寫代表黑色節點,小寫代表紅色節點。而 !tmp1 || rb_is_black(tmp1) 會保證 sibling 的右子節點是黑色或 NULL,所以在 case 3 中的 sr 應該要是黑色的。 tmp1 = sibling->rb_right; if (!tmp1 || rb_is_black(tmp1)) { ... /*
     Like  Bookmark
  • contributed by < rota1001 > Linux 核心專題: 針對鏈結串列的資料排序改進 - fennecJ 這個專題是要引進 Timsort 以改良 linux 中的 list_sort,並以實驗說明其好處。 Timsort 此演算法的前提是現實世界中的大部分資料都是部份排序的,所以將部份排序良好的陣列合併成一塊一塊(runs),最後將他們合併。 原始的版本是在陣列上,會決定一個 minrun ,代表一個 run 最小的長度。從陣列的開頭開始蒐集元素組成 run,選取連續遞增或嚴格遞減的元素連起來,如果他的長度小於 minrun 就用插入排序法將後面的元素插到 run 裡面。minrun 通常選 64,因為它可以放進 cacheline 中,讓插入排序法效益較高。然後它可以二分搜應該插入的位置,這樣雖然插入還是需要 $n$ 個操作去移動元素,但比較只需要 $\log n$。接下來進行合併,每次將一個 run 加入到堆疊的頂部,持續的檢查頂部的 4 個元素,$A$、$B$、$C$、$D$(長度),滿足底下的性質(若只有 3 個元素只要比較第 2 條,若只有 2 個元素就只比較第 3 條,這是基於看程式碼的理解):
     Like  Bookmark
  • contributed by < rota1001 > Reviewed by salmoniscute 「函數」跟「函式」混在一起用了,可以參考資訊科技詞彙翻譯修正。 開發環境 $ gcc --version gcc (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0 Copyright (C) 2023 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO
     Like  Bookmark
  • 使用 $\tanh^{-1}x$ 的泰勒展開來解釋 觀察 kxo 作業說明 對 fixed_log 的實作: Q23_8 fixed_log(int input) { if (!input || input == (1U << Q)) return 0; int64_t y = input << Q; y = ((y - (1U << Q)) << (Q)) / (y + (1U << Q));
     Like  Bookmark
  • 分析工具箱 按一下 [檔案] 索引標籤,然後按一下 [選項],再按一下 [增益集] 類別。 選取 [管理] 方塊中的 [Excel 增益集],然後按一下 [執行]。 在 [增益集] 方塊中,選取 [分析工具箱] 核取方塊,然後按一下 [確定]。 然後在資料那裏就會出現這個 image 查表 常態分配​​​​=NORM.DIST(x, 0, 1, TRUE) #帶表從負無限大開始算的常態分配
     Like  Bookmark
  • 這次打了第4名 image Crypto RandomShuffle import random import os flag = os.getenv("FLAG") or "FLAG{test_flag}"
     Like  Bookmark
  • 我的檔案在這個連結: https://drive.google.com/file/d/1vBGgadkXtQxHoQHFXpyz1s_wF8yusyaD/view?usp=sharing 之前一直知道有這個東西,只是今天第一次做,就寫細一點順便當個筆記吧。 1. Loader 編譯 dll 先寫個 helloworld 吧 testdll.h​​​​#include <iostream>
     Like  Bookmark
  • 來寫一些酷酷的 pwn 題吧 pwn Yet Another Username and Password Checker Revenge 就是可以寫一個 shellcode,那一段是可寫可執行的,下面有明顯的 bof ,只是他有開 seccomp int __fastcall main(int argc, const char **argv, const char **envp) { char buf[40]; // [rsp+0h] [rbp-30h] BYREF void *addr; // [rsp+28h] [rbp-8h]
     Like  Bookmark
  • reverse Prufer's backpack on the tree 預期難度:4 這題主要想考驗的是看懂算法邏輯、用 script 做靜態分析,然後最後藏了一個小梗。在 symbol 上幾乎沒有做混淆。 prufer 序列是一種長度為 n - 2 且可以和 n 個節點的無根樹一一對應的序列。 https://oi-wiki.org/graph/prufer/ 本題會輸入一個序列,然後程式會將這個序列轉成一顆樹,通過驗證後會用這個序列當作 key 來解密 flag。每個節點會有一個權重,這些權重極大,我們將正確的那顆樹以某個點作為根節點去計算每個節點的子樹權重總和。驗證的方式是我們會以相同的方式去處理以使用者輸入所生出來的樹,並且比對每個子樹的權重總和是否相同,如果都相同,那就通過。 這題主要是要還原出這棵樹的結構,然後跟著題目提供的文章去計算這棵樹對應的 prufer 序列。
     Like  Bookmark