1、異常表現
圖1 debug
圖2 pctrace view
圖3 control-registers
圖4 disassembly
圖5 main-registers
2、分析
(1)epsr0x80010151
分析知:未對齊訪問異常
(2)epc0x8003b8de
和圖4 disassembly
和圖2 pctrace view
分析知:
(3)猜測0x8003b8de 這行**的意思
121(new_node -> cs_previous) -> cs_next = new_node;
0x8003b8de st r3,(r7 + 4):
將暫存器r3的值,放到(r7 + 4) 位址上。
那麼:r3 表示new_node;
r7 表示(new_node -> cs_previous)
+4表示-> cs_next
分析知:
(new_node -> cs_previous)位址錯誤。
圖 6 fun
(new_node -> cs_previous) 源自(*head) -> cs_previous;
那麼,就是(*head) -> cs_previous的位址錯誤。
圖7 fun1
圖8 expressions
(*head)就是smd_created_semaphores_list,smd_created_semaphores_list的位址是0x8006f034。
圖9 0x8006f034 hex.png
smd_created_semaphores_list的位址是0x8006f034。
發現這個值0x57207265和r7的值一模一樣。
0x57207265就是(*head) -> cs_previous;
即指標cs_previous的值是0x57207265;
那麼向指標cs_previous儲存資料,一定會發生未對齊錯誤。
因為位址0x57207265不是正確的記憶體位址。
(5)無意中將hex顯示,改為ascill顯示,發現:
圖10 0x8006f034 string.png
這個竟然是字串。
然後,檢視字串位置,即位址。
圖11 expression.png
發現dataarray_2全域性陣列的長度為256,但是使用memcpy向其拷貝了310個位元組,超出了buffer的界限。
(6)將dataarray_2全域性陣列長度變得足夠大,發現異常解決,在異常處跟蹤,也沒有出現問題。
(7)思考:
拷貝時陣列越界,難查。寫拷貝動作**時,需謹慎。
dataarray_2全域性陣列只是在前邊使用了一次,就不再使用了。但是後邊的**還是出錯了。
說明後邊的**要求必須要初始化,就是因為dataarray_2全域性陣列越界,將初始化破壞了,造成了錯誤。
未捕獲的異常
現在,你應該有怎樣的例外工作合理的想法。在這節課中,我們將覆蓋更多的一些有趣的例外情況。未捕獲的異常 在過去的幾個例子,有相當多的情況下,函式假定其呼叫者 或另乙個函式在呼叫堆疊 處理的例外。在下面的例子中,假設有人會mysqrt 處理異常,但如果沒有人把究竟發生了什麼?這是我們的平方根程式再次,減...
位元組對齊訪問
位元組對齊定義 指令對運算元起始位址有特定的要求 1 單位元組對齊 單位元組型別資料 可從任意位址取運算元 2 2位元組對齊 2位元組型別資料 希望從偶位址開始取運算元 3 4位元組對齊 4位元組型別資料 希望從能被 整除的位址開始取運算元 符合上面要求的 稱為對齊的儲存訪問 訪問結果正確 反之稱為...
Docker Remote API未授權訪問
0x00 漏洞原因dockerd h unix var run docker.sock h 0.0.0.0 2375 docker守護程序監聽在0.0.0.0,外網可訪問 沒有使用iptables等限制可連線的 ip0x01 漏洞利用 1.遠端對被攻擊的主機的docker容器進行操作 docker ...