CDS 未對齊訪問異常 2

2021-07-08 11:36:21 字數 2281 閱讀 6469

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 ...