初探v8漏洞利用
一直觉得 v8 漏洞利用是一件非常好玩的事情,所以找时间入门了一下,这篇博客所使用的环境是 *CTF 2019 的 oob,相关附件读者可以自行上网搜索下载。这篇博客主要用于总结本人在入门 v8 漏洞利用时所学到的东西,由于 Qanux 又菜又爱玩,文章不免存在许多的问题,请读者多多包容
基本概念在开始之前,肯定有很多人想问 v8 是一个什么东西,下面是在知乎中搜到的对于 v8 的描述:
V8引擎是由C++编写的Google开源高性能JavaScript和WebAssembly引擎,它用于Chrome和Node.js等。V8可以独立运行,也可以嵌入到任何C++应用程序中。V8支持众多操作系统,如Windows、linux、android等,也支持其他硬件架构,如IA32,X64,ARM等,具有很好的可移植和跨平台特性。
作为 js 引擎,V8 会编译 / 执行 JavaScript 代码,管理内存,负责垃圾回收,与宿主语言的交互等。通过暴露宿主对象 (变量,函数等) 到 JavaScript,JavaScript 可以访问宿主环境中的对象,并在脚本中完成对宿主 ...
D3CTF 2024
PwnShell漏洞利用很久以前就听说过 php pwn,没想到就在这里遇到了。出题人自己实现了一个 php 扩展模块 vuln.so,很显然漏洞就来源于这里,通过逆向分析发现出题人在这个模块中实现的菜单堆,其漏洞函数如下:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556unsigned __int64 __fastcall zif_addHacker(__int64 a1, __int64 a2){ __int64 v2; // rbp __int64 v3; // rdi __int64 v5; // rdx _BYTE *v6; // rax _DWORD *v7; // r12 _QWORD *v8; // rbx void *v9; // rax size_t v10; // rdx const void *v11; // rsi _BYTE *v12; // r13 __int64 ...
GeekCTF 2024
这个比赛时长为 8 天,打的是真的煎熬,加上这个星期还有编译原理大实验和蓝桥杯算法A组,真的没有什么时间打x~x,还好最后还是混到了前50,成功摸到 GEEKCON 新加坡站 的门票,不过大概率不去(爷没钱去新加坡
这里主要记录比赛时做出来的题目以及赛后复现的题目
miscWelcome直接可以在题目描述中找到flag
Welcome to GEEKCTF 2024! Your first FLAG will be flag{welcome_geekers}
WhereIsMyFlag在commit里面有一个gz压缩包,不过是b64格式的,保存下来再解压一次即可
f and r下载附件,是 .msu 的windows的更新包,可以直接解压可以得到 .cab 等文件,经过层层解压能得到很多文件或者使用win10自带的指令 expand 来解压, expand file.cab -f:* path_to_save解压出来的文件需要解题的应该就是 f 与 r 目录下的两个 curl.exe 了,但是他们并不是可执行的文件,文件头是 PA3 ...
When ELF notes reveal too much
通常我们对内核的攻击都是基于知道内核各种地址的前提下进行的,为了加大攻击内核的难度, kaslr 由此而生,但内核会很容易泄露有关其位置的信息,如大量内核代码乐于在 printk() 调用中打印出内核指针值。在 大量工作 之后,通过修复内核代码来使用针对指针的特殊格式化指令,并在未设置 kptr_restrict 的情况下拒绝将实际指针值输出到日志中,从而基本解决了这个问题。根据需要还修改了各种 /proc 和 sysfs 文件。随着时间的推移,要想了解特定系统上的内核位置就变得更加困难了,但依然有漏网之鱼可以为我们提供内核的基址这里的主角是 /sys/kernel/notes ,在谷歌上找到的十分简略的描述:
12345What: /sys/kernel/notesDate: July 2009Contact: <linux-kernel@vger.kernel.org>Description: The /sys/kernel/notes file contains the binary representation of the running ...
llvm pass pwn
基础知识既然说到llvm pass pwn,我们肯定要先了解llvm到底是一个什么东西学过编译原理的人应该都知道,编译过程主要可以划分为前端与后端:
前端把源代码翻译成中间表示 (IR)
后端把IR编译成目标平台的机器码。当然,IR也可以给解释器解释执行
然而,经典的编译器如gcc在设计上都是提供一条龙服务的: 你不需要知道它使用的IR是什么样的,它也不会暴露中间接口来给你操作它的IR。 换句话说,从前端到后端,这些编译器的大量代码都是强耦合的。
这样做有好处也有坏处。好处是,因为不需要暴露中间过程的接口,它可以在内部做任何想做的平台相关的优化。 而坏处是,每当一个新的平台出现,这些编译器都要各自为政实现一个从自己的IR到新平台的后端。 甚至如果当一种新语言出现,且需要实现一个新的编译器,那么可能需要设计一个新的IR,以及针对大部分平台实现这个IR的后端。 不妨想一下,如果有M种语言、N种目标平台,那么最坏情况下要实现 M*N 个前后端。这是很低效的。
因此,我们很自然地会想,如果大家都共用一种IR呢? 那么每当新增加一种语言,我们就只要添加一个这个语言到IR的前端; ...
初探qemu逃逸
最近找时间入门了一下qemu逃逸,发现挺有意思的。感觉其实和用户态的pwn差不多,目标是通过分析qemu-system这个elf中的漏洞使其执行自己想要的函数。在该elf中执行的操作可以访问到qemu外,所以造成了逃逸这里主要用于记录平时qemu逃逸学习时常用的脚本以及入门时做的几道有代表性的题目
一些可以利用的点在qemu的elf中存在一个名为main_loop_tlg的数组,该数组用于存储QEMUTimerList结构体指针
一些重要结构体12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364/** MemoryRegion: * * A struct representing a memory region. */struct MemoryRegion { Object parent_obj; /* private: */ /* The following fields ...
linux kernel
主要记录一些入门级别的kernel pwn和一些平时做题要经常用到的命令
做题技巧常用命令解包1cpio -idmv < ./rootfs.cpio
打包1find . | cpio -o --format=newc > ./rootfs.cpio
利用musl静态编译exp1musl-gcc -static -masm=intel -pthread exp.c -o exp
查找ko文件的基址1cat proc/modules
编译exp并将其打包进题目中12345678910111213#!/bin/shcp -r rootfs rootfs_tmp#musl-gcc -static -masm=intel -pthread exp.c -o expgcc -static -masm=intel -pthread exp.c -o expcp exp rootfs_tmp/cd rootfs_tmp || exitfind . | cpio -o -H newc >../rootfs.cpiocd ..sudo rm -rf rootfs_tmp
从bzImag ...
初探musl
其实就是对各位大佬博客的各种摘抄和总结···,方便自己以后做题
结构体chunk:
123456struct chunk{ char prev_user_data[]; uint8_t idx; //低5bit为idx第几个chunk uint16_t offset; //与第一个chunk起始地址的偏移,实际地址偏移为offset * UNIT,详细请看get_meta源码中得到group地址的而过程! char data[];};
在释放后 chunk 头的 idx会变成0xff offset 会清零
group:12345678#define UNIT 16#define IB 4struct group { struct meta *meta; unsigned char active_idx:5; char pad[UNIT - sizeof(struct meta *) - 1];//padding=0x10B unsigned char storage[];// chunks};
在mus ...
2023小琐碎记录贴
2023/3/27加入Sloth咯!!!上学期XSCTF联合招新赛爆0后就没有在CTF走下去的打算,可是寒假在暨大的i_corner师傅的鼓励下打算再努力一把,刷了2个多月的Crypto和misc,最后在选拔赛拿了全场一血(我最爱的RSA),太感动了QAQ不过也感受到了差距,第一名和第二名是大二的学长,分数比我高好多,同级的也有一位逆向好厉害QAQ搏一搏,单车变摩托,我要超越他们!!!!
2023/4/2正式开始学pwn了捏
2023/5/28第一次打比赛,给打烂了捏>_<打了一个月的ret2libc,才发现pwn原来还有这么多东西,看来要狠狠的卷了
2023/8/26好耶,闭关一段时间再参加比赛(蓝帽杯),出了一道堆题,成就感拉满!!!!!!
2023/9/10数模国赛逆大天,首先是有78w行数据,脚本跑一次好好几分钟,其次是题目完全没有思路,找不到适用的模型>_<,完全靠队友带飞Orz
2023/10/15香山杯太亏了 ...
记一道risc-v架构xv6操作系统的堆
附件:https://github.com/Qanux/uheap这是一道133nson师兄出的题(太强啦),看了后只能说自己的见识还是太少了。这一道是xv6系统的堆题,附件已经给出了一个完整的qemu环境,只要输入./run.sh即可启动程序题目有一个hint文件
12345678910111213This challenge is running on the xv6 system. (Attention: its heap allocator is different from GLIBC)You can get the xv6 source files on https://github.com/mit-pdos/xv6-riscvYou can run this challenge locally using the command './run.sh' and your goal is to PWN the binary chalTo make things simple, the binary file is compiled with debug_i ...