利用stdout泄露libc
手法原因:没有show函数。攻击思路:修改_IO_2_1_stdout_: 将_flags位修改为0xfbad1800 将_IO_write_base末尾字节修改为\x00 中间的变量_IO_read_ptr _IO_read_end _IO_read_base直接填充为0 p64(0xfbad1800)+p64(0)*3+'\x00' 后续程序在调用puts函数时,就会泄露出存在libc中的地址,我们找到对应的偏移就能得到libc基址。 例子题目地址: noleak 提取码: Ya0a 漏洞 strlen长度计算错误,造成堆溢出 构造堆块重叠 没有show 攻击_IO_2_1_stdout_泄露libc基址 思路 爆破攻击_IO_2_1_stdout_泄露libc基址 修改__malloc_hook为one_gadget 函数分析 expfrom pwn import *from pwn import p64,u64,p32,u32,p8from LibcSearcher import *context.terminal = ["tmux&qu ...
高版本off by null模版
新增加的保护2.29之后if (chunksize (p) != prev_size (next_chunk (p))) malloc_printerr ("corrupted size vs. prev_size"); 这会检查pre size和要合并的chunk_size是否相同;在这之前普通的off by null,我们只需要修改pre size和pre inuse就能完成堆块重叠。 方法申请8个堆块create(0x410)#0 Acreate(0x100)#1 #paddingcreate(0x430)#2 Bcreate(0x430)#3 Ccreate(0x100)#4 paddingcreate(0x480)#5 Hcreate(0x420)#6 Dcreate(0x100)#7 padding 我们要做的就是保证C堆块地址是00结尾; 利用地址残留,保存C的fd和bk指针free(0)free(3)free(6)free(2)payload=b'\x00'*0x430+p64(0)+p32(0x551)cre ...
house_of_apple2浅析
利用条件 泄露libc和heap地址 使用largebin attack控制_IO_list_all 能控制程序执行IO操作,包括但不限于:从main函数返回、调用exit函数 控制fakeio_file的vtable和_wide_date 使用 _flags设置为~(2 | 0x8 | 0x800),如果不需要控制rdi,设置为0即可;如果需要获得shell,可设置为 sh;,注意前面有两个空格 vtable设置为_IO_wfile_jumps/_IO_wfile_jumps_mmap/_IO_wfile_jumps_maybe_mmap地址(加减偏移),使其能成功调用_IO_wfile_overflow即可 _wide_data设置为可控堆地址A,即满足*(fp + 0xa0) = A _wide_data->_IO_write_base设置为0,即满足*(A + 0x18) = 0 _wide_data->_IO_buf_base设置为0,即满足*(A + 0x30) = 0 _wide_data->_wide_vtable设置为可控堆地址B,即满足* ...
house of water & TFCctf2024 mcguava
题目可以从 r3kapig 战队的比赛题库中找到:TFC CTF 2024(Jeopardy) (notion.site) 条件&效果前置条件: UAF 可以申请足够大的堆块 不需要泄露任何内存地址 实现效果:能够在tcache链表上留下libc的相关地址并将其申请出来。
movaps和movups
movaps作用:movaps 是 x86 汇编语言中的一个指令,用于处理 SIMD(Single Instruction, Multiple Data)寄存器中的浮点数据。它的主要功能是将对齐的128位浮点数据从一个位置移动到另一个位置。 要求栈16字节对齐 movupsmovups 是 x86 汇编语言中的一条指令,用于将128位浮点数据从一个位置移动到另一个位置。与 movaps 不同的是,movups 不要求数据是 16 字节对齐的,因此可以操作未对齐的数据。
orw进阶技巧
flag文件名未知getdentsgetdents 是 Linux 系统调用,用于读取目录的内容。与常用的高级文件操作函数(如 readdir)相比,getdents 提供了更底层的访问方式,它直接返回目录项的信息。这通常用于在需要更高性能或对系统调用进行更精细控制的场景中。 题目只能使用read open write close函数,和以下函数: gendents:用于目录遍历,可以用于绕过flag文件名未知情况。 mprotect:修改权限,用来绕过NX保护 exit_group:Linux独有的系统调用,调用后会使得进程的所有线程都退出。 使用 打开存有flag文件的目录:open("/home/ctf", 0),返回文件描述符为3 遍历目录:getdents(3, buf, 0x1000) 遍历3描述符中的内容,将文件名存在buf中,长度最大为0x1000字节。 打印所有文件名:使用write(1, buf, 0x1000),找到可能是flag的文件
覆盖.fini_array函数指针
函数说明.fini_array函数指针其实是一个数组指针,其中存有一系列函数指针,这些函数是main函数执行完后才会自动触发。同理,在.init_array中的函数是在main函数之前就触发,一般是用来初始化程序运行的条件。 我们的利用一般是覆盖.fini_array中函数指针,使main函数执行完后控制程序执行流到后门函数。 原理调试这里有一个test程序,用来看看.fini_array原理: #include <stdio.h>#include <stdlib.h>static void start(void) __attribute__ ((constructor));static void stop(void) __attribute__ ((destructor));int main(int argc, char *argv[]){printf("start == %p\n", start);printf("stop == %p\n", stop);return 0;}voidstart(vo ...
PolarCtf困难题系列pwn
choose漏洞解析 格式化字符串泄露canary leaklibc泄露libc 栈溢出+栈迁移到我们输入位置 libc由于题目没给libc(真难受),用LibcSearcher: expfrom pwn import *from pwn import p64,u64,p32,u32,p8from LibcSearcher import *context.terminal = ["tmux","sp","-h"]context(log_level="debug",os="linux",arch="amd64")io = remote("120.46.59.242",2107)# io = process("./pwn")elf=ELF("./pwn")sla = lambda x,y : io.sendlineafter(x,y)sa = lambda x,y : io.sendafter(x,y)sl ...
aarch64_ret2_libc
有关知识在aarch64中: X29相当于rbp寄存器。 X30寄存器中保存程序的返回地址,当ret时,会将X30中的地址给PC寄存器。 通过X0-X7寄存器传参。 ldr:Load Register(加载寄存器) ldr x0, [sp, #0x18] 这条指令的含义是将栈指针 (sp) 加上偏移量 0x18 所指向的内存地址中的数据加载到寄存器 x0 中。 ldr x0, [sp], #0x18 这条指令的含义是将栈指针 (sp) 所指向的内存地址中的数据加载到寄存器 x0 中,然后将sp增加偏移量 0x18。 本题泄露的got地址只有三字节,其实是“\x00”截断,需要我们加上0x4000000000。 分析 先泄露libc,再栈溢出ret2libc。 这里我们在ropper中找到一个gadget:ldr x0, [sp, #0x18]; ldp x29, x30, [sp], #0x20; ret; 思路:将/bin/sh传给X0,将system传给X30。按照x64来说,我们会这样构造:prdi binsh system 但是这道题传参并不是紧紧邻接的。我们调试一下 ...
House_of_cat
利用思路利用_IO_wfile_jumps函数中的_IO_wfile_seekoff函数,在转到调用_IO_switch_to_wget_mode函数进行攻击。 调用链:_IO_wfile_jumps ——> _IO_wfile_seekoff ——> _IO_switch_to_wget_mode(fp) gdb中结构如下:相比于House_of_emma,House_of_cat可以进行FSOP,具体操作为:改虚表指针vtable为_IO_wfile_jumps+0x10并结合_malloc_assert触发; 利用条件 任意写一个可控地址(如largebin_attack) 泄露libc和heap 触发: 调用exit或从main退出 puts、printf函数调用 _malloc_assert 在最后一步调用中:此时的rdi是我们传入的堆地址,那么此时我们泄露libc后,rdi、rax、rdx我们就都可以自主控制了,而利用这个 call [rax + 0x18] 汇编代码我们就可以执行我们控制的rax寄存器的地址。主要是这四句,也就是红框中汇编: rax1 ...
Vivotek远程栈溢出漏洞复现
环境搭建附件下载:http://download.vivotek.com/downloadfile/downloads/firmware/cc8160firmware.zip 固件解包binwalk -Me .pkg文件解包完后,发现文件系统存在路径为_CC8160-VVTK-0113b.flash.pkg.extracted/_31.extracted/_rootfs.img.extracted/squashfs-root 查找漏洞程序httpd:sudo find . -name httpd查看文件类型:file httpd32位的arm程序,小端,动态链接,没有符号表 运行服务将qemu-arm-static复制到当下目录;cp /usr/bin/qemu-arm-static . 由于是arm架构下的程序,我们不能直接运行,需要使用qemu模拟。依次输入以下指令,设置好运行环境: # 程序挂载sudo mount -o bind /dev ./devsudo mount -t proc /proc ./proc# 更换程序运行的根目录chroot . ./qemu-ar ...
Vulnhub靶机 DC-2
信息收集使用arp-scan -l 或者 nmap扫描到靶机地址: 使用namp -A -p- -v 192.168.15.134探测靶机开启的服务:==注意:使用-A会比较慢(但是看到的东西也多)==80端口:web7744端口:ssh 这里用-p-扫出来的端口多一个: flag1==由于中途将kali和靶机换成了桥接,所以靶机地址有所改变(192.168.0.131),但是无伤大雅==开放了80端口,我们在浏览器中访问一下界面。发现:当我们直接访问ip地址的80端口时会失败,IP地址会自动转化为dc-2的域名,所以可能是域名解析失败,我们尝试在/etc/hosts文件中添加一个ip地址的指向。 192.168.0.131 dc-2 成功访问:这是一个WordPress网站,同时发现了flag1,提示我们用爆破密码 flag2后台扫描以下:发现了登录界面: 进去看看: 因为我们已经知道这是WordPress站点,那么我们就用针对工具——wpscan。这是常用命令: wpscan --url ht ...