Python自動化除錯

2021-10-25 20:46:44 字數 3814 閱讀 1554

在文件裡找到了這幾個看上去用得上的函式

dbg_print_all_debug_registers(self)

bp_set(self, address, description=

'', restore=

true

, handler=

none

)get_register(self, register)

@param register: one of eax, ebx, ecx, edx, esi, edi, esp, ebp, eip

hex_dump(self, data, addr=

0, prefix='')

read(self, address, length)

terminate_process(self, exit_code=

0, method=

'terminateprocess'

)write(self, address, data, length=0)

set_register(self, register, value)

load(self, path_to_file, command_line=

none

, create_new_console=

false

, show_window=

true

)

乙個pydbg模板如下,**書籍r3kapig戰隊的《ctf特練營》

from pydbg import

*from pydbg.defines import

*def

handler1

(dbg)

:# some code here

return dbg_continue

defmain()

: target =

'./reverse0.exe'

dbg = pydbg(

) dbg.load(target,create_new_console=

true

)#set a break point

dbg.bp_set(

0x411a62

,handler=handler1)

dbg.run(

)main(

)

pydbg的相較於od等傳統偵錯程式的優點在於能和python互動,方便寫偵錯程式指令碼,於是我打算用pydbg寫乙個能自動輸入flag,然後下斷點,輸出關鍵的比較資料的指令碼,通過輸出的關鍵資料可以進行爆破。

我先寫了個簡單的題目

#include

#include

#include

void

change

(char

*flag)

}char data[37]

="cj`a|2|ezs^b`w]mdvpdh^

system

("pause");

system

("pause");

return0;

}//flag

為了爆破這個程式,我寫了這個指令碼(有問題待解決)

from pydbg import

*from pydbg.defines import

*import subprocess

defcall_back1

(dbg)

:global index

print

("hello"

) ebp = dbg.get_register(

'ebp'

) read_data = dbg.read(ebp-

0x2c

+index,

36-index)

print

(read_data)

print

(len

(read_data)

)return dbg_continue

defcall_back2

(dbg)

: dbg.terminate_process(

)return dbg_continue

defburst()

: brust_str =

'flag'

target = r'd:\0study2\explore\pydbg.exe'

p = subprocess.popen(target)

pid = p.pid

dbg = pydbg(

) dbg.attach(pid)

dbg.bp_set(

0x411a62

,handler=call_back1)

dbg.bp_set(

0x411a93

,handler=call_back2)

dbg.run(

)print

("hello"

)if __name__ ==

'__main__'

: index,char =1,

0 burst(

)

我原本想利用subprocess實現自動輸入的,但是發現pydbg attach到這個程式後,subprocess就不能利用管道自動輸入了,因為父程序易主了,subprocess失去了對程式的控制,所以需要手動輸入flag。這與我一開始的想法相違背,但是我嘗試了很多方法均以失敗告終

雖然不能自動輸入,但是如果程式是以讀檔案的方式寫入flag的話就沒有這個問題了,這樣我們就能下斷點讀取某個記憶體的值實現爆破了

2021.3.29更新

利用斷點+修改eip克服了自動輸入的問題,可以進行爆破了,但是程式會輸出很多字元,極大降低了爆破的效率,後面我連輸出也繞過了,發現還是慢,偵錯程式爆破就是慢

from pydbg import

*from pydbg.defines import

*# 411a25

cmp_data =

'cj`a|2|ezs^b`w]mdvpdh^_'

max_num =

0num =

0max_char =

''flag =

''if __name__ ==

'__main__'

:for i in

range(36

):max_num =

0for j in

range

(len

(print_table)):

brust_str =

'x'*i + print_table[j]

+'x'*(

35-i)

burst(

)if num > max_num:

max_num = num

max_char = print_table[j]

flag += max_char

print

(flag)

#flag

print

(flag)

pythongdb使我們可以通過python指令碼來編寫gdb除錯指令碼,詳細文件

環境我沒搭建成功,這方面的資料太少了,我這裡提一下,讓大家知道有這樣乙個自動化除錯工具

這個重要性不必多說,官方文件 ,官方文件裡的函式太多了,看起來很痛苦,國內似乎也沒有很好的歸納文章,列乙個勉強還可以的

逆向的話用的最多的就是idc庫的get_bytespatch_bytes

自動化測試 Python指令碼除錯知識

本次除錯使用到的庫websocket uuid codecs subprocess幾個庫 subprocess.popen類用於在乙個新程序中執行乙個子程式,上述subprocess函式均是基於subprocess.popen類 subprocess.popen args bufsize,stdin...

python 讓繁瑣工作自動化 除錯

將可能出錯的程式放在try子句中,如果出現乙個錯誤,程式就會立刻轉到except處,執行完except處的 後,程式繼續往下執行。def spam divideby try return 42 divideby except print erro invalid argument print spa...

python自動化測試

為了讓單元測試 能夠被測試和維護人員更容易地理解,最好的解決辦法是讓開發人員遵循一定的規範來編寫用於測試的 具體到python程式設計師來講,則是要採用pyunit這一自動測試框架來構造單元測試用例。目前pyunit已經得到了大多數python開發人員的認可,成了事實上的單元測試標準。1.要被測試的...