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 ...
L3 pwn
heack_revenge这个题比赛中没做出来,赛后复现一下 这个题第一步就卡住我了,(我还是太菜了),这个题通过修改索引可以溢出到ret地址,但是最多只能覆盖一个字节,也就是说,要在0x1800~0x1900这段代码内寻找有用的gadget,结果这个题在0x186a这个地方藏了一个pop rbp,这个是解题的关键 通过pop rbp之后,调试可以发现,rbp会指向index为0的chunk,而且可以通过修改hp,attack,可以修改chunk头中的size部分,实现堆叠,堆风水布局可以泄露libc和heap 泄露libc后,在上图rbp指向的chunk中写入rop链,ret时便可以劫持程序执行流,get_shell !!! exp: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888...
