ICQ Baidu CTF try to pwn



FSP+Stack_pivot+Rop/Shellcode

漏洞

题目是32bit 静态编译的elf
welcome函数中存在明显的栈溢出

因为name在.bss段上,而.bss段name之下就是file指针,所以name溢出自然会影响到File
题目提供了open_file,read_file两种操作,但在open_file中,打开指定的文件名后加入了一串随机数

所以open_file基本是没戏的,于是回到主函数,发现在exit之前会执行fclose

于是我们可以利用bss段上的File指针构造Fake FILE stream

漏洞利用

构造File stream的最终效果是劫持程序的控制流
但是题目是一个静态编译的elf,并且开启了NX
在劫持fclose后,我们必须直接Getshell,而我们又无法控制栈做ROP,所以需要stack pivot.
在调用fclose前的程序,eax必然指向.bss段,我们需要将程序栈劫持到eax中

于是找到RopGadgets: xchg eax, esp ; ret,并紧接着执行 add esp;ret,总之将栈劫持到我们控制的.bss段上来,这样利用name的栈溢出就能够构造ROP链。

因为题目静态编译,可用的RopGadgtes很多。

ROP

想要直接Rop execve(“/bin/sh”)还是费了一番功夫
scanf(“%s”)在读入时不能够读取”\x0a”,“\x0b”,“\x0d”等等好几个终结符,想要去除这些badbytes寻找RopGadgets有些困难
这里利用ropper

生成一条ropchain,当然有些复杂,也有可能有误,经过简化,改正,能够正常Getshell

Shellcode

在阅读官方wp后的想法,也可以利用mprotect(addr,1024,PROT_READ|PROT_WRITE|PROT_EXEC)将.bss段name部分设置为可执行,这样我们直接注入shellcode即可,这样能够避免使用复杂的ROP chain。

注意shellcode需要编码,避免NULL bytes or whitespace
这里使用pwntools中的encoder得到shellcode。

Script

发表评论