第一届云南大学CTF校赛YNUCTF-PWN提示(hint)

news/2024/12/22 1:52:27/

easy-ikun

s[i:j] 表示获取a[i]到a[j-1]
s[:-1]去掉最后一个字符
s[:-n]去掉最后n个字符
s[-2:]取最后两个字符
s[i:j:k]这种格式呢,i,j与上面的一样,但k表示步长,默认为1
s[::-1]是从最后一个元素到第一个元素复制一遍(反向)

四种方法

Canary 设计为以字节 \x00 结尾,本意是为了保证 Canary 可以截断字符串。 泄露栈中的 Canary 的思路是覆盖 Canary 的低字节,来打印出剩余的 Canary 部分。 这种利用方式需要存在合适的输出函数,并且可能需要第一溢出泄露 Canary,之后再次溢出控制执行流程

对于 Canary,虽然每次进程重启后的 Canary 不同 (相比 GS,GS 重启后是相同的),但是同一个进程中的不同线程的 Canary 是相同的, 并且 通过 fork 函数创建的子进程的 Canary 也是相同的,因为 fork 函数会直接拷贝父进程的内存。我们可以利用这样的特点,彻底逐个字节将 Canary 爆破出来

已知 Canary 失败的处理逻辑会进入到 __stack_chk_failed 函数,__stack_chk_failed 函数是一个普通的延迟绑定函数,可以通过修改 GOT 表劫持这个函数

已知 Canary 储存在 TLS 中,在函数返回前会使用这个值进行对比。当溢出尺寸较大时,可以同时覆盖栈上储存的 Canary 和 TLS 储存的 Canary 实现绕过
注意以下这个

struct Game {char choice[100];long long int balance;long long int bet;int correct;int guess;int answer;
};

char [100];意味着只能存储100个字符。如果用户输入超过100个字符,则选择项将被覆盖,并且选择项下的变量(例如balance, bet)将被覆盖。因此,溢出即可

black_ikun

在这里插入图片描述
接受字节转换为整数为 int()
在这里插入图片描述
输入整数 发送用str(整数).encode()
在这里插入图片描述

syscall-ikun

可以看出此次仍然是一个栈溢出。类似于之前的做法,我们可以获得 v4 相对于 ebp 的偏移为 108。所以我们需要覆盖的返回地址相对于 v4 的偏移为 112。此次,由于我们不能直接利用程序中的某一段代码或者自己填写代码来获得 shell,所以我们利用程序中的 gadgets 来获得 shell,而对应的 shell 获取则是利用系统调用。关于系统调用的知识,请参考
系统调用
简单地说,只要我们把对应获取 shell 的系统调用的参数放到对应的寄存器中,那么我们在执行 int 0x80 就可执行对应的系统调用。比如说这里我们利用如下系统调用来获取 shell

ikun-runner_

这个程序中没有bug,但是运行用户输入shellcode是危险的,它实际上意味着用户可以在服务器中做任何事情(运行任何代码)。因此,这种类型的pwn挑战旨在测试ctf玩家制作shell代码以读取flag或生成shell的能力。
制作shellcode
我们可以很容易地通过汇编通过pwntools生成shellcode:
从PWN导入*

Assembly = " '
Mov x, 0x3b
Xor rsi, rsi
“‘
Shellcode = asm(assembly, 'amd64')

制作程序集来生成一个shell比制作程序集来读取标志文件更容易
要生成shell,我们需要系统调用。sycall是一个小型库函数,它调用系统调用,其汇编语言接口具有指定编号和指定参数。有一个名为execve的功能强大的系统调用,它可以让您执行任意命令,因此,如果您可以执行/bin/sh,就会生成一个shell。

记第一次校赛出题

FROM ubuntu:20.04 AS appFROM pwn.red/jail
COPY --from=app / /srv
COPY YNU /srv/app/run
RUN chmod +x /srv/app/run
COPY flag.txt /srv/app/flag.txt

如何运行服务器?

确保您在包含Dockerfile(或change . conf)的目录中。到下面包含Dockerfile的目录)。

Docker build -t 镜像名 .Docker运行-dp 12345:5000—privileges  镜像名Nc localhost 12345  

注意——privileged选项。你可以替换<tag>你想要什么都行。您可以将12345更改为您想要的任何端口。

保存镜像

sudo  docker save 镜像名 > 镜像名.tar

http://www.ppmy.cn/news/1252661.html

相关文章

LiveGBS流媒体平台GB/T28181功能-概览中负载信息直播、回放、播放、录像、H265、级联查看负载会话列表

LiveGBS常见问题-概览中负载信息具体表示什么直播、回放、播放、录像、H265、级联等 1、负载信息2、负载信息说明3、会话列表查看3.1、会话列表 4、搭建GB28181视频直播平台 1、负载信息 实时展示直播、回放、播放、录像、H265、级联等使用数目 2、负载信息说明 直播&#x…

波奇学C++:functional包装器和智能指针(一)

functional包装器 相当于适配器&#xff0c;用于对可调用对象&#xff08;函数指针&#xff0c;仿函数&#xff0c;lambda&#xff09;进行封装&#xff0c;使得他们的类型统一。 double func(double d) {return d / 4; } struct func1 {double operator()(double d){return …

3D云参观红色革命纪念馆允许更多人在线交流、体验

生活在和平年代的新一代青少年&#xff0c;可能对革命先烈英勇事迹难以有很深的体会&#xff0c;无法切实感受到中国共产党无畏牺牲、誓死保家卫国的红色精神&#xff0c;因此借助VR虚拟现实制作技术&#xff0c;让参观者们走近革命先烈中&#xff0c;感受老一辈无产阶级革命家…

2023.11.30-12.1我的发烧全过程

记录一下这糟糕的体温变化&#xff1a; &#xff08;昨天下午是在教室学随机过程的时候发现教室很热&#xff1b;今天下午又是在宿舍学嵌入式开发的时候发现不对劲&#xff0c;所以&#xff09; 11.30的17&#xff1a;30------38.1度&#xff08;吃了一粒布洛芬&#xff09;11…

Redis 命令处理过程

我们知道 Redis 是一个基于内存的高性能键值数据库, 它支持多种数据结构, 提供了丰富的命令, 可以用来实现缓存、消息队列、分布式锁等功能。 而在享受 Redis 带来的种种好处时, 是否曾好奇过 Redis 是如何处理我们发往它的命令的呢&#xff1f; 本文将以伪代码的形式简单分析…

【错误记录】Python 错误集合

Python 错误集合 文章目录 Python 错误集合TypeError: list object cannot be interpreted as an integer python 常见错误集合&#xff1a;持续更新 TypeError: ‘list’ object cannot be interpreted as an integer map [ [1, 1, 1, 1, 1, 1, 1, 0, 1, 1],[1, 0,…

理解BatchNormalization层的作用

深度学习 文章目录 深度学习前言一、“Internal Covariate Shift”问题二、BatchNorm的本质思想三、训练阶段如何做BatchNorm四、BatchNorm的推理(Inference)过程五、BatchNorm的好处六、机器学习中mini-batch和batch有什么区别 前言 Batch Normalization作为最近一年来DL的重…

SpringBoot+mysql+vue实现大学生健康档案管理系统前后端分离

一、项目简介 本项目是一套基于SpringBoot实现大学生健康档案管理系统&#xff0c;主要针对计算机相关专业的正在做bishe的学生和需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目可以直接作为bishe使用。 项目都经过严格调试&#…