# C08: sandbox ###### tags: `sysprog2017` :::info 主講人: [jserv](http://wiki.csie.ncku.edu.tw/User/jserv) / 課程討論區: [2017 年系統軟體課程](https://www.facebook.com/groups/system.software2017/) :mega: 返回「[進階電腦系統理論與實作](http://wiki.csie.ncku.edu.tw/sysprog/schedule)」課程進度表 ::: ## 預期目標 * 研讀 [形式化驗證](https://hackmd.io/s/H1xxp3pF0),並透過 [cbmc](https://hackmd.io/s/Hk4lYmzkf) 做 model checking 的練習 * 探討 [隔離執行環境的建構與應用](https://hackmd.io/s/Hk9HLRbkf),思考加密貨幣領域的系統軟體 * 深入學習 GNU Toolchain,涵蓋 GDB 和 GProf * 延伸 [simulator](https://hackmd.io/s/BkQgqpe0Z) 作業,培養軟體設計的技巧和學習嚴謹的系統分析 * 多人協作的練習 ## 隔離執行環境的建構 * 詳閱 [隔離執行環境的建構與應用](https://hackmd.io/s/Hk9HLRbkf) 並跟著練習操作 - [ ] 自我檢查項目 * Trusted Execution Environment (TEE) 的應用為何?(舉出共筆以外的真實世界案例) * 是否已詳細閱讀 [Moxie](http://moxielogic.org/blog/) 處理器架構的 [Architecture](http://moxielogic.org/blog/pages/architecture.html) 文件?能否用 Moxie 組合語言寫出迴圈版本的 Fibonacci 數列程式? * binutils, gcc, glibc, qemu 到 [libffi](https://sourceware.org/libffi/) 這些專案的作用為何? * Intel 的 [Software Guard Extensions](https://software.intel.com/en-us/sgx) 關鍵特性為何?並舉出共筆以外的應用案例 * [moxiebox](https://github.com/sysprog21/moxiebox) 打造出隔離執行 (sandbox) 的運作環境該如何與外界溝通?列出對應的程式碼並解讀 * 提示: `mmap` 系統呼叫 * 是否已詳閱文件 [sandbox execution environment](https://github.com/sysprog21/moxiebox/blob/master/sandbox-design.md) 呢?解釋 法國的加密貨幣硬體錢包公司 [Ledger](https://www.ledgerwallet.com/) 的 BOLOS 運作原理 * 何謂 cross compiler 呢?我們為何需要? * ELF 執行檔格式包含哪些 section 呢?又在哪裡可見到詳細描述? * 是否已掌握 GNU gprof 的使用?運作原理為何? * 提示: 參閱 [raytracing](https://hackmd.io/s/HyuBWDwYl) 作業規範和共筆成果 * 是否已操作 remote GDB 呢?如何在執行時期檢驗載入的 ELF 執行檔裡頭 `.text` 和 `.data` section 內容呢? * 是否詳讀文件 [遠端除錯](http://www.study-area.org/cyril/opentools/opentools/x1265.html) 並記錄心得呢?是否在 GNU/Linux 實際照著操作?又,遇到什麼問題呢? * 提示: 硬體架構以不同,文章提及 IA32,但現在已是 x86_64 架構 * GDB 命令如 `step` 是如何透過 GDB stub 傳遞到 [moxiebox](https://github.com/sysprog21/moxiebox) 裡頭呢?兩邊的通訊協定又為何? * 提示: 需要對照看 [moxiebox](https://github.com/sysprog21/moxiebox) 的 `src/sandbox.cc` 檔案內容和 [GDB Remote Serial Protocol](https://sourceware.org/gdb/onlinedocs/gdb/Remote-Protocol.html) * 是否理解 GDB Macro 和 [Command Files](https://sourceware.org/gdb/onlinedocs/gdb/Command-Files.html) 呢?能否透過 [moxiebox](https://github.com/sysprog21/moxiebox) 進行練習呢? ## Model Checking * 詳閱 [形式化驗證](https://hackmd.io/s/H1xxp3pF0) 和 [cbmc](https://hackmd.io/s/Hk4lYmzkf),並依據裡頭的說明,實際在 GNU/Linux 操作 - [ ] 自我檢查項目 * cbmc 的作用為何?在什麼領域會需要呢? * 能否簡介自動機理論 (automata theory) 呢? * model checking 中局部狀態表示每個主題執行通訊協定的過程,而所有局部狀態構成全域狀態,每個局部狀態的改變由主體的訊息接收、發送來觸發,能否舉出實際案例說明? * 是否已編譯 cbmc 並用來分析 C 程式呢?若是,舉出詳細的操作和你的解讀 * 務必詳閱 [CBMC: Bounded Model Checking for C/C++ and Java: A Short Tutorial](http://www.cprover.org/cprover-manual/cbmc.shtml) * 以 moxiebox 為例,能否使用 cbmc 來找出程式碼實作的缺陷 (或者自己創造) 呢? * 在 GitHub 專案中找出使用 model checking 的案例,並且具體說明其作用 (當然要親自實驗) ## 第 6 週作業回顧 * 見賢思齊焉,見不賢而內自省也: [simulator 作業列表](https://hackmd.io/s/BJR9BTlRW) * 詳閱並且指出具體優缺點 - [ ] 自我檢查項目 * 是否已知曉搭配 computed goto 實作更高效的 opcode dispatch 呢?舉例說明並且附上效能分析 * 運用 threaded code 的技巧,並以對應的 direct threading 解釋 * 何謂 tail recursion 呢?舉出具體而微的案例並用 perf 解釋細部差異 (特別是 cycle count 的落差) * 是否理解 Fibonacci 數列求值的多種實作方式?若是,詳述之 * GCC 如何從 3-address code 轉換,又如何轉換出給定 ISA 的組合語言程式? * 目前採用的 LP64 資料模型下,int 實質為 32-bit,而 $fib(46)$ 尚在 32-bit 能表示的數值範圍內,但 $fib(47)$ 該如何處理? * Fibonacci sequence 在真實世界中究竟有何應用? * 當然不能舉「用來刁難學生」這種案例 * Fibonacci Q-Matrix 如何運作? * 如何設計 CPU profiler 呢? * 如果我們也想對 full-stack-hello 提出 GDB 支援,該如何實作 GDB stub 呢? ## 作業要求 :::info 無論完成度多高,都該在指定的共筆頁面持續有進度,並且要提供解說的錄影 (上傳到 YouTube,設定「公開」權限,好東西就要分享給大家),在 11 月 24 日 07:00AM 前完成,以便接受教師和其他同學的檢視。 ::: * 在 GitHub 上 fork [moxiebox](https://github.com/sysprog21/moxiebox),並設定協作者的寫入權限 * 編輯 [2017 年秋季班第一次分組表](https://hackmd.io/s/rk7xxIGkf),新增兩個共筆頁面: (請依循給定格式,注意空白) * ==`自我檢查事項(sandbox)`== : 答覆上述各節的「自我檢查事項」,務必詳盡回覆,誠實面對自己^TM^ * ==`開發紀錄(sandbox) / GitHub / YouTube`==: 針對下方作業要求,詳實記錄開發進度和討論,不要變成「兩個和尚沒水喝」 * 在 [moxiebox](https://github.com/sysprog21/moxiebox) 的 `tests` 目錄中,比照 [simulator](https://hackmd.io/s/BkQgqpe0Z) 作業要求,依序實作以下 Fibonacci 數列求值方法: (可用 C 程式實作,但需要附上詳盡的效能分析,善用 GNU gprof 和 GDB) * recursive * iterative * Tail recursion * Q-Matrix * Fast doubling (加上 clz 加速) * 善用 GNU plot 製圖和解讀 * 注意 $Fib(46)$ 之後的數值會超過 2^32^ 可表達的範圍,需要設計有效的數值表示機制來處理 (如用兩個 32-bit 暫存器保存 2^64^ 數值) * 運用 GDB script/commands 來實作自動化測試和效能分析 * 注意: [moxiebox](https://github.com/sysprog21/moxiebox) 沒有 `printf` 可用,需要思考如何透過 `mmap` 來比對程式輸出和預期結果,自動化非常重要! * 額外在 [moxiebox](https://github.com/sysprog21/moxiebox) 移植 (或者重新實作) 以下程式碼,並且充分驗證 (至少做一項) 1. [ctaes](https://github.com/bitcoin-core/ctaes): constant-time AES implementation 2. [constant-time-sorts](https://github.com/ktslabbie/constant-time-sorts): constant-execution-time versions of popular sorting algorithms 3. [cst_time_memcmp](https://github.com/chmike/cst_time_memcmp): onstant time memcmp() function 4. [constant_time_compare](https://github.com/levigross/constant_time_compare): constant time comparison written in C for Python 2.7 5. [CN_String](https://github.com/iDestyKK/CN_String): Stores length for constant time strlen * 承上,詳述原始程式的演算法和應用場合,並探討在 [moxiebox](https://github.com/sysprog21/moxiebox) 移植的工作 * 務必詳閱 [dudect: dude, is my code constant time?](https://github.com/oreparaz/dudect)
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.