/avr.png

Shino Channel

0ctf/tctf2023-0gn nodejs引擎魔改分析

碎碎念 本文也可以改名《Shino 为什么是一个啥比》,一个首波逆向题坐牢两天没做出来(还是我太菜了) 主要是复盘记录一下当时做题的几个思路和分析以及反思,虽然都没有成功但是也算一次经验积累,以供以后参考。 赛时分析 js部分 解混淆 首先格式化一下js,然后简单看一下混淆的大概pattern。 有一个函数表,类似这样(节选) 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 var i = { 'kwUyT': '3|6|4|2|0|1|5', 'ayHHB': function(H, I) { return H & I; }, 'gqHZW': function(H, I) { return H & I; }, 'bLOAn': function(H, I) { return H ^ I; }, 'NoEaD': function(H, I) { return H & I; }, 'ZUNMN': function(H, I) { return H ^ I; }, 'HpUmq': function(H, I) { return H ^ I; }, 'GXcYX': function(H, I) { return H ^ I; }, 'fMkag': function(H, I, J) { return H(I, J); }, 'WtIoQ': function(H, I, J) { return H(I, J); } } 这里解混淆的思路是显然的,通过正则或手动将被混淆的函数名直接替换为对应的操作。如:

Hitcon2023 Reverse wps | AK with StrawHat

碎碎念 应该是在 Straw Hat 队认真打的第一场国际赛事吧,可惜半天左右就把逆向全打完了(驾驶员技能发动 我一个人就够了.jpg),有些失望(但是很爽)。 写于 2023-09-09 23:25 离比赛结束还有 1day 左右,但是目前放出的 Reverse 已经全部 AK 了,没事干了写个 Writeups 先。感觉目前放出的 Reverse 难度总体偏易,大概 CrazyArcade < Full Chain - The Blade < LessEQualmore 吧,这里按打题顺序简单写一下复盘。 LessEQualmore 虚拟机的逻辑非常简单,每个指令为 3 个字长a1 a2 a3,假设存在mem[]里 逻辑伪代码大概如下: 1 2 3 4 5 6 7 8 9 10 11 12 if a1 < 0: data = input() else: data = mem[a1] if a2 < 0: output(data) else: mem[a2] = data if mem[a2] <= 0: jmp a3 然后就是逆向字节码了,这个字节码非常复杂,需要考虑一种方法去除我们不需要的指令。可以运用类似编译原理中常量传播的思想,追踪所有与输入数据相关的数据位置,dump一份只和输入相关的指令:

SCTF2023 - SycGson

打开看到 Golang 字样,使用 go_parser 恢复一下符号。 https://github.com/0xjiayu/go_parser 1 2 3 4 5 6 7 v24 = "115.239.215.75"; v25 = 14LL; v26 = "12345"; v27 = 5LL; *((_QWORD *)&v2 + 1) = 2LL; v7 = os_exec_Command(); v12 = os_exec__Cmd_StdoutPipe(v7); 奇妙的逻辑,可以通过字符串判断是 nc 取数据,nc 115.239.215.75 12345 看一眼拿到的数据,形式如下: 1 2 3 4 5 6 7 {1801 [ {1878 1630 {1600 1047 1355}} {1968 1923 {1602 1096 1287}} {1805 1572 {1600 1102 1283}} {1963 1669 {1600 1165 1327}}] 4} 看数据 parse 逻辑,从.

ciscn2023-Pwsh Powershell反混淆对抗实战

碎碎念 ​ 刚进黑灯模式就出了flag,看到还是 0 解题以为可以拿全场唯一解光荣退役了,结果平台的flag配置是烂的,以为 0 解的原因是平台烂直接找运维对线,拉扯了一个小时左右赛后说 pwsh 需要人工验证flag以为其实大家都会做只是没交上,第二天起床一看还真是一血全场只有 2 解。也算光荣退役了? 但是比赛结果一般,打ctf不如闲鱼买flag,整场比赛充斥着国粹这种脑瘫题,不过打不过闲鱼哥还是我太菜了。 Writeups 初步分析 题目备份:https://small.fileditch.ch/s3/ssQpUZIxaIRvkfVeChBp.ps1 一个powershell脚本,先base64后解密再执行,先上手解密base64串 1 2 with open("p4.ps1", "w") as f: f.write(base64.b64decode(code).decode()) 1 2 3 4 $M=@{129693309641433576095262078804193086780='(New-ObJecT sysTEm.Io.COMpResSIoN.DEflATesTReAm( [SyStEM.iO.meMORYsTreaM] [sYSTEm.CoNVErT]::FRoMbASe64StrIng( "1VhNaxxHED3Xv+iDYXZBWuwEArHJwQYTy8gS2CKHiCUHIX/koDiKyMXWf89G8s7Ux6ue7hpN7zqBZKa7qvrVq1fVs+rSt3/o7j/0/wNtH+5eaLt7/ySWktmmbThuTP06bfe1pY0grNUi9fY6tPHOBLYnkec17FuLnpHEY2RyVgsqS5T0kLM+yiyA4CTXSa3yOoO4EoWLS+U6mjtxF2K75DKYVx5LkgBWtpCjUBYE+GdMvFpoCXFswiShhd3ABXQR9mqKxxdje1RGgPmqqWXTICCR7fTEbe1HV7FJv+2yAUYpYq2Pjj....' $t=Read-Host -Prompt "Enter your flag"; [System.Collections.Queue]$tt=([byte[]][char[]]$t|%{$_ -shr 4;$_%16}); iex($M[129693309641433576095262078804193086780]) M太长了这里就不放了,可以看到M是一个字典,对应的是混淆过的powershell脚本,每个key(一串数字)分别对应了一段混淆过的powershell的脚本,尝试解混淆。 混淆分析 混淆方式类似如下,这里给出几个样本: 1 2 3 4 5 6 7 (New-ObJecT sysTEm.Io.COMpResSIoN.DEflATesTReAm( [SyStEM.iO.meMORYsTreaM] [sYSTEm.CoNVErT]::FRoMbASe64StrIng( "....." ) ,[SYSTeM.io.COMpRESSIoN.COmPressiOnmODe]::dECoMprEss ) | FoREaCH-objEct{New-ObJecT sySTem.Io.StReamreAder( $_ , [TexT.

网鼎杯2022总决赛-secret 全栈CTFer的自我修养(?)

碎碎念 ​ 本来没想着网鼎杯能进总决赛的,毕竟青龙组100+个队就给了12个晋级名额。结果 RHG 一开快手+强运+队友给力直接飞到前十躺进了总决赛,半决赛两个 pwn 防御也是水得不行,本想着逆向手进场观摩队友做题结果意外和 Photon 大哥合力把 pwn 基本 ak 了,只能说运气很好。 ​ 总决赛基本没有逆向手的题(共同防御那个java题出来的时候我精神状态不是很稳定,exp一直挂到了比赛结束),值得复盘的也就只有这个还挺有意思的web综合题了,我还是太菜了。 漏洞分析 ​ 题目镜像丢了,别问。 漏洞点1 ​ 登录进去是一个简单的登录框,试着打了两个单引号发现似乎没有 SQL 注入,Burp 一开先抓包再考虑别的。 ​ 突破口在 Response Header里的 Server: Cpython3.5,可以发现似乎是 python 的后端,应该是 Flask 框架, 试了一下没有模板注入的点,考虑__pycache__泄漏,整了半天也没访问到pycache文件夹。根据资源请求随便试了一下/static目录,发现可以访问。 ​ 理论上说 py 代码应该在static上级目录的某处,一通乱试发现/static../路径可以访问上级目录,目录结构如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | __pycache__ | __init__.cpython-35.pyc | models.cpython-35.pyc | main | __pycache__ | __init__.cpython-35.pyc | forms.

NKCTF2023ezstack - SROP初探

1 2 3 4 5 Arch: amd64-64-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x400000) 鉴定为,没有保护。 核心代码很短: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 .text:00000000004011B9 vuln proc near ; CODE XREF: main+17↓p .text:00000000004011B9 .text:00000000004011B9 buf = byte ptr -10h .text:00000000004011B9 .text:00000000004011B9 ; __unwind { .