作者 tanted (為何世界會那麼不單純)
標題 FW: [請益] 如何追查可能因MutilThtread下stackover
時間 Sun Jul 23 14:55:45 2023


※ [本文轉錄自 C_and_CPP 看板 #1alCn-OQ ]

作者 tanted (為何世界會那麼不單純)
標題 [問題] 如何追查可能因MutilThtread下stackover
時間 Sun Jul 23 14:45:15 2023


開發平台(Platform): (Ex: Win10, Linux, ...)
linux openwrt

編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
gcc

額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)


問題(Question):
傳入參數被莫名的修改

某個API 如下
                  CfaIfmNotifyInterfacStat (u4IfIndex, u1AdminStatus,
                                               &u1OperStatus, u1IsFromMib,
                                               u1IsRegToIp,
                                               &IfInfo)) != CFA_SUCCESS)

傳入時的值:
 u4IfIndex=43 , u1AdminStatus=1, &u1OperStatus=(UINT1 *) 0xb1e0256f

進入API後值卻變成
 https://upload.cc/i1/2023/07/23/ZnvhDF.jpg
[圖]
u4IfIndex=0, u1AdminStatus=0 , pu1InOperStatus=0x0,
前面4個參數都被變成0

請問各位網友其會被修改到的原因
是不是因為Mutil thread 所造成 其值被其他thread StackOverflow  修改
但由於thread 眾多 各位網友是不是有甚麼的方式或tool
能介紹給我 去debug 找出是哪個thread 哪段code 所造成
謝謝


--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 106.1.107.225 (臺灣)
※ 作者: tanted 2023-07-23 14:55:45
※ 文章代碼(AID): #1alCn-OQ (C_and_CPP)
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1690094718.A.61A.html

※ 發信站: 批踢踢實業坊(ptt.cc)
※ 轉錄者: tanted (106.1.107.225 臺灣), 07/23/2023 14:55:45
wulouise: 你都有bt, 怎麼不先看看caller的植是不是對的?1F 07/23 15:02
上面所講的值 u4IfIndex=43 , u1AdminStatus=1 就是由 gdb print 印出來的
loadingN: 用 Valgrind 自己查啊2F 07/23 15:04
kokal: 試試"hardware" watchpoint?3F 07/23 15:32
xam: 比較簡單的就是你觀察一下這函式內有沒有呼叫完某個子程式回來之後,值就跑掉,可能是裡頭有問題4F 07/23 16:00
基本上 pu1InOperStatus這是pointer
pu1InOperStatus=0x0(null)
API 用到它 整隻程式就 crash了
※ 編輯: tanted (106.1.107.225 臺灣), 07/23/2023 16:08:58
xam: 還是沒辦法的話,開發環境許可的話,把編譯器警告打開,修一修..6F 07/23 16:04
※ 編輯: tanted (106.1.107.225 臺灣), 07/23/2023 16:09:33
xam: 我的意思是函式執行到一半,發現原本參數被改了,但如果你的意思是一進入函式,參數就錯了.. 那我一時想不到其他簡單的建議7F 07/23 16:13
RafaelC: 可以用gdb裡 "watch"這個command可看是誰改了variable值google一下gdb watch variable,就可以看到一些介紹了9F 07/23 16:48
難點 要監看是local variable 進入API後來才能監看
※ 編輯: tanted (106.1.107.225 臺灣), 07/23/2023 17:29:20
aa06697: 有碰哪些變數的地方都寫Log?總會找到哪裡改掉那些值11F 07/23 18:54
wulouise: 沒有signature, 你全部都pass by ref/ptr?12F 07/23 18:56
RafaelC: u4IfIndex不是是傳入的參數嗎?怎麼是local variaable?13F 07/23 18:59
其實上層有個變數 也叫u4IfIndex 和API 宣告的參數名字也叫u4IfIndex
上層 變數 u4IfIndex 的值是沒被改到 但API裡變數u4IfIndex的值被改到
目前 其實是這樣認為的
"原本thread 在進入 function,cpu 因context switch 換到其他的thread
而這個thread buff 沒有處理好 Overflow 蓋掉原本thread 的 stack buff"
※ 編輯: tanted (106.1.107.225 臺灣), 07/23/2023 19:27:24
jheli: 所以你傳入的前四個參數到底是global variables還是只是上層的local variables?上層的參數是static嗎?
無法watch那就手動將每個會碰到這些參數的thread都埋log吧14F 07/24 00:54
wendly777: 懷疑被overflow攻擊,可以用ASan試試,另外,如果你是arm/x64,前幾個參數是放在register,就不可能被攻擊到,就要往其他方向想,x86才會放stack17F 07/24 19:35

--
作者 tanted 的最新發文:
點此顯示更多發文記錄