--- title: 函式呼叫篇 心得 tags: C 語言筆記 --- ## 函式呼叫篇 心得 ==[連結](https://youtu.be/I0uVqReO0_I)== ## Parameter vs. Argument Parameter(formal parameter): void foo(int x) {} 的x Argument (actual argument): foo(4) 的實際的值 ## Process 和 C 程式的關聯 * IRQ(Interrupt Request): 周邊設備都要向電腦發出中斷要求 (interrupt request),才能讓自己的訊號被電腦讀取。 中斷要求簡記為IRQ。 * Interrupt 的處理流程: 1. 暫停目前 process 之執行 2. 保存此 process 當時執行狀況 3. OS 會根據 Interrupt ID 查尋 Interrupt vector 4. 取得 ISR(Interrupt Service Routine)的起始位址 5. ISR 執行 6. ISR 執行完成,回到原先中斷前的執行 * Interrupt I/O(中斷式I/O)其運作處理方式如下: 1. 發出 I/O 要求給 CPU(OS) 2. CPU 設定 I/O commands 給 I/O Device controller 3. I/O Device 運作執行 4. PA 等待 I/O 完成 5. PB 取得CPU 執行 6. 當 I/O 運作完成,則 I/O 會發出一個「I/O Complete Interrupt」(I/O完成中斷)通知OS 7. OS 暫停目前process 的執行 8. OS 根據Interrupt ID 去查詢 Interrupt vector,取出對應的ISR(Interrupt Service Routine)的起始位址 9. CPU 執行ISR 10. ISR 執行完畢,OS 通知 PA 其 I/O 要求完成,將 PA 的狀態改成Ready 11. 由 CPU 排班挑選 process 執行 * MMIO (Memory mapping I/O): I/O 設備被放置在記憶體空間而不是 專屬 I/O 空間。從處理器的角度看,I/O 與 memory 共用記憶體後,系統就不需要額外指令來處理 I/O。 * PMIO (port-mapped I/O): I/O 與 memory 均擁有自己的記憶體空間,需要特別的指令來處理I/O  ## stack * rip (instruction pointer): 記錄下個要執行的指令位址 * rsp (stack pointer): 指向 stack 頂端 * rbp (base pointer, frame pointer): 指向 stack 底部 進入函示呼叫: ``` push rbp ``` rsp的位址紀錄當前rbp的記憶體位址,然後往下移動一個位址的長度8byte ``` mov rbp rsp ``` move rbp to rsp 結束函示呼叫: ``` mov rsp, rbp pop rbp ``` pop是rbp讀取當前記憶體的內容,並跳到該位置 且rsp往上跳8byte,其內容為原先函式的返回位址 接著呼叫ret,rip就會指向返回定址 ## buffer overflow ``` int evil() { system("/bin/sh"); } int main() { char input[10]; puts("Input:"); gets(input); puts(input); } ``` 利用get的對於未檢查輸入長度的漏洞 若輸入超過的長度,程式便會```Segmentation fault``` 利用gdb去觀察可以發現 input 這個區域變數是位於 main 函式的 stack 中。而位於 stack 最頂端(top)的是函式的 return address 因此我們可推測是輸入的 a 蓋到 return address 導致 rip 指到無法存取的地方。 * 通過把rsp位址裡面的內容改為我們想要執行的程式碼位址,便可讓rip執行我們想要的程式碼 * 先算出return address的offset(可以通過輸入的值找) * 找到後就可以修改input的輸入 (a個offset+想要去的位址(x86-64 為 little endian))  [參考] (https://medium.com/@ktecv2000/%E7%B7%A9%E8%A1%9D%E5%8D%80%E6%BA%A2%E4%BD%8D%E6%94%BB%E6%93%8A%E4%B9%8B%E4%B8%80-buffer-overflow-83516aa80240) 參考資料 [TLB](https://ithelp.ithome.com.tw/articles/10269930) [hello world的執行]( https://www.796t.com/content/1546648208.html) [Dynamic Linking](http://jasonblog.github.io/note/linux_kernel/linux_de_dong_tai_lian_jie_yu_zai_ru__dynamic_link.html)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up