python與C混編的執行邏輯
阿新 • • 發佈:2018-12-13
0x00 前言
之前遇到過一個C語言呼叫python的問題,是載入python版本可以在初始化前設定,如果不設定,會使用預設路徑/usr/bin/python.
設定方法為在 Py_Initialize
呼叫前使用Py_SetProgramName
,即可呼叫指定版本的python
0x01
當然還有一個問題,就是寫了一個python指令碼load了呼叫python的C模組,
問題描述
- python模組module1
- 在c中呼叫module1模組的C程式碼模組module2
- python程式碼main.py呼叫了module2
執行命令
python main. py
簡單執行執行流程
main.py -> module2 -> module1
加入變態的執行流程
上面module2只執行一遍,現在為了讓module不停的載入銷燬引入while迴圈
while True:
new module2()
module2.foo()
delete module2
問題出現,提示double free or corruption (!prev)
檢視堆疊,目標暫存器為0x00,明顯是寫越界,為什麼目標地址是NULL
問題原因
-
在python呼叫C時,Py_Initialize不會在C中執行,所以無法Py_SetProgramName(當然這是另外一個問題)。
-
在我的程式碼中,new module2()時,會根據Py_IsInitialized判斷python有沒有初始化,決定是否初始化module1中使用的ctypes變數,因為while迴圈中destory了ctypes變數,但是Py_Initialize卻不會再次呼叫(python作為main入口,module2中及時顯示呼叫Py_Initialize也沒用),導致這些變數重複free。
小結
python作為main入口,所使用的c模組中及時顯示呼叫Py_Initialize,Py_SetProgramName等函式也是無效的。