【WP】TSCTF2022-Pwn部分题解
周末打了TSCTF2022,花了蛮多时间做彭哥的Mute&blind这题最后还是没在比赛时间内做出来,熊哥出了个内核属实不熟……剩下的三个堆题感觉都还行,感谢学长们手下留情属于。最后在抱紧大学霸nama和茯苓的大腿,队伍以微弱的优势取得了第一的成绩……难得啊越来越卷的ctf比赛也就校内赛有机会登个顶了……
MillionBonus覆盖文件指针,劫持vtable,利用+0x88处指针getshell
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253from pwn import*context(os='linux', arch='amd64', log_level='debug')r = remote('10.7.2.142',9898)# r = process('./MillionBonus')elf = ELF('./M ...
【WP】XCTF-*CTFpwn题
examinationquestion num设1,score打出负数,unsigned变大数,check review得到堆地址和任意地址加一(没用上)set mode功能能改指针最后一个字节,范围0x0~0x64可以造成堆上局部的任意写
做法如下:先打score负数,check review得到堆地址布置一下堆,利用setmode中局部的任意写改mode指针,再写入内容修改size,释放掉,造出unsorted bin
接着把基址申请到comment上,再读出来即得到基址
再往下构造,最终利用局部的任意写控制mode指针改student结构体,控制question指向自己,content指向__malloc_hook,size写个数进去,从而构造出真正的任意写,再用写comment把one gadget写到__malloc_hook,调用teacher的隐藏选项触发malloc即可
结构
exp1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515 ...
【WP】2022车联网
chall一道比较简单的vmpwn,没去符号,相对属于比较好逆的
感觉出简单了,如果没给最后的八字节溢出能做,可以利用mvi任意改指针,改成system后再跳上去即可
exp的做法是利用mvi布置sh之后直接跳到八字节溢出布置好的system上执行system("sh")
exp123456789101112131415161718from pwn import*context(os='linux', arch='amd64', log_level='debug')# r = process('./chall')r = remote('47.93.2.254',12713)r.recv()mov = 0x40165bnop = 0x401437mvi = 0x401505code = b"\x3e\x73"code+= b"\x06\x68"code+= b"\x00"code = code.ljust(0x ...
【WP】2022midnightctf_部分pwn复现学习
pwnhub题目alloc功能申请,size<=0x81leak可以用来打印指针read向拿到的指针读入相应大小内容
漏洞在alloc输入-1的时候实际上执行malloc(0),存下来的size是-1,0xffffffff,所以再使用read时能够溢出
思路利用house of orange前半部分的思想,修改top chunk的size,不断耗尽其空间从而把chunk释放。由于版本是libc2.31,所以实际上chunk会被放入tcache中
第八个chunk就会被放入fastbin中。当找不到合适的chunk拿出且top chunk的size不够时,会调用malloc_consolidate。这一步会将fastbin中的chunk放进smallbin中
123456789101112131415161718192021222324252627282930313233 use_top:... victim = av->top; size = chunksize (victim); if (__glibc_unlikely (size > av ...
【WP】tqlctf2022-Pwn
比赛的时候只做出来一道(😭)
unbelievable_write控制tcache struct以后改chunk size造large bin,然后做large bin attack改target
exp123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121from pwn import*context(os='linux', arch='amd64', log_level='debug')elf = ELF('./pwn')def debug(s=None ...
【WP】RealWorldCtf_VmPwn复现
svme题目来源于github的[项目][https://github.com/parrt/simple-virtual-machine-C] (从dockerfile可以看到)
直接先看源码分析一下
VM结构体123456789101112typedef struct { int *code; int code_size; // global variable space int *globals; int nglobals; // Operand stack, grows upwards int stack[DEFAULT_STACK_SIZE]; Context call_stack[DEFAULT_CALL_STACK_SIZE];} VM;
Context1234typedef struct { int returnip; int locals[DEFAULT_NUM_LOCALS];} Context;在堆上创建一个VM结构体存放其成员变量opcode存在位于栈上的code里 ...
【WP】vnctf2022复现学习
菜鸡又来复现学习了orz……比赛的时候没来得及,只看了三个题,唯一一个本地能出的easyRopotocl远程始终打不了,数据一发就崩=-=
BingDwenDwen题目给了一个栈溢出,关了fd0,1,2
赛后查了一下有类似的题,介绍了两种方法
思路1首先想的是找办法恢复输入输出。stdin,stdout,stderr通常指向/dev/pts/?(?通常为0~3),pts是tty的一部分,tty子系统用来管理终端,对每一个连接的终端都会有一个tty设备与其对应
直接使用tty命令可以看到当前shell被关联到哪个tty,如下所示看到向/dev/pts/2写数据会显示到终端上,使用lsof可以看到当前shell和lsof进程的stdin,stdout,stderr都绑定到了该tty上
pty属于伪终端,当使用ssh,talnet等连接的终端时并没有真正的设备连接到主机,而是建立了一个伪终端来模拟各种行为
所以应用到本题,如果能够open到正确的/dev/pts/?,然后将flag输出到其中,就能够得到flag。本方法本地没问题但是远程行不通
思路2通过rop执行socket反弹flag
...
Pwncollege-Babykernel通关笔记
简介题目来源在pwn.college配套练习里的babykernel平台: The challenges created for pwn.college are educational material, and are used to grade CSE466 students at ASU………we would appreciate your help in keeping pwn.college a viable educational platform。
btw 这里的大部分内容在平台相应的课程都有提及,或者在youtube上有教师录制的视频提供了些assistance,又或者在discord的讨论区有些有用的信息
总之就是个人的总结和记录吧
level1.0init_module初始化函数,打开根目录下的flag文件读到flag变量中proc_create会创建虚拟文件/proc/pwncollege,是题目提供的字符设备接口
123456789101112131415161718192021222324252627int __cdecl init_module(){ ...
【WP】hgame-Week1复现学习
主要跟着wp复现一下其他方向,记录一下学到的东西
reasm16位的汇编
先把flag存到ds里,把加密结果存到es里al寄存器八位,每次利用al寄存器逐字节变换flag每一字节的高四位和低四位互换然后异或23
具体操作是先将该字节存入al寄存器,然后左移四位压栈,清空ax,再将该字节存入al,右移四位存到bx里,然后add ax,bx加回去,最后ax和23异或,从而此时al存着就是变换后的结果
然后以es为基址,[si-1]为偏移取密文和加密结果比较,若一致则接着比较下一位,每次si自加一循环28次,然后right;若中间某一次不一致则wrong
1234567891011121314151617#include <stdio.h>#include <stdlib.h>unsigned char t[] ={ 0x91, 0x61, 0x01, 0xC1, 0x41, 0xA0, 0x60, 0x41, 0xD1, 0x21, 0x14, 0xC1, 0x41, 0xE2, 0x50, 0xE1, 0xE2, 0x54, 0x20, 0xC1, ...
【WP】2022hws线上预选pwn题
三个pwn题就做了两个,rw两个题属于确实看不懂
送分题house of husklibc是2.27 1.2版本的,需要从glibc-all-in-one里下下来带符号的libc调试算偏移
exp1234567891011121314151617181920212223242526272829303132from pwn import*context(os='linux', arch='amd64', log_level='debug')r = remote('1.13.162.249',10001)libc = ELF("./libc-2.27.so")sz1 = 0x1850r.recvuntil('Now you can get a big box, what size?')r.sendline(str(sz1))sz2 = 0x9420r.recvuntil('Now you can get a bigger box, what size?' ...




