2017-03-02 3 views
4

Wir verwenden embedded cpython als Skriptsprache in unserer App. Wir modifizieren unseren sys.path beim Start, um sicherzustellen, dass wir keinen Code von außerhalb unserer App ausführen, aber ein Benutzer mit einer sitecustomize.py in ihrem PYTHONPATH verursacht die Ausführung von Code, bevor wir sys.path reparieren können und wir glauben, dass ihr Code einen schweren Absturz hat (keine Ausnahme, die von site.py korrekt erfasst und behandelt wird).Wie kann ich Python 3.5 zum Absturz bringen?

Ich glaube, die richtige Lösung ist einfach die PYTHONPATH-Variable aus der Umgebung zu löschen, bevor wir Python initialisieren, aber ich kann es nicht richtig testen, weil ich das Problem nicht neu erstellen kann.

Der einfachste Weg, die ich gefunden habe ist ctypes mit dem Speicher, wie zum Beispiel schreiben:

import ctypes 
p = (ctypes.c_char).from_address(0) 
while True: 
    p[0] = 0 
    p = p + 1 

Aber in Python 3.5, es erlaubt mir nicht, Typen zu schreiben, c_char den Fehler geben "TypeError: 'c_char' Objekt unterstützt keine Artikelzuweisung".

Ich habe ein paar der verfügbaren Methoden in https://wiki.python.org/moin/CrashingPython vergeblich versucht.

Gibt es eine zuverlässige Möglichkeit, Python 3.5 aus reinem Python-Code zum Absturz zu bringen?

+0

Sie sollten einen * Zeiger * zu einem 'c_char erstellen 'und indizieren das. – user2357112

+0

haben Sie alle Beispiele auf http://svn.python.org/view/python/trunk/Lib/test/crashers/ getestet? Ich habe keinen Zugriff auf 3.5, aber einige scheinen beim Ausführen auf repl.it abzustürzen, nämlich: [nasty_eq_vs_dict.py] (http://svn.python.org/view/python/trunk/Lib/test /crashers/nasty_eq_vs_dict.py?view=log), [mutation_inside_cyclegc.py] (http: // svn.python.org/view/*checkout*/python/trunk/Lib/test/crashers/mutation_inside_cyclegc.py?content-type=text%2Fplain), [gc_inspection.py] (http://svn.python.org/view /*checkout*/python/trunk/Lib/test/crashers/gc_inspection.py?content-type=text%2Fplain) – davedwards

+0

Danke, @ user2357112, ich habe Ctypes vorher nicht verwendet und habe nur Code kopiert und eingefügt, aber das Für mich macht es jetzt offensichtlich Sinn, dass ich genauer hinschaue. – alvion

Antwort

2

Es gibt viele Möglichkeiten durch ctypes. Zum Beispiel kann eine korrigierte Version des Codes:

p = ctypes.pointer(ctypes.c_char.from_address(5)) 
p[0] = b'x' 

Wenn Sie ctypes nicht verwenden, können Sie einen C-Stack-Überlauf in der dict.__repr__ Implementierung auslösen:

x = {} 
for i in range(1000000): 
    x = {1: x} 
repr(x) 

Dies könnte gepatcht bekommen in einer zukünftigen Python-Version, aber jetzt sollte es einen harten Absturz erzeugen.

Es gibt auch Möglichkeiten, dies zu tun, indem Sie Ihre eigenen Bytecode-Objekte erstellen, da Python fast nichts tut, um sicherzustellen, dass der Bytecode, der ausgeführt wird, Sinn macht.

+0

Ahh, ich verstehe. Ich habe einen offensichtlichen Fehler gemacht. Dies ist die einfachste Antwort mit dem klarsten Code, also akzeptiere ich diesen. Vielen Dank. – alvion

0

Ich benutze normalerweise nur Python 2.7, aber ich glaube, das gilt auch hier solange ich deine Frage richtig verstehe. Wenn Sie ein Python-Programm gewaltsam beenden möchten, besteht die einfachste Möglichkeit darin, einen SystemExit zu erstellen. Hier ist ein ziemlich einfaches Beispiel:

for i in range (0, 10): 
    if (i == 6): #Stop the program at 6 just.. because 
     raise SystemExit 
    print(i) 

Ich hoffe, das war hilfreich!

Happy Coding!

+0

Dies führt nicht zum Absturz von Python. Es ist nicht anders als einfach 'sys.exit()' aufzurufen. – ekhumoro

Verwandte Themen