0

私はクラスで非常に奇妙な振る舞いをしておりzipfile、誰かが私を悩ませている問題を解決するのを手伝ってくれることを願っています.

パスワードで暗号化された zip ファイル (WinRar で圧縮されたもの) を開こうとする短いスクリプトを作成しましたが、zipfile他のいくつかのパスワードが間違っている場合、クラスは例外を発生させないことがわかりました。

したがって、zipファイルのパスワードは「悪」でしたがzFile.extractall、パスワードが次のいずれかである場合は実行されませんでした

  • 'チェックアウト',
  • '断捨離者',
  • 「euornithes」または
  • 「ヤマルツ」。

zipfileリストされたパスワードを使用してクラスで抽出した後の追加コンテンツが正しくありませんでした。WinRar でさえ、これらのパスワードを使用して解凍することはできません。

私のPythonコードは次のとおりです。

import zipfile

diffrentPass = [
            'wrongpass1',
            'wrongpass2',
            'checkouts',
            'disannuller',
            'euornithes',
            'evil',
            'yamaltu']


def extractFile(zFile, password):
    try:
        answer= zFile.extractall(pwd=password)
        print 'Fount password : ', password
    except:
        pass

def main():
    zFile = zipfile.ZipFile("evil.zip")

    for password in diffrentPass:
        extractFile(zFile, password)

    if __name__ == '__main__':
        main()

アップデート :

私は例外をスキップしたことを知っていますが、プログラムから見てください:

wrongpass1 was incorrect
wrongpass2 was incorrect
Fount password :  checkouts
Fount password :  disannuller
Fount password :  euornithes
Fount password :  evil
Fount password :  yamaltu

Process finished with exit code 0

行:

Fount password :  checkouts
Fount password :  disannuller
Fount password :  euornithes
Fount password :  yamaltu

絶対に現れてはならない

たとえば、次のように追加します。

def extractFile(zFile, password):
    try:
        answer= zFile.extractall(pwd=password)
        print 'Fount password : ', password
    except Exception, e:
        print password + " was incorrect"

出力は何も変わらない


更新 + 何が起こったのか

@Phil Frost何が起こったのか説明してください

それが実際に私の問題のポイントであることを確認するために、スクリプトにいくつかのデバッグ出力を追加して、パスワードとファイルのcheck_byteを比較します。

出力例:

#!! Wrong pass, check_byte are diffrent
#  raised RuntimeError("Bad password for file", name)
Checking bytes for :  wrongpass1
pass check_byte : 47
file check_byte  112
Pass is correct for zipfile class :  False

#!! wrong password but for zipFile is ok , check_byte are the same 
# but file will be the unpacked incorrectly
# RuntimeError("Bad password for file", name) will be not rise
Checking bytes for :  checkouts
pass check_byte : 112
file check_byte  112
Pass is correct for zipfile class :  True
Fount password :  checkouts

#!! password ok 
Checking bytes for :  evil
pass check_byte : 112
file check_byte  112
Pass is correct for zipfile class :  True
Fount password :  evil

コード :

import zipfile, zlib, binascii, struct
from zipfile import _ZipDecrypter

diffrentPass = [
    'wrongpass1',
    'wrongpass2',
    'checkouts',
    'disannuller',
    'euornithes',
    'evil',
    'yamaltu',
    'wrongpass1',]



def extractFile(zFile, password, bytes):


    print '\nChecking bytes for : ', password
    zd = _ZipDecrypter(password)
    h = map(zd, bytes[0:12])

    print 'pass check_byte :', ord(h[11])

    for item in zFile.infolist():
        if item.flag_bits & 0x8:
            check_byte = (item._raw_time >> 8) & 0xff
        else:
            check_byte = (item.CRC >> 24) & 0xff
        print 'file check_byte ',check_byte

    print "Pass is correct for zipfile class : " ,  ord(h[11]) == check_byte

    try:
        answer= zFile.extractall(pwd=password)
        print 'Fount password : ', password
    except Exception, e:
        pass



def main():

    # begining of ziped file must be cut off  dummy method works ony on this specific zip file
    # ....20111126036.jpg
    bytes = open('evil.zip', 'rb').read(45+12)[-12:]

    zFile = zipfile.ZipFile("evil.zip")

    for password in diffrentPass:
        extractFile(zFile, password,bytes)

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

5 に答える 5

3

例外が発生しますが、エラーは表示されず、「pass」を呼び出して無視するため、「飲み込んでいます」。

また、コードには別の問題があります。メインモジュール部分が正しくインデントされていません。現在のコードでは、メイン モジュールへの呼び出しが main() の定義の一部であるため、main() は呼び出されません。

import zipfile

diffrentPass = [
            'wrongpass1',
            'wrongpass2',
            'checkouts',
            'disannuller',
            'euornithes',
            'evil',
            'yamaltu']


def extractFile(zFile, password):
    try:
        answer= zFile.extractall(pwd=password)
        print 'Fount password : ', password
    except:
        print password + " was incorrect"


def main():
    zFile = zipfile.ZipFile("evil.zip")

    for password in diffrentPass:
        extractFile(zFile, password)

if __name__ == '__main__':
    main()
于 2012-12-30T14:33:31.883 に答える
1

このプログラムの目的は、パスワードを zip ファイルからブルート フォースで取り出すことだと思います。試したパスワードのリストが長くなり、質問にリストされているいくつかのパスワードだけが例外を発生させていないと思いますが、期待どおりに動作するパスワードは他にもたくさんあります。

zipfile が実装されているため、255 分の 1 の確率でパスワードが受け入れられ、例外が発生しないようです。これは、パスワードが 1 バイトのチェックサムをチェックすることによって検証されるためです。

if ord(h[11]) != check_byte:
    raise RuntimeError("Bad password for file", name)

(完全なソース)

編集: さらに調査した結果、これは重複した質問である可能性があります。

私が知る限り、zip 暗号化は弱く、総当り以外の手段で簡単に破られてしまいます。ただし、私は自分でそれを行う理由がなく、あなたが達成しようとしていることの詳細がわからないため、より具体的な解決策を提案することはできません.

于 2012-12-30T15:03:31.527 に答える
0

コードで例外を無視しました。例外を発生させたい場合は、次のようにします。

def extractFile(zFile, password):
    try:
        answer= zFile.extractall(pwd=password)
        print 'Fount password : ', password
    except Exception, e:
        # do something here before raising exception
        raise e

または、try exceptブロックをまったく使用しないでください。

コメント後に編集

パスワードが間違っていることを報告したい場合は、それをexceptブロックで行う必要がzFile.extractall(pwd=password)ありますprint.

def extractFile(zFile, password):
    try:
        answer= zFile.extractall(pwd=password)
        print 'Password "%s" is correct' % password
    except Exception, e:
        print 'Password "%s" is incorrect' % password
        pass
于 2012-12-30T14:33:39.400 に答える
0

ここでは、発生する可能性のある例外を明示的に破棄しているようです:

try:
    answer= zFile.extractall(pwd=password)
    print 'Fount password : ', password
except:
    pass

zFile.extractall() で例外が発生した場合、except:ブロックが実行されます。例外ブロックには が含まれていますpass。これは、python では「何もしない」または「ノーオペレーション」を意味します。

于 2012-12-30T14:33:43.613 に答える