Dies ist der erste Beitrag. Bitte beachten Sie, dass dies unansehnlich sein kann.
Da es populär geworden ist, jede Sprache von Python zu trennen ...
Segfo mit Python in drei Zeilen Segfo mit Python in 2 Zeilen Segfo mit 16 Zeichen in C-Sprache Segfo mit 33 Zeichen in Python Segfo mit Rost in 5 Zeilen Segfo mit 5 Zeichen in C-Sprache
Als Ergebnis der gewaltsamen Herstellung von 6 Zeilen
a.java
import java.lang.reflect.*;
import sun.misc.Unsafe;
class A {public static void main(String[] a) throws Exception {Constructor<Unsafe> b=Unsafe.class.getDeclaredConstructor();
b.setAccessible(true);
b.newInstance().putLong(0, 0);} }
Es ist übertrieben und nicht lesbar Wenn Sie den Code organisieren
a.java
import java.lang.reflect.*;
import sun.misc.Unsafe;
class A {
public static void main(String[] a) throws Exception{
Constructor<Unsafe> b=Unsafe.class.getDeclaredConstructor();
b.setAccessible(true);
b.newInstance().putLong(0, 0);
}
}
Es ändert sich nicht viel ...
Ubuntu
#
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0x00007f8b7c08ba84, pid=1986, tid=1987 #Segfo hier(Zugriffsverletzung)Es passiert
#
# JRE version: OpenJDK Runtime Environment (14.0.1+7) (build 14.0.1+7-Ubuntu-1ubuntu1)
# Java VM: OpenJDK 64-Bit Server VM (14.0.1+7-Ubuntu-1ubuntu1, mixed mode, sharing, tiered, compressed oops, g1 gc, linux-amd64)
# Problematic frame:
# V [libjvm.so+0xe99a84]
#
# No core dump will be written. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# An error report file with more information is saved as:
# /home/user/hs_err_pid1986.log
#
# If you would like to submit a bug report, please visit:
# Unknown
#
Aborted
(Ubuntu+OpenJDK Runtime Environment 14.0.1)
Da es auf WSL2 ausgeführt wurde, kann das tatsächliche Ergebnis abweichen.
Bei der Ausführung wird eine schreckliche Fehleranweisung und eine Fehleranweisung mit fast 750 Zeilen erzeugt.
Achten Sie auf die 5. Zeile der Fehlererklärung ...
4. Zeile
SIGSEGV(0xb)atpc=0x00007f8b7c08ba84,pid=1986, tid=1987
Wie Sie sehen können, erhalten Sie ein SIGSEGV-Signal (Zugriffsverletzung).
Darüber hinaus ist die Protokolldatei eine detaillierte Generierung des aufgerufenen Datei- und Speicherauszugs.
Ubuntu-Protokolldatei Zeile 49:
has_err_pid{posess_id}.log
49:siginfo: si_signo: 11 (SIGSEGV), si_code: 1 (SEGV_MAPERR), si_addr: 0x0000000000000000
Zugriff auf die Adressen 0
und SEGV_MAPERR
(Fehler, der beim Zugriff auf nicht zugeordneten Speicher auftritt)
Sie können sehen, dass das passiert
Windows
#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ffd4fa119b7, pid=18520, tid=8224
#
# JRE version: Java(TM) SE Runtime Environment (14.0.1+7) (build 14.0.1+7)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (14.0.1+7, mixed mode, sharing, tiered, compressed oops, g1 gc, windows-amd64)
# Problematic frame:
# V [jvm.dll+0x7219b7]
#
# No core dump will be written. Minidumps are not enabled by default on client versions of Windows
#
# An error report file with more information is saved as:
# C:\Users\User\aa\hs_err_pid18520.log
#
# If you would like to submit a bug report, please visit:
# https://bugreport.java.com/bugreport/crash.jsp
#
(Windows + Java(TM) SE Runtime Environment 14.0.1)
Eine Protokolldatei wird im selben Verzeichnis wie die Klassendatei mit derselben schrecklichen Fehleranweisung wie Ubuntu generiert.
Wenn Sie auf die 4. Zeile achten
4. Zeile
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ffd4fa119b7, pid=18520, tid=8224
Sie können sehen, dass "EXCEPTION_ACCESS_VIOLATION" (Zugriffsverletzung) aufgetreten ist. Betrachten der Protokolldatei, die im selben Verzeichnis wie die Klassendatei generiert wurde
Zeile 40 der Windows-Protokolldatei:
has_err_pid{prosess_id}.log
40:#siginfo: EXCEPTION_ACCESS_VIOLATION (0xc0000005), writing address 0x0000000000000000
Sie können sehen, dass eine Zugriffsverletzung aufgetreten ist, indem Sie an die Adresse 0 des Speichers schreiben.
Was ist es! Es ist kein "Segmentierungsfehler" -Fehler! Es ist ein Betrug! Ich denke, einige Leute denken das,
"[wikipedia -Segmentierungsverletzung-](https://ja.wikipedia.org/wiki/%E3%82%BB%E3%82%B0%E3%83%A1%E3%83%B3%E3%83 % 86% E3% 83% BC% E3% 82% B7% E3% 83% A7% E3% 83% B3% E9% 81% 95% E5% 8F% 8D) "
Unter UNIX-ähnlichen Betriebssystemen erhalten Prozesse, die auf schädlichen Speicher zugreifen, ein SIGSEGV-Signal. Unter Microsoft Windows erhalten Prozesse, die auf unerwünschten Speicher zugreifen, die Ausnahme "STATUS_ACCESS_VIOLATION"
Deshalb behandle ich es als Segfo.
Mit sun.misc.Unsafe
können Sie auch in Java auf Speicher zugreifen.
Können wir es dann nicht mit Unsafe.getUnsafe (). PutLong (0, 0)
kürzer machen? Du denkst vielleicht,
Wie der Name schon sagt, ist Java's "unsicher" eine sehr unsichere Klasse. Sie können den Endwert ändern, Speicher zuweisen, darauf zugreifen und tun, was Sie wollen (obwohl es einige Einschränkungen zu geben scheint). Daher ist der Konstruktor privat und "getunsafe ()" kann nur instanziiert werden, wenn "getclassloder ()" null ist.
Die Lücke besteht darin, die Instanziierung mit der Reflection-API zu erzwingen und dann "setAccessible (true)" zu verwenden, um auf normalerweise unzugängliche Methoden zuzugreifen.
Schließlich konnten wir mit putLong (address, x);
durch Eingabe der Speicheradresse in address
und eines entsprechenden Werts in x
Segfo sogar mit Java anziehen !!
Die Magie von sun.misc.Unsafe Power Skills, die jederzeit schnell eingesetzt werden können - Reflection [Segmentierungsverletzung-Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%BB%E3%82%B0%E3%83%A1%E3%83%B3%E3%83%86% E3% 83% BC% E3% 82% B7% E3% 83% A7% E3% 83% B3% E9% 81% 95% E5% 8F% 8D)
Sie können uns gerne Bearbeitungsanfragen senden. Es ist ein schlechter Text, aber danke, dass Sie bis zum Ende gelesen haben!
Recommended Posts