1. 程式人生 > >python與C混編的執行邏輯

python與C混編的執行邏輯

0x00 前言

之前遇到過一個C語言呼叫python的問題,是載入python版本可以在初始化前設定,如果不設定,會使用預設路徑/usr/bin/python.

設定方法為在 Py_Initialize呼叫前使用Py_SetProgramName,即可呼叫指定版本的python

0x01

當然還有一個問題,就是寫了一個python指令碼load了呼叫python的C模組,

問題描述

  1. python模組module1
  2. 在c中呼叫module1模組的C程式碼模組module2
  3. 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
在這裡插入圖片描述

問題原因

  1. 在python呼叫C時,Py_Initialize不會在C中執行,所以無法Py_SetProgramName(當然這是另外一個問題)。

  2. 在我的程式碼中,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等函式也是無效的。