LilCTF-pwn
前言前不久打了一下Lilctf,全全爆零了,自己还是太菜了,但赛后复现,真的可以学到很多,收获满满 heap_Pivoting题目分析静态编译的glibc2.23的堆题,去除了符号表,建议先恢复一下符号表再做题,会方便很多(将sig文件放在ida的sig文件夹里,然后恢复一下就好了,很方便) 大体攻击流程:unstorebin_attack劫持chunk_list,修改main_arena中的topchunk,劫持stdout,flush泄露environ,修改栈ret劫持控制流,orw 之前的main_arena一直都是用来泄露libc的,也没细了解过,卡在这里一直没有进一步的进展,赛后才知晓可以修改topchunk中的内容,来劫持topchunk,实现任意申请,又学到新知识了~~ 劫持stdout就是劫持flag标志位和_IO_write_base,ptr,end,就可以利用flush刷新缓冲区泄露了,flush,openat,read,write函数的地址,在恢复符号表后都可以找到,至于environ,是在调试的过程中全局搜索得到的,大家有其他搜索办法的话欢迎留言噢~~,...
NSSCTF4th-pwn
how_to_fmt?这次的比赛pwn题只有一个,很可惜白天有点事情,下午回来时间不是很够,赛后一个小时勉勉强强做了出来,很可惜 小声哭,超小声 题目漏洞很明显的fmt,不再多说了,类型和之前LItCTF2025的fmt非常相似,只是当时直接ogg就可以getshell,而这个需要执行 system("/bin/sh")劫持printf函数自身的返回地址,尝试执行过pop rdi;binsh;system,但结果是rsp未对齐16字节导致失败,然后尝试加入ret使rsp对齐16字节,结果多出一个位置会导致输入的内容覆盖掉call system的地址,故失败,所以考虑在其他地方写入pop rdi;binsh;system,然后通过pop rsp;target_addr来劫持rsp,最后即可getshell 哦对,最一开始需要爆破一下栈地址,16分之一的概率,很容易 我exp中用来向目标地址写内容的脚本可以封装成一个函数,看起来会更加简便,我这里就不封装了,大家感兴趣可以自己尝试一下 这个自动化爆破脚本有些不太稳定,多试几次就好了QAQ~~ 噢对,写exp的时候...
初探V8
初探 V8参考文章Chrome-v8-入门 | iyheart的博客 chrome v8 pwn 学习 (2) | CoLin’s BLOG V8 Pwn Basics 1: JSObject - Wings 的博客 通过StarCTF oob题目学习V8 PWN 入门 | 长亭百川云 注意本文下图显示的内容都是基于v8 7.5版本的实验结果,该版本暂未使用指针压缩技术,对于高版本的v8的实验结果并不如下图所示 环境搭建1.需要下载两个编译v8源码的工具depot_tools、ninja (下载depot_tools需要挂代理) 12git clone https://chromium.googlesource.com/chromium/tools/depot_tools.gitgit clone https://github.com/ninja-build/ninja.git 2.然后将这两个工具添加进环境变量 123456echo 'export PATH=$PATH:"/path/to/your/depot_tools"' >...
初探arm-pwn
ARM-PWN学习环境配置### 安装插件 关于异构的环境配置大家可以参考这篇文章,真的超级详细,arm,aarch64,powerpc,mips等等架构也有都,超级nice 传送门 关于arm架构,首先需要安装qeum其中包括qemu-user和qemu-user-static,qemu-system可以安装也可以不安装,接着安装调试工具gdb-multiarch,然后就可以通过qeum启动arm架构的程序来调试了 123sudo apt-get install qemu-user qemu-user-staticsudo apt-get install qemu-system uml-utilities bridge-utilssudo apt install gdb-multiarch 启动程序如果要启动一个名为pwn的arm架构的动态程序,命令应该为 1qemu-arm -L /path/to/lib ./pwn 其中-L后面跟的参数为路径,不知道的话可以通过 file pwn 来查看一下所需路径以及ld 如果想要调试的话可以通过 1qemu-arm -L /...
justctf2025 pwn
justctf2025 pwn上周打了一下justctf,做了一道babyheap,shellcode没想到jmp短跳指令,没做出来,prospector和jctfcoin是学长做的就没看,QAQ,今天看了一下,还可以 shellcode printer利用printf的%hn,每次两个字节向mmap中写shellcode,最后可以执行两个字节的shellcode,利用jmp的短跳指令可以直接跳回一开始的shellcode,就可以getshell了 exp: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768from pwn import *context(arch="amd64", os="linux")#context.log_level='debug'context.terminal = ["tmux&q...
pwn-environ打栈
pwn-environ打栈学习前言很早前就了解过这个打法了,但是一直没尝试过,今天试着做了一道2024ciscn ez_heap来尝试一下environ打栈,其实很简单,environ在libc中,储存着一个栈地址,而这个栈地址与函数栈帧之间的偏移是固定的,通过泄露environ,就可以在堆题中实现对栈的攻击,但其实都能把chunk劫持到栈上进行篡改数据的话,直接修改IO结构体,打IO也是可行的,这里尝试了一下打栈 题目分析题目漏洞很简单,比如在add里申请一个0x100的chunk,但是在edit里对这个chunk的修改的size由自己定,且没有上限,你可以修改0x200,0x300甚至更大,很明显的堆溢出,之后泄露heap,泄露libc,泄露stack,然后将chunk劫持到栈上修改ret,控制执行流,就可以了,哦对,这个题开启了沙箱,可以用mprotect修改一个页的权限,然后写进去shellcode,也可以直接用rop链,都是可行的,我这边用的mprotect,记得调用mprotect时修改权限的地址要页对齐噢~~ exp: 12345678910111213141516...
pwn-c++异常处理利用
pwn-C++异常处理利用前置准备(如何更换一个c++编译而成的程序的依赖库)一个题目如果需要用到libc的话,其他依赖库可能不会给你,但一般都会给libc,告诉是哪个版本的,我们需要获取对应版本的其他依赖库,这里给出的方法是从docker中拷贝 1.执行如下命令创建对应版本的docker,获取对应版本的依赖库,这条命令创建的是22.04的docker,扒的是2.35的libc,根据自己的需要更换版本 1docker run -it ubuntu:22.04 /bin/bash 2.进入dorker后,这个版本对应的所有依赖库一般在/usr/lib/x86_64-linux-gnu目录下,通过ls命令可以查看到所有的依赖库(我的是这样的),然后通过docker的命令将自己所需要的依赖库拷贝到本地即可 123docker cp your_docker_id://usr/lib/x86_64-linux-gnu/libc path/to/your_desktop#你的docker_id可以通过docker ps查看#在/usr/lib/x86_64-linux-gnu下的libstd...
Nepnep2025-CTF-pwn
Nepnep-CTF-pwn打了一下nep的比赛,由于个人原因,做了time和astray后就没再做了,估摸着smallbox也能出来吧,总得来说体验还是不错的,赛后复现也学到了新东西hhh,我写的wp很草率,大家可以看看别人的,不要学我这么懒噢~~,链接1,链接2 time第一次调试多进程和多线程的题,也是边调边学,这个题的考点是线程竞争,两个线程 共用一个内存地址,可以读写数据,第一次输入 file 文件名的时候随便输入一个绕过检测开启第二个线程,然后第一个线程会继续运行让你继续输入 file 文件名,这时候输入 flag ,就 可以修改内存中的数据,导致第二个进程 open(flag)(因为第二个线程运行的内容多,运行的比较慢),然后利用 fmt 泄露就可以了,但是不知道为啥,这个题%s 不行,非得用%p 泄 露,%s 卡了我很久很久,真的我哭死 exp 12345678910111213141516171819202122232425262728293031323334353637from pwn import *context(arch="amd64"...
musl_libc_pwn学习
musl_libc学习(1.2.2)前言1.1.xx的版本已经很老了,估计也不会遇到了,所以这里就不再学习了主要是因为本人太懒了,目前musl-libc已经出到了1.2.5-3了,但是貌似能搜到的题只有1.2.2的,所以学习一下1.2.2的堆管理结构,以及如何利用 (文章内容为个人见解,有错误的话欢迎大佬批评指出) 环境布置musl-libc是集libc和ld为一体的,所以只要一个libc.so就够了,要调试musl的题,调试符号是必不可少的,但是从其他大佬的博客来看,都是要下载调试符号包,然后加载,本人鼓捣了半天,结果还是加载不出调试符号(可能是操作有误),ubuntu要下载各个版本的调试符号包以及各种包的话可以去官网,这里放个链接 加载调试符号因为实在加载不出符号调试表,所以直接在源码编译的时候加了调试符号,直接使用带有调试符号的libc.so 1234567cd ~/桌面/muslwget https://musl.libc.org/releases/musl-1.2.2.tar.gz #下载源码安装包tar -zxvf musl-1.2.2.tar.gz #解压cd mu...
pwn出题
pwn编写程序代码写好程序代码之后C语言(或者其他),编译成二进制可执行程序 如果只是编译的话 1gcc your_file_name.c -o target_name 去除canary 1gcc -fno-stack-protector your_file_name.c -o target_name 去除pie 1gcc -no-pie your_file_name.c -o target_name 去除NX 1gcc -z execstack your_file_name.c -o target_name ctf_xinted部署本地: 在bin文件夹中放入要运行的二进制程序,flag内容自定 ctf_xinetd 将./your_file替换为你的文件名,这里建议将port(容器内的端口)改为80,虽然不知道为什么,但貌似这样更快一点 1234567891011121314151617181920service ctf{ disable = no socket_type = stream protocol = tcp ...