Shell – die besten Beiträge

Wie kriege ich mit ROP einen "/bin/sh" Pointer in rdi?

Ich versuche, rücksprungorientierte Programmierung (ROP) zu lernen.

Und zwar habe ich ein Programm mit einem Pufferüberlauf auf dem Stack, und ich möchte das Programm dazu bringen, /bin/sh zu öffnen.

Das geht mit dem execve Syscall, wenn ich die richtigen Instruktionen finden kann, um die Funktionsparameter vorzubereiten. Das ist die Signatur von execve:

int execve(const char *pathname, char *const _Nullable argv[], char *const _Nullable envp[]);

Also muss ich die folgenden Register setzen:

  • rax = 0x3b (Syscallnummer von execve)
  • rdi = "/bin/sh" Pointer
  • rsi = NULL
  • rdx = NULL

Die folgenden Instruktionen habe ich bereits gefunden:

pop rax ; ret
pop rdi ; ret
pop rsi ; ret
pop rdx ; ret
syscall

Ich kann also die Instruktionen und Registerwerte mit dem Pufferüberlauf auf den Stack schreiben und so meine Register füllen. Das Problem ist aber, dass ich einen "/bin/sh" Pointer in rdi brauche (also nicht "/bin/sh" im Register, sondern eine Speicheradresse, an der "/bin/sh" steht).

Ich kann natürlich "/bin/sh" in den Puffer auf dem Stack schreiben, aber leider ist die Speicheradresse jedes Mal anders und ich kenne sie vorher nicht.

Ich weiß, dass "/bin/sh" in libc vorkommt, aber auch dort ist die Speicheradresse jedes Mal anders und ich kenne sie vorher nicht.

Wie komme ich also an einen "/bin/sh" Pointer? Gibt es Tricks oder bestimmte Instruktionen, nach denen ich mich umsehen sollte?

hacken, Hack, Programm, programmieren, pointer, Assembler, Hacker, Hacking, Informatik, IT-Sicherheit, Shell, stack, x64, Exploit, hacken lernen, IT-Sicherheitsexperte, Register, Capture The Flag

Hilfe bei diesem einfachen Bash-Skript?

Ich will dass das Programm wenn ich auf "gruppen anzeigen" klicke mir alle Gruppen im System im Dialig angezeigt werden und das Programm beendet wird wenn ich auf "beenden" klicke. Aber irgendwie kommt entweder ein Fehler dass bei mir das "fi" fehlt was nicht stimmt. Oder es werden die Gruppen auch angezeigt wenn ich auf beenden klicke. Ich habe versucht die If-Anweisungen zu löschen und dann nach  wahl=$(cat $inhalt) ein echo zu machen. Und bei mir wird immer "1" ausgegeben egal auf was ich drücke. Wobei ich eig. Wenn ich auf "beenden" klicke dann sollte "Ende" rauskommen" oder ?

#!/bin/bash
#
inhalt=$(mktemp)
auswahl(){
 dialog --backtitle "Elemente anzeigen"  --title "Elemente zeigen" \
        --cancel-label "Abbruch" \
        --checklist "Bitte treffen Sie Ihre Auswahl!" 10 50 3 \
        "1." "Gruppen anzeigen im Dialig" on \
        "Ende." "Programm beenden" off \
        2>$inhalt
 fehler=$?
 clear
 if [ $fehler != 0 ] ;
  then
   echo "Da ist ein Fehler aufgetreten"
   echo "Fehler-Nr.: $fehler"
   rm $inhalt
   exit 1
 fi
 wahl=$(cat $inhalt)


 if [ "$wahl" == "1." ]; then
     dialog --backtitle "Ausgabe von Gruppen" \
            --msgbox "$(groups)" 20 60 \
 fi


 rm $inhalt
}


while :
 do
  auswahl
 done


Betriebssystem, Technik, Linux, HTML, Webseite, Java, JavaScript, VBA, Bash, Batch, cmd, Informatik, Informationstechnik, PHP, Programmiersprache, Python, Shell, Webentwicklung

Wie kann ich die Ausgabe von 'echo' verlangsamen?

Hallo an alle Kenner der bash

Ich wollte gerne einen String, der von 'echo' ausgegeben wird, mit verminderter Geschwindigkeit ausgeben lassen. Beispielsweise ein simples:

echo "Hallo Welt"

Dabei wird der String ja direkt ausgegeben und noch schneller als man ihn schreiben oder lesen könnte. Gemeint ist hier das lesen des Strings während der Ausgabe selbst und nicht das lesen nach der Ausgabe. Wer noch mit MoDem's gearbeitet hat und weiß wie es bei einem 300 Baud Connect aussieht, wird verstehen was ich meine. Die Lektüre von

man echo

und von

info '(coreutils) echo invocation'

Haben mich leider nicht weiter gebracht, so das ich unter Zuhilfenahme weiterer Programme (tr, sed) tricksen musste. Das Ergebnis seht ihr hier:

#!/bin/bash
# Slow down the Output from the 'echo' Command

echo "H"|tr "\n" " "|sed 's/ //'
sleep 0.5|tr "\n" " "|sed 's/ //'
echo "a"|tr "\n" " "|sed 's/ //'
sleep 0.5|tr "\n" " "|sed 's/ //'
echo "l"|tr "\n" " "|sed 's/ //'
sleep 0.5|tr "\n" " "|sed 's/ //'
echo "l"|tr "\n" " "|sed 's/ //'
sleep 0.5|tr "\n" " "|sed 's/ //'
echo "o"|tr "\n" " "|sed 's/ //'
sleep 0.5|tr "\n" " "|sed 's/ //'
echo " "|tr "\n" " "|sed 's/ //'
sleep 0.5|tr "\n" " "|sed 's/ //'
echo "W"|tr "\n" " "|sed 's/ //'
sleep 0.5|tr "\n" " "|sed 's/ //'
echo "e"|tr "\n" " "|sed 's/ //'
sleep 0.5|tr "\n" " "|sed 's/ //'
echo "l"|tr "\n" " "|sed 's/ //'
sleep 0.5|tr "\n" " "|sed 's/ //'
echo "t"

Kennt also jemand von euch einen undokumentierten Parameter oder eine Option mit der man echo dazu überreden könnte langsam zu machen?

Linuxhase

Linux, Bash, openSUSE, Shell, Echo

Bash Script um DNS umzustellen?

Habe einmal ein Bash Script und eine .Desktop Verknüpfungen auf meinem Arch KDE und wollte bei Doppelklick auf die Verknüpfungen zb Updaten oder DNS auf 8.8.8.8 oderr Automatisch Umstellen.

(Ich kann auch via KDE Connect das ganze Starten und ohne EIngabe abschließen mit sudo pacman -Syu --noconfirm && yay -Syu --noconfirm)

Aber bei toggle_dns funktioniert das leider nicht mit dem gelieferten Code von ChatGPT (siehe Unten) und ich kann garkein Bash, nur "normale" programmiersprachen wie JavaScript oder PHP. Mit Python würde ich es vielleicht hinkriegen aber das ist doch viel aufwendiger jetzt die IDE erneut zu installieren als mit Bash.

Wenn es das gibt wollte ich eine KDE eigene Benachrichtigung in welchen Modus es jetzt gewechselt ist zb : DNS auf Automatisch umgestellt oder DNS auf 8.8.8.8 Umgestellt statt ein Terminal was ich dann noch per hand schließen muss.
Kann mir jemand weiterhelfen den Code zu reparieren ?

toggle_dns.sh :

#!/bin/bash

# Datei und Schnittstelle für die DNS-Konfiguration
RESOLV_CONF="/etc/resolv.conf"
INTERFACE="Netzwerkschnittstelle_von_euch"

# Funktion zum Setzen des DNS-Servers auf 8.8.8.8
set_dns() {
  echo -e "nameserver 8.8.8.8\noptions edns0" | sudo tee $RESOLV_CONF > /dev/null
  sudo systemctl restart NetworkManager
  notify "DNS wurde auf 8.8.8.8 gesetzt."
}

# Funktion zum Zurücksetzen des DNS-Servers auf automatisch
reset_dns() {
  sudo rm -f $RESOLV_CONF
  sudo systemctl restart NetworkManager
  notify "DNS wurde auf automatisch gesetzt."
}

# Funktion zum Senden einer KDE-Benachrichtigung
notify() {
  message=$1
  kdialog --passivepopup "$message" 5
}

# Überprüfen, ob der DNS-Server bereits auf 8.8.8.8 gesetzt ist
if grep -q "8.8.8.8" $RESOLV_CONF; then
  echo "DNS ist derzeit auf 8.8.8.8 gesetzt. Umschalten auf automatisch."
  reset_dns
else
  echo "DNS ist derzeit automatisch konfiguriert. Umschalten auf 8.8.8.8."
  set_dns
fi

Bild zum Beitrag
PC, Server, Computer, Internet, Windows, WLAN, Technik, Linux, IT, programmieren, Java, JavaScript, Ubuntu, Cplusplus, Bash, C Sharp, DNS, Gnome, Informatik, KDE, Programmiersprache, Python, Script, Shell, Arch Linux, Rust, Debian, PowerShell, KDE Plasma, node

Linux from Scratch - bashrc File anschauen?

Moin Leute,

ich arbeite gerade das LFS 12.1-Buch durch und bin bei Kapitel 4.4 und habe gerade die .bashrc File erstellt. Jetzt musste ich aber aufgrund einer Fehlermeldung und eines Versuches, diese zu beheben, das Terminal schließen und mich in einem neuen Terminalfenster neu anmelden.

Jetzt habe ich ein bisschen Sorge, dass meine Änderungen für die Erstellung der .bashrc nicht gespeichert wurden. Habe aber auch keine Möglichkeit, die Datei anzusehen, weil ich die nicht finden kann. Sie soll im Verzeichnis /home/lfs auf meiner LFS-Partition sein, aber dieses Verzeichnis sehe ich in meinem Dateimanager dort nicht. Auch über die Suche finde ich diese Datei nicht.

Weiß jemand, ob man, wenn man folgenden Befehl ausführt:
"cat > ~/.bashrc << "EOF"

set +h

umask 022

LFS=/mnt/lfs

LC_ALL=POSIX

LFS_TGT=$(uname -m)-lfs-linux-gnu

PATH=/usr/bin

if [ ! -L /bin ]; then PATH=/bin:$PATH; fi

PATH=$LFS/tools/bin:$PATH

CONFIG_SITE=$LFS/usr/share/config.site

export LFS LC_ALL LFS_TGT PATH CONFIG_SITE

EOF"

und dann mit "EOF" das beendet, ob die erstellte Datei dann automatisch schon gespeichert wird? Weil wenn man "EOF" eingibt, dann kommt man ja aus dem "Editor" wieder raus und kann weitere Befehle eingeben.

Beim Befehl "source ~/.bash_profile" war ich noch nicht angelangt.

Vielleicht stelle ich mich gerade auch doof an und vielleicht wirkt meine Frage auch komisch aber bin immer noch mit der Lösung des ersten Problems beschäftigt und bin mir jetzt halt einfach nicht sicher, ob das mit der Datei schon funktioniert hat oder ob ich jetzt irgendwas nochmal neu machen muss. Geht leider irgendwie aus der Anleitung auch nicht hervor, inwiefern das jetzt wann gespeichert ist.

Linux, Bash, Shell, Terminal

Linux from Scratch 12.1 - Verschieben der "undocumented instantiation" von etc/bash.bashrc als root funktioniert nicht?

Moin Leute,

hoffe, das Thema passt in dieses Subforum hier. Falls nicht, bitte verschieben.

Ich bin gerade dabei, mir mit Linux From Scratch eine eigene Distro zu bauen und bin jetzt auf ein Problem gestoßen. Hoffe, jemand kennt sich hier damit aus und kann mir weiterhelfen.

Im aktuellen Stable LFS Book 12.1 wird in Kapitel 4.4 steht folgende wichtige Info:

"Several commercial distributions add an undocumented instantiation of /etc/bash.bashrc to the initialization of bash. This file has the potential to modify the lfs user's environment in ways that can affect the building of critical LFS packages. To make sure the lfs user's environment is clean, check for the presence of /etc/bash.bashrc and, if present, move it out of the way."

deutsch:

"Einige kommerzielle Distributionen fügen eine undokumentierte Instanzierung von /etc/bash.bashrc zur Initialisierung der Bash hinzu. Diese Datei kann die Umgebung des Lfs-Benutzers in einer Weise verändern, die die Erstellung wichtiger LFS-Pakete beeinträchtigen kann. Um sicherzustellen, dass die Umgebung des Lfs-Benutzers sauber ist, überprüfen Sie, ob /etc/bash.bashrc vorhanden ist, und entfernen Sie sie, falls sie vorhanden ist, aus dem Weg."

Man soll dort also als root den folgenden Befehl ausführen:

"[ ! -e /etc/bash.bashrc ] || mv -v /etc/bash.bashrc /etc/bash.bashrc.NOUSE"

Jetzt zu meinem Problem. Wenn ich den Befehl mit sudo eingebe, bekomme ich folgende Fehlermeldung ausgegeben:

"lfs is not in the sudoers file. This incident will be reported.

mv: cannot move '/etc/bash.bashrc' to '/etc/bash.bashrc.NOUSE': Permission denied"

Wenn ich den Befehl ohne sudo eingebe, bekomme ich die gleiche Fehlermeldung wie oben, nur ohne den "lfs is not in the sudoers[...]" Fehler.

Jetzt habe ich halt das Problem, dass ich so nicht weiterkomme. Habe schonmal ein bisschen gegoogelt, aber da stand nur, ich solle mal die Besitzer meiner Verzeichnisse prüfen. Die sind aber alle auf den erstellten LFS-Benutzer gesetzt.

Als root kann ich mich in dem erstellten LFS-System nicht anmelden, da er dann ein Passwort verlangt, obwohl ich für root eigentlich kein spezielles Passwort festgelegt habe. Das Passwort vom LFS-Benutzer funktioniert hier auch nicht, da ich dann den Fehler "Authentication failure" bekomme.

Weiß jemand, was ich da tun kann und wie ich den LFS-Benutzer in die "sudoer file" integrieren kann, falls das notwendig ist? Oder wie kann ich da weitermachen? Übersehe ich vielleicht auch etwas oder stelle ich mich doof an?

Habe nebenbei auch noch die Videoreihe, die der YouTuber "marcus-s" mal darüber gemacht hat, laufen, um mir das nebenbei ein bisschen anzuschauen und es besser zu verstehen, was ich dort tue. Lese aber trotzdem weiterhin immer meine Buchversion, die ich von der LFS-Webseite habe durch und führe die Befehle von dort aus, da er eine ältere Version nutzt. Und da ist zum Beispiel diese Info von oben noch gar nicht enthalten, die Videos helfen mir da also nicht weiter.

Hoffentlich kann mir jemand von euch helfen.

Linux, Bash, Error, Root, Shell, Terminal, Fehlermeldung, sudo, Linux-Distribution

Meistgelesene Beiträge zum Thema Shell