Segfo Java in 6 Zeilen

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

Tatsächlicher Code

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 ...

Ausführungsergebnis

Für Linux (Ubuntu)

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

Für Windows

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.

Über Segfo

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.

Super grober Kommentar

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 !!

Referenzierte Websites usw.

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

Segfo Java in 6 Zeilen
Segfo Ruby in 2 Zeilen
Änderungen in Java 11
Janken in Java
Umfangsrate in Java
FizzBuzz in Java
Versuchen Sie, etwa 30 Zeilen in Java zu kratzen (CSV-Ausgabe)
Lesen Sie JSON in Java
Machen Sie einen Blackjack mit Java
Einschränkungsprogrammierung in Java
Setzen Sie Java8 in Centos7
NVL-artiger Typ in Java
Verbinden Sie Arrays in Java
"Hallo Welt" in Java
Aufrufbare Schnittstelle in Java
Kommentare in der Java-Quelle
Azure funktioniert in Java
Formatieren Sie XML in Java
Einfache HTML-Spezialchars in Java
Boyer-Moore-Implementierung in Java
Hallo Welt in Java
Verwenden Sie OpenCV mit Java
WebApi-Memorandum mit Java
Typbestimmung in Java
Befehle in Java ausführen (Ping)
Verschiedene Threads in Java
Implementierung der Heap-Sortierung (in Java)
Zabbix API in Java
ASCII-Kunst in Java
Listen in Java vergleichen
POST JSON in Java
Fehler in Java ausdrücken
Erstellen Sie JSON in Java
Datumsmanipulation in Java 8
Was ist neu in Java 8?
Verwenden Sie PreparedStatement in Java
Was ist neu in Java 9,10,11
Parallele Ausführung in Java
Versuchen Sie es mit RocksDB mit Java
Vermeiden Sie den Fehler, den Yuma in Java gemacht hat
Holen Sie sich EXIF-Informationen in Java
Bearbeiten von ini in Java: ini4j
Java-Geschichte in dieser Welt
Versuchen Sie, JavaScript in Java aufzurufen
Lassen Sie uns Spresense mit Java entwickeln (1)
Probieren Sie den Funktionstyp in Java aus! ①
Ich habe ein Roulette in Java gemacht.
Implementierung der zweistufigen Authentifizierung in Java
Refactoring: Machen Sie Blackjack in Java
Schreiben Sie Flyway-Rückrufe in Java
Themenanalyse (LDA) in Java
Importieren Sie Excel-Daten mit Java 2
NEologd-Vorverarbeitung in Java neologdn-java
Ändern Sie die Java-Codierung in Windows
Java Stream API in 5 Minuten
Problem beim Finden von javax.annotation.Generated in Java 11 nicht
Lesen Sie die Standardeingabe in Java