發表文章

CMU buffer overflow attack作業筆記

圖片
三年前線上課程看到的,現在有空筆記一下,這是CMU的計算機組織課程的作業( https://www.cs.cmu.edu/~213/index.html ),應該是大二的課程。 作業可以在這邊載到( http://csapp.cs.cmu.edu/3e/labs.html ) 須要在x86–64的機器上執行.  作業給了一個有buffer overflow問題的程式bomb跟其原始碼bomb.c, 依難度大概有下面幾個層級 1.函數返回時利用buffer overflow去呼叫另一個不帶參數函數 2.函數返回時利用buffer overflow去呼叫另一個帶參數函數 3.利用buffer overflow去修改全域變數 4.最難的是利用buffer overflow去執行一段自己插入的程式(機器碼),然後要正常返回呼叫函數。 預備知識: 首先,先看x86–64 架構有什麼registers ,這邊 %rip:instruction pointer,用來指到下一個instruction的位置.  %rbp:Frame pointer,用來指到目前stack frame的開頭. %rsp:stack pointer,用來指到目前stack的top,也是尾巴。 sourece: Carnegie Mellon 1 Assembly and Bomb Lab 15-213: Introduction to Computer  x86的stack 是從高位往低位長的, 方向是rbp 往→ rsp ,caller呼叫函數時會把參數push(壓入)stack,接著呼叫函數,並把return的位址存在rbp+8的位置,接著把該含要用到的register值跟區域變數推入stack. 如下的程式Alpha呼叫Beta時,把引數23先推入stack,再呼叫Beta並先把返回位址推入stack. sourece: https://www.doc.ic.ac.uk/~herbert/teaching/CA05-Intel-5.pdf 題目一:函數返回時利用buffer overflow去呼叫另一個不帶參數函數 bomb程式有...

Raspberry Pi (ARMv6)上自幹一個微小作業系統

      大約半年前,我加入fb的F9 based JuluOS與黃敬群老師( Jserv) 成大嵌入式系統課程社團,我才發現原來台灣有那麼多人在研究作業系統開發,我也想試試開發一個小小的OS。      從0開始寫一個OS是相當有趣的過程,可以檢視自己對C、資料結構、作業系統、計算機組織的瞭解程度,誠實的面對自己,雖然自己在系統廠工作幾年了,還是很多基礎知識不足,也許這就是為什麼那麼多高手可以在ic design house,而我在系統廠吧,寫這個小OS,只是學習的開始,接下來我會多研究其它的OS,例如:xv6、F9 microkernel、freeRTOS...       我把開發流程一步一步記錄,從bare metal Helloworld,加入printk,配置MMU, IRQ中斷,記憶體管理(Buddy system),到最後加入system call、process fork與round robin scheduling,方便學習。        所有原始程式碼都放在github上:  https://github.com/tzuCarlos/RaspberryPi      我使用qmeu測試:      這邊有執行的結果: https://github.com/tzuCarlos/RaspberryPi/blob/master/mimiOS/RESULT      系統說明:         先拖稿一下,下班還要唸書,顧嬰兒很累的,改天有空補上一步步說明XD      未來工作:      1.把ARM的架構跟ARM組合語言弄熟。      2.系統memory map我還沒好好規畫,只是想到做什麼功能,就找一塊出來。      3. 沒有檔案系統,沒有shell、沒有驅動程式構架。       ...

vim + cscope + ctags + nerdtree + taglist + SrcExpl+trinity, c ya source Insight.

圖片
 Bought a MACbook air installed ubuntu+LXDE, time to say good bye to windows & source Insight. I tried eclipse to develop C about 1 month before, eclipse is nice tool to trace code, but somehow I still feel eclipse a bit laggy.        Finally, I use VIM, because both of MAC OS X and Linux have VIM.      website:  The NERD tree : A tree explorer plugin for navigating the filesystem download NERD_tree.zip unzip NERD_tree.zip  mkdir -p ~/.vim/plugin  mv plugin/NERD_tree.vim ~/.vim/plugin  vim ~/.vimrc add this line: nnoremap :NERDTree same producer to install taglist,  trinity,  and SrcExpl.  You may need a script to generate cscope and ctags index files. CSCOPE_FILE=cscope.out if [ -n "$1" ]; then  echo "Source code directory: " $1  echo "Create file map : " $CSCOPE_FILE  find $1 -name "*.c" -o -name "*.c" -o -name "*.h" -o -name "*.c" -o -name "*.S" > ...

自己動手做OS之Raspberry Pi interrupt example 筆記

圖片
Happy Chinese New Year!!  希望我年假,有更多時間好好學習作業系統...T_T 這是個學習筆記,還未整理好,看起來很亂,但是我會盡量把該注意的重點寫下。 Interrupt example Raspberry Pi source code: https://github.com/tzuCarlos/RaspberryPi/tree/master/labInterrupt 這範例中,我們使用timer 產生IRQ,執行時,可以看到,每隔一小段時間,就會印出IRQ_handler,在IRQ_handler()中,先關掉了IRQ再印出IRQ_handler,接著啟動IRQ,這是一個簡單的範例,但不是有效率的處理IRQ方式,以後我們來討論巢式中斷。 當IRQ發生時,硬體會自動跳到0x18的位址上去執行程式,但我們系統是掛在0x10000上,跳到0x18時並沒有東西,這時有幾個解決方式,1是利用mmu把0x18 mapping 至 0x10018上,或是設定CP15,跳轉到正確的中斷處理向量表上。 ARM的官方網站有很好說明,值得一看。 http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0203j/Cacbhjjj.html 以下是節錄  陳鐘誠老師的網站( http://sp1.wikidot.com/arm ) ------------------------------------------------------------------------------------------------------------------------- ARM 的可存取暫存器為 R0-R15,其中 R13為堆疊指標 SP (Stack Pointer),R14 為連結暫存器 LR (Link Register),R15 為程式計數器 PC (Program Counter)。 ARM的狀態暫存器有 CPSR (Current Processor Status Register) 與 SPSR (Saved Processor Status Register)。其中 SPSR 乃是在中斷時用來自動儲存CPS...

MAC OS X 10.10 minicom USB to serial 安裝

1. 下載 minicom 2.7 https://alioth.debian.org/projects/minicom/ 2.解開後 ./configure (我的安裝時說automake需要安裝Xcode,就安裝先囉) make sudo make install 3. 上usb-to-serial cable網站我的chip是PL2303 -> 系統偏好設定>安全性與隱私>允許安裝 查詢我的設備是tty.usbserial ls -1 /dev/tty .* /dev/tty.usbserial  4.執行minicom -s 設定> Serial port setup -> A - Serial Device: /dev/tty.usbserial -> F - Hardware Flow Control: NO 選: save setup as dfl  -> 發現錯誤 sudo mkdir /usr/local/etc -> sudo chmod 777 /usr/local/etc nailed it!!!

Linux VLAN 筆記

圖片
Linux VLAN 筆記  kernel 開啟802.1q功能後,便可以透過簡單指令,設定VLAN.  brctl delif br0 ath0 brctl delif br0 eth0 vconfig add ath0 555 vconfig add eth0 555 ifconfig ath0.555 up brctl addbr br555 brctl addif br555 ath0.555 brctl addif br555 eth0.555 ifconfig ath0.555 up ifconfig eth0.555 up ifconfig br555 10.0.0.11 up Wireless AP mode運作正常,抓無線封包有看到帶了VLAN ID 555. 不幸的是,我的Wireless STA,不能成功ping到我的AP,只好下去看程式,這邊有幾個部份要看.  1. Linux kernel 802.1q  2.Wireless driver.(我手邊的是Atheros proprietary LSDK driver,所以這部份內容都不會放上來)  3.hostapd跟wpa_supplicant.    Linux的net_dev是用一個list串起來,每個net_dev都有會呼叫ev_queue_xmit ->dev_hard_start_xmit ,去傳送封包至下一步。  vlan.c::vlan_proto_init()時會invoke,dev_add_pack(&vlan_packet_type);  static struct packet_type vlan_packet_type __read_mostly = {         .type = cpu_to_be16(ETH_P_8021Q),         .func = vlan_skb_r...