本人也是在自学过程,主要目的也是记录学习过程,有些地方做的不太好,都是按照自己理解进行讲解的(不专业),欢迎大家指出问题
此处我将文件命名为pwn,libc.so.6
checksec pwn 查看一下保护机制

可以看到这是一个64-bit的文件,Canary,NX保护开启
将文件拖入ida64,按F5将汇编代码转换成c语言代码,得到

可以看到存在printf(&buf)格式化字符串漏洞,read(0,&v2,0x200)栈溢出漏洞
思路:我们可以利用printf这个格式化字符串漏洞泄露canary和libc的基址,然后利用read栈溢出漏洞构造orw,获得flag
返回虚拟机
gdb pwn
b welcome
r
n 回车 直到可以输入内容
aaaaaaaa
stack 40

我们输入的aaaaaaaa在0x7fffffffdc30处,也就是第6个参数;canary在 0x7fffffffdcd8 处,距离aaaaaaaa偏移( 0x7fffffffdcd8-0x7fffffffdc30=)0xa8,0xa8/8=21,也就是说canary在第(6+21=)27个参数

接下来利用栈溢出漏洞,将返回地址覆盖为main函数的地址,再次返回main函数,为第二次利用printf格式化字符串漏洞做准备

利用格式化字符串漏洞泄露puts@got里存储的puts函数的真实地址,进而得到libc的基址

筹备rax,rdi,rsi,rdx,syscall的地址,由于pwn文件里资源有限,我们凑不齐,所以我们在libc.so.6文件里去找


rsi,rdx的同理,除了syscall

从而得到

接下来,我们先调用read函数,将'flag\\x00'字符串写入bss段;然后构造orw,打开读取写出flag

read,write,open的系统调用号分别为0,1,2
完整exp

保存退出
python3 exp.py

此题完




