L3HCTF第一题
L3HCTF第一题heack
看了wp才做出来,收获很大的一道题,提高了我的调试能力
先检查一下保护,发现保护全开
审计一下伪代码
在fight_dragon函数中发现栈溢出漏洞,仔细看while函数,是用v4当作索引指针来从buf[1]开始输入,发现canary在rbp-8的位置(看v5),v4在rbp-0xc的位置,那么我们可以在填充到canary之前填充v4,刚才说到v4是索引指针,也就是说我们改变v4的值为填充到rbp的值即可绕过canary,我们填充到v4需要0x110-0xc也就是0x104,但因为是从buf[1]开始输入的,我们只需要填0x103,注意这里栈上应该是0x0000010361616161,因为是小端序,我们下一个填充的就是’\x03’,我们需要把它变成’\x17’,也就是将v4的值改成0x117,这样0x117+1也就是0x118,再之后我们就可以直接填我们想返回到的地址了。
那么现在就来思考需要跳转到哪,我们发现game函数中有很多printf(“%lu”),
又发现fight_dragon函数返回时rsi中残留着libc地址,而printf打印的值恰好就是rsi中的值,所以我们可以跳到printf打印libc地址
然后用vmmap查看当前的libc基地址,相减即可得到偏移
这里再写一下调试过程中遇到的问题,因为pie保护开启,所以我们只有1/16的概率能跳转到printf函数,这时候我们可以先查看栈空间rbp+8的地址跟pie基地址+ida中的printf偏移一不一样,不一样的话就是那15/16的概率了,这时候我们还想调试跳到printf的话就可以用set *(0x…)=0x… 来使rbp+8成为我们想要的地址,如下图
输入pie就可以查看pie基地址,我们想断在printf的话先在ida中找到fight_dragon函数的leave,然后加上pie基地址得到真正的leave地址,之后c一下再si就断在printf了。
之后在脚本中接收libc再减去刚才算出来的偏移就是libc基地址了,有了libc基地址就可以再进入fight_dragon函数劫持索引指针到返回地址,构造rop链即可(rdi+1就是ret,调整栈帧),还要注意这题因为开了pie保护,所以还要用一个爆破的板子,exp如下:








