N1CTF Junior 2026 1/2

SUBGROUPX Repo: https://github.com/n-WN/SubgroupX 解了几道分数较高的题目,部署后继续修复公式渲染(theme/模板问题)。 / AstralCat 服务端每轮随机 99 字节 message,用 Luo Shu 做 CBC。关键点是同一个对象连续调用两次 Encrypt(),第二次加密的输入其实是第一次的密文。
Read more

XCTF Lilac 2026 Writeup

SUBGROUPX Repo: https://github.com/n-WN/SubgroupX 整理版汇总:按仓库内文档与脚本串主线,每题只保留关键思路和 exp 核心片段(截图已脱敏)。 / 整理说明 本文按仓库内文档与脚本整理,每题只保留解题主线与 exp 核心片段。 文中用 HOST:PORT 代替真实地址,flag 统一写为 LilacCTF{...},不包含外链 URL 与真实 IP。
Read more

PWN入门指引

如果说Crypto需要强逻辑,Reverse需要沉下心,那PWN就可以简单理解为两点都需要 / 环境配置 / Mac: - UTM - roderick师傅的Docker法 Win: Ubuntu WSL/VMware / 上手,不要着急做题,先打基础:从 CS:APP 开始 (中文翻译:深入理解计算机系统 翻译版电子书版本) 计算机N大黑书其一
Read more

PWNable.kr 肥肠适合初学者

col ssh 连上执行ls -la看看(-la参数可以浏览文件属性) cat col.c查看源文件 / 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 #include <stdio.h> #include <string.h> unsigned long hashcode = 0x21DD09EC; unsigned long check_password(const char* p){ int* ip = (int*)p; int i; int res=0; for(i=0; i<5; i++){ res += ip[i]; } return res; } int main(int argc, char* argv[]){ if(argc<2){ printf("usage : %s [passcode]\n", argv[0]); return 0; } if(strlen(argv[1]) != 20){ printf("passcode length should be 20 bytes\n"); return 0; } if(hashcode == check_password( argv[1] )){ system("/bin/cat flag"); return 0; } else printf("wrong passcode.\n"); return 0; } 分析出需要执行 col 这个程序时传参, 而且参数需要20bytes长, 同时要求参数经过 check_password() 后等于 hashcode 变量
Read more

CSAPP

lab 拆弹 第一步的exp, 进 ida 一眼顶针发现是个字符串比对 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 from pwn import * import sys import argparse context.log_level = 'debug' path_to_elf = '/home/user/PWN/OS/bomb_XBan/bomb' elf = ELF(path_to_elf) libc = elf.libc ip = sys.argv[1] # sys.argv[0] 为当前文件名 if len(sys.argv[1]) < 5: port = 0 else: port = int(sys.argv[2]) if port == 0: p = process(path_to_elf) else: p = remote(ip, port) sla = lambda x,y : p.sendlineafter(x,y) sa = lambda x,y : p.sendafter(x,y) ru = lambda x : p.recvuntil(x) def g(arg=''): if port != 0: return gdb.attach(p, arg) raw_input() def choice(op): sla('choice: ', str(op)) def arena(op): choice(1) choice(str(op)) def buy(obj): choice(2) sla('want a', obj) def use(obj): choice(3) choice(1) ru('use?\n') sa(']', obj) def leak_heap(x, y, z): ret = (z ^ 0xBAAD)<<16 ret = (ret + y ^ 0xBAAD)<<16 ret += x ^ 0xBAAD return ret p.recvuntil('day!\n') # 传回 'Border relations with Canada have never been better.' p.sendline(b'Border relations with Canada have never been better.') p.recvuntil(b'next one?\n') p.interactive()
Read more

深渊大学 OS PA

一点点汇编知识 如何得知 char 开了多大 sub 是一个指令,用于执行减法操作。它的作用是将一个操作数的值减去另一个操作数,并将结果存储到指定的目的地。 / esp 是啥寄存器 栈指针寄存器 当前栈顶
Read more

侧信道和嵌入式访问控制

侧信道 / flag{The_rotten_measurement_channel}

PWN 入门

在这里学的 NTUSTISC - PWN入门基础学习【集合】 pwn训练营-2-shellcode专题 1. Vuln 栈溢出 查程序属性 / 1 file file_name ![[Pasted image 20230308160401.png]] / 1 checksec vuln ![[Pasted image 20230308160806.png]] / 发现无壳 无动态链接 查字符串 / 1 strings ./vuln | grep flag ![[Pasted image 20230308162125.png]] / 可以发现存在文件操作 / 方便本地测试 在程序目录下构造 flag.txt 内存入一些自己分辨的值 比如 flag{ahh}
Read more