#第一题
这个是main函数
这个是canary函数,是打开根目录的一个文件,取前四个字符的ascll码作为canary
没有远程环境,我直接创建了一个这样的文件放在了根目录
这个是ctfshow函数,我们去找一下后门函数
函数地址可以看出来是0x8048696
我们再回过头来看ctfshow这个函数
首先他会接受用户的输入,接受一个字节,作为下面读入的字节数,所以我们第一次输入让他尽可能的大,所以我们输入0xff,然后再第二次读入的时候把v6填满,然后就该填写v7了,v7是四个字节,我们要爆破四个字节,然后我们通过写脚本来一个一个的爆破canary
脚本奉上
爆破出来第一个字节之后填写到p8前面
以此类推
我们爆破出来四个字节
完事之后把这些注释掉,然后开始写脚本,爆破出来之后脚本就很简单了,先填写0x20个垃圾数据把v6填满然后填写爆破出来的四个字节,然后在输入0x10个垃圾数据覆盖掉rbp,然后接下来就是覆盖返回地址,p32(shell)覆盖返回地址到flag后门函数,即可把这个flag打印出来
脚本奉上
#第二题
第二题是格式化字符串漏洞
查询得知开了pie保护,我们要通过泄露地址,来计算出来pie基址
放进ida看
我们逐个看一下case1,2,3
这第三个乍一看啥也没,我们去看汇编
发现是跳转走了,发现这个函数下面有我们要的后门函数,把地址记下来
0x129a,ida我们可以不太一样,反正记得时候记得记下来偏移地址哈,别记下来这个地址这个地址是加上了pie基址之后的,pie每次运行基址都会变的,左下角那边有偏移地址
所以我们通过分析main函数,可以知道,他一共进行两次循环,第一次循环我们选择2进入格式化字符串漏洞泄露pie,然后最后一次循环我们选择1然后覆盖返回地址到0x129a就能获得权限,这个地方不要误以为是站迁移哈,虽然他正好多出来0x10个字节
进入到call print看一下栈的情况
这是对应的那个
然后往下数偏移,
%5$p是对应的0那个,就是0x19999...下面那个,然后往下就不是了,隔过去那些,从-20这个位置开始继续往下数(这个位置是下一个栈空间的rsp,在这是第六个%6$p),具体为啥我不太懂哈,pass,然后数到rbp下面那个位置接受,去计算pie基址,所以我们要填写的是%11$p
完事之后他会把这个地址打印出来,我们接受一下,注意接受的时候int转化,不用u64哈,不是byte格式的,我们找一下main+181的偏移地址
就这个0x13a0,或者你减去main函数的偏移地址,再减去181也可以,都一样,完事之后pie基址我们就找到了,之后就是进入最后一个循环,我们选择一下1,然后覆盖rbp,覆盖返回地址到这个后门函数加上pie偏移,就能获取权限了
脚本奉上