梯度泄露攻击
阅读笔记 引言1、深度神经网络(DNNs)面临的两个问题:(i)如何在一个私密敏感数据的集合上训练模型,以便能够安全部署,同时最大限度地减少敏感训练数据的披露? (ii)使用差分隐私训练的 DNN 模型能否被信任,以防止其输出侵犯隐私? 2、深度学习的隐私风险深度学习在训练阶段和预测阶段都容易受到多种隐私攻击,这些攻击利用了其庞大的模型参数数量,这些参数足以编码个人数据的细节。在模型训练过程中可以无声地使用相同的监视过程和未经授权的读取操作而不被发现,并且可以使用相同的重建算法从泄露的梯度中披露私人训练数据。 3、差分隐私深度学习 差分隐私:...
强网杯 2025 WriteUp + 复现ing
虽然逆向大失败了但是真打爽了,决定全复现 Reversebutterfly程序对输入文件按每 8 字节块进行如下变换(加密流程): t = B XOR K (按位异或,B 为 8 字节明文块,:key为 "MMXEncode2024" ) u = swap16(t)(在每个 16-bit lane 内交换字节:[b0 b1 b2 b3 ...] -> [b1 b0 b3 b2 ...]) v = ROL64(u, 1)(对整个 64-bit 做循环左移 1 位) out = bytewise_add(v, K)(对每个字节做 (v_byte + K_byte) & 0xFF) 写回并对整个文件的每个 8 字节块重复此操作。程序还在内存中于 buf[file_size] 写入一个 16-bit 的 file_size(原始长度)。 因此解密(逆操作)为: tmp = bytewise_sub(C, K) rot = ROR64(tmp, 1) swapped = swap16(rot) B = swapped XOR...
LilCTF 2025 WriteUp (Reverse方向)
LilCTF 2025:https://lilctf.xinshi.fun/games/ ASM ASMMainActivity123456public class MainActivity extends AppCompatActivity { public native String check(String str); static { System.loadLibrary("ez_asm_hahaha"); } 定义了一个 native 方法 check(String),加载so 12345678910111213public void m1789lambda$onCreate$1$workpangbaiez_asm_hahahaMainActivity(EditText input, Button btn, View v) { String txt = input.getText().toString(); // 获取输入 ...
L3HCTF 2025 WriteUp (Reverse方向) (更新中)
因为好久没更新博客被SW拷打了,思来想去决定还是把Writrup放在blog上,一个是催自己复现喵,一个是能整理一下思路练练代码能力。下周ciscn的PPT还没做,能不能天降一个PPT高级工程大师来救救我TT 为什么暑假会比上学忙啊,暑假回来连轴转TT 当时打l3h的时候在做手术,两天都只有半夜摸了一下电脑,只打了两道TT 但是我应该会全复现的! TemporalParadoxOne day I made a request, but I forgot what it was. Can you help me find it? 12Decompilation failure:140001D20: positive sp value has been found 1234.text:0000000140001D20 loc_140001D20: ; CODE XREF: sub_140001D05+16↑j.text:0000000140001D20 168 call ...
llvm&ollvm初探
LLVMLLVM的核心思想是将编译器分为前端和后端两个部分,前端负责将源代码转换为中间表示LLVM Intermediate Representation (IR)(以库的形式提供接口),后端负责将中间表示转换为目标机器的汇编代码。 LLVM IR三种表示: .ll 格式:人类可以阅读的文本。 .bc 格式:适合机器存储的二进制文件。 内存表示 LLVM Pass https://llvm.org/docs/WritingAnLLVMPass.html#the-immutablepass-class Pass就是“遍历一遍IR,可以同时对它做一些操作”的意思,Pass 是 中间 IR 处理环节的主要模块。llvm pass的作用: 插桩 优化机器无关的代码 ModulePass (基于模块)如果函数传递不需要任何模块或不可变传递,则模块传递可以使用接口的函数级传递(例如支配者)来提供检索分析结果的函数。 FunctionPass (基于函数)CallGraphPass (基于调用图)LoopPass (基于循环)PASS 注册方式1、修改...
Linux中的进程通信与多线程
进程与线程 线程是 CPU 调度的最小单位,进程是资源分配的最小单位。 进程(Process) 资源分配的基本单位。 每个进程拥有自己独立的地址空间(代码段、数据段、堆、栈)和文件描述符表。 进程之间不能直接访问彼此的内存空间,只能通过 IPC(如 pipe、shm、socket)通信。 切换进程涉及完整的上下文切换,开销相对较大。 一个进程挂掉不会影响其他进程 线程(Thread) CPU 调度的基本单位。 一个线程属于某个进程,多个线程共享进程的地址空间、堆、文件等资源。 每个线程有自己独立的栈空间和寄存器上下文。 使用线程可以更轻量地实现并发(上下文切换比进程快)。 线程之间通信无需系统调用,效率高;但一个线程崩溃可能拖垮整个进程。 协程(coroutine)协程是在用户态调度的更轻量级的执行单元,不涉及系统调用或上下文切换,因此更快,但不适合多核并行。 线程通信 vs 进程通信 线程之间通过共享内存通信,进程之间通信必须借助系统提供的 IPC 机制。 线程通信:基于共享内存 + 同步控制 线程间共享内存,不需要...
Heaven's Gate
天堂之门前置知识Windows 架构概览 用户层 内核层 32 位或 64 位进程 始终为 64 位内核 Windows 的内核(ntoskrnl.exe)永远是 64 位。 即使运行的是 32 位程序,它也是通过 WOW64 子系统(Windows-on-Windows64) 模拟运行的 WOW64WOW64 是 Windows x64 系统的一个兼容子系统,用于支持 32 位应用的运行。 在 64 位系统中为 32 位程序提供一个运行时环境。 WOW64 的三大组件:| 模块 | 位数 | 作用 || ———————— | —— | ———————————- || wow64.dll | 32 位 | 桥接层,将 32 → 64 位参数封装 || wow64win.dll | 64 位 | 处理 GUI / 用户模式接口 || wow64cpu.dll | 64 位 | CPU 上的 thunk 机制(切换执行模式) | 拦截 32...
常见加密算法整理
TEA家族TEA算法每一次可以操作64bit(8byte),采用128bit(16byte)作为key,算法采用迭代的形式,推荐的迭代轮数是64轮,最少32轮(可以改变)。 TEA系列算法中均使用了一个DELTA常数,但DELTA的值对算法并无什么影响,只是为了避免不良的取值,推荐DELTA的值取为黄金分割数(5√-2)/2与232的乘积,取整后的十六进制值为0x9e3779B9(也可以改变),用于保证每一轮加密都不相同。 XTEA:使用与TEA相同的简单运算,但四个子密钥采取不正规的方式进行混合以阻止密钥表攻击。Block TEA算法可以对32位的任意整数倍长度的变量块进行加解密的操作,该算法将XTEA轮循函数依次应用于块中的每个字,并且将它附加于被应用字的邻字。 XXTEA使用跟Block TEA相似的结构,但在处理块中每个字时利用了相邻字,且用拥有两个输入量的MX函数代替了XTEA轮循函数。上面提到的相邻字其实就是数组中相邻的项。 算法 年代 设计目标 缺点 /...
ollvm_BCF源码阅读
虚假控制流 BCF (Bogus Control Flow)原理: 虚假控制流混淆通过加入包含不透明谓词的条件跳转(永真or永假)和不可达的基本块,来干扰 IDA 的控制流分析和 F5 反汇编。 反混淆:1、将全局变量赋值并将 segment 设为只读。 对于常规的 ollvm 的 bcf 混淆来说,bcf 的不透明谓词都是处于 .bss段 中。 Edit->Segments->Edit segment 将 Write 复选框取消勾选, .bss段 就设为只读 2、d810 3、idapython patch 不透明谓词 源码位置:obfuscator\lib\Transforms\Obfuscation\BogusControlFlow.cpp 源码解析Pass结构与参数12345struct BogusControlFlow : public FunctionPass { static char ID; // Pass identification bool flag; BogusControlFlow() :...
IDA使用技巧
这两天做题的时候同届的pwn师傅sakura来问有没有可以修改IDA局部变量的方法。研究了一下感觉很有意思,于是单独开一篇文章记录我经常用到的IDA小技巧。 修改局部变量IDAIDA有两种实现方式,我在网上查到可以force new variable,但是我一直没成功。 实现效果: 步骤:因为可以观察到都是分开赋值的 我们在var_5那边按U 我们的目标是分出一个char+int,因为我得需求是让v2[0]单独分出来变成char,v2[1]-v2[4]变成四字节的int,所以我们选择1+4 在01的地方按N重命名成i,在05的地方选择建立数组(可以按A)在N成opcode 回到executeBrainfuck按F5 接着来改汇编 因为IDA在反编译的时候,会根据变量的访问方式和指令来推断变量类型 1mov dword ptr [rbp+opcode+1], 0 ; 赋值了 4 个字节 opcode[1]之后是 4 个连续的字节,IDA会推测opcode[5]这样的存储 我们把它nop掉 1、opcode+1字节数显着地4初始化,IDA...









