当前位置: 首页 > article >正文

某国赛CTF逆向题目Writeup:re2

目录脱壳第一层EXE第二层EXEFLAG脱壳010打开UPX改了特征码版本5.1.0直接拖到ida分析不出来这里我们选择动态调试脱壳先找OEPf9运行到入口触发TLS回调函数断点停在了ret上64位UPX壳中不会用一个明显的跨段jmp指令跳向OEP而是把OEP的地址压入堆栈然后执行一条ret指令这样CPU就会把堆栈顶部的OEP地址当作返回地址弹出来并跳转过去我们直接f8过去此时进入了系统DLL地址不用管执行到用户代码标准的UPX壳保存环境的方式步过4次此时当前的栈顶已经被修改了内存中转到RSP在栈顶位置下硬件断点然后一直f9到触发硬件断点此时正在恢复保存的寄存器状态最后的jmp即是尾部跳转直接f4过去然后步过一下可以看到已经解密完成0x4014E0就是OEP打开Scylla插件搜索IAT找到两个IAT大小因为这个exe只有几十kb528字节的输入表正好选择否然后获取输入表dump之后修复得到最终脱壳后的程序第一层EXE通过ida逆向可以看到这里是获取了用户的输入并和Str2进行比较Str 为 NGeQwv8eCRpINEcO标准的windows可执行文件头如果正确就会通过sub_401660函数进行base64解码并向缓存路径内写入一个随机名称的exe直接执行原文件输入密码就能得到第二层EXE运行发现需要输入key继续通过ida逆向这个文件通过main函数找到处理逻辑sub_401550函数分析可知这里的逻辑也是接收用户输入的key然后通过nullsub_3函数判断key是否正确中间的do-while步骤是优化后的strlen函数实现输入长度不超过240现在我们的思路就是分析nullsub_3函数不过nullsub在ida中代表为只有一个ret的空函数说明针对反编译器做了修改我们需要看看到底是不是真的空函数跟进后发现是一个奇怪的hello节应该就是题目提示了这里我们选择通过x64dbg进行动态调试首先加载后找到主逻辑函数地址查找Enter the key关键字引用ida中找到地址输出Faild和Success中间的call就是直接跳转然后下断点0x401623然后一直f9运行到等待用户输入返回窗口随便输入一串key12345678跟进这里可以看到明显是有内容的分析逻辑如下1、逐字节读取刚刚输入的key2、计算离16字节的填充并补齐经典的PKCS#7填充3、为404CB0函数准备参数rcx、r9、r8基本可以判断是AES或者SM4运行到404F86调用404CB0函数之前拿到三个参数Key: C2 30 12 AB 39 10 18 33 F8 ED 4E 46 8D A1 5D 8D 8C FB F0 72 68 99 DC 7C 84 6E 7E CF 32 BB DA F8 IV: AE BA 0D BB CA 26 7F 99 06 ED 7C 70 E3 8D 8B 11 CipherText: 9B 5E 1E 8F D7 C3 43 62 A2 37 86 C0 CE 3D 3C F4 C3 B6 88 FF 3C 9C 13 D2 BB 6F 49 CE FF 59 A2 5C 36 E4 61 9E 60 61 C3 BB 3F 63 AF 00 3B 3D 8D A7然而AES和SM4解密都失败了说明题目对标准加密流程进行了魔改跟进404CB0函数内部这里往栈上压入了一个参数E十进制14而加密轮数14的分组密码只有AES我们上一步解密失败了最大的可能就是魔改了标准的S盒往下看压栈后调用了404B60函数直接跟进这里就是AES的核心算法先把内存地址 4071E0 装载到了 r14 寄存器里然后把明文字节当做索引 rdx去 r14 也就是 4071E0 这个地址里查表替换这就是 AES 加密中最核心的字节替换操作那么4071E0地址就是魔改S盒的地址然而进去后发现就是标准的S盒接下来就该排查行移位ShiftRows和列混淆MixColumns步骤有没有问题这里调用了2个函数分别跟进看一下4040700, 5, 10, 15、13, 4, 9, 14、8, 13, 2, 7正确对应行移位后的矩阵排列4041900x1B 是 AES 有限域乘法的标准多项式常数2 和 3 也是标准的乘法矩阵到这里我们总结一下1、标准S盒2、标准行移位3、标准列混淆还剩最后一个密钥扩展算法这里我们想要重新分析算法就比较复杂了但是最终是要生成好放进内存直接在密钥生成器之后在内存中获取即可重新运行跟进到404B60内部在字节替换操作之前调用了一个404940函数多半就是轮密钥的生成逻辑运行到此处步过一次而生成的轮密钥随后就被存放在了rbx寄存器指向的地址内存窗口中找到正好240字节C2 30 12 AB 39 10 18 33 F8 ED 4E 46 8D A1 5D 8D 8C FB F0 72 68 99 DC 7C 84 6E 7E CF 32 BB DA F8 B4 67 53 88 8D 77 4B BB 75 9A 05 FD F8 3B 58 70 CD 19 9A 23 A5 80 46 5F 21 EE 38 90 13 55 E2 68 58 FF 16 F5 D5 88 5D 4E A0 12 58 B3 58 29 00 C3 A7 BC F9 0D 02 3C BF 52 23 D2 87 C2 30 87 65 AA 5C B2 BA F1 89 3A E7 BF 29 28 BF 0C 71 01 BF CF 04 C0 F1 87 06 FC 4E D5 25 2E C9 17 15 A9 AC BD 9A 23 C0 A8 13 19 27 17 3A 31 98 1B 4B 30 27 D4 B7 C4 3D CF B1 38 73 1A 94 16 BA 0D 81 BF 16 B0 8B 64 27 A4 98 7D 00 B3 A2 4C 98 A8 E9 7C BF 7C A9 D4 35 DF 18 EC 46 C5 8C FA FC C8 0D 45 EA 78 E4 E3 9B 73 7C 9E 9B C0 DE D2 03 68 37 AE BC 14 33 30 50 25 2B DC 16 E0 A7 26 EA 28 AA 63 00 50 2E 80 C8 DF 52 1E 53 1F 8C CC 50 77 BB 62 EC 63编写自定义轮密钥的解密脚本# 自定义的轮密钥expanded_key_hexC2 30 12 AB 39 10 18 33 F8 ED 4E 46 8D A1 5D 8D 8C FB F0 72 68 99 DC 7C 84 6E 7E CF 32 BB DA F8 B4 67 53 88 8D 77 4B BB 75 9A 05 FD F8 3B 58 70 CD 19 9A 23 A5 80 46 5F 21 EE 38 90 13 55 E2 68 58 FF 16 F5 D5 88 5D 4E A0 12 58 B3 58 29 00 C3 A7 BC F9 0D 02 3C BF 52 23 D2 87 C2 30 87 65 AA 5C B2 BA F1 89 3A E7 BF 29 28 BF 0C 71 01 BF CF 04 C0 F1 87 06 FC 4E D5 25 2E C9 17 15 A9 AC BD 9A 23 C0 A8 13 19 27 17 3A 31 98 1B 4B 30 27 D4 B7 C4 3D CF B1 38 73 1A 94 16 BA 0D 81 BF 16 B0 8B 64 27 A4 98 7D 00 B3 A2 4C 98 A8 E9 7C BF 7C A9 D4 35 DF 18 EC 46 C5 8C FA FC C8 0D 45 EA 78 E4 E3 9B 73 7C 9E 9B C0 DE D2 03 68 37 AE BC 14 33 30 50 25 2B DC 16 E0 A7 26 EA 28 AA 63 00 50 2E 80 C8 DF 52 1E 53 1F 8C CC 50 77 BB 62 EC 63.replace( ,)ivbytes.fromhex(AEBA0DBBCA267F9906ED7C70E38D8B11)ctbytes.fromhex(9B5E1E8FD7C34362A23786C0CE3D3CF4C3B688FF3C9C13D2BB6F49CEFF59A25C36E4619E6061C3BB3F63AF003B3D8DA7)expanded_keybytes.fromhex(expanded_key_hex)round_keys[list(expanded_key[i:i16])foriinrange(0,240,16)]# 标准S盒、逆S盒SBOX[0x63,0x7C,0x77,0x7B,0xF2,0x6B,0x6F,0xC5,0x30,0x01,0x67,0x2B,0xFE,0xD7,0xAB,0x76,0xCA,0x82,0xC9,0x7D,0xFA,0x59,0x47,0xF0,0xAD,0xD4,0xA2,0xAF,0x9C,0xA4,0x72,0xC0,0xB7,0xFD,0x93,0x26,0x36,0x3F,0xF7,0xCC,0x34,0xA5,0xE5,0xF1,0x71,0xD8,0x31,0x15,0x04,0xC7,0x23,0xC3,0x18,0x96,0x05,0x9A,0x07,0x12,0x80,0xE2,0xEB,0x27,0xB2,0x75,0x09,0x83,0x2C,0x1A,0x1B,0x6E,0x5A,0xA0,0x52,0x3B,0xD6,0xB3,0x29,0xE3,0x2F,0x84,0x53,0xD1,0x00,0xED,0x20,0xFC,0xB1,0x5B,0x6A,0xCB,0xBE,0x39,0x4A,0x4C,0x58,0xCF,0xD0,0xEF,0xAA,0xFB,0x43,0x4D,0x33,0x85,0x45,0xF9,0x02,0x7F,0x50,0x3C,0x9F,0xA8,0x51,0xA3,0x40,0x8F,0x92,0x9D,0x38,0xF5,0xBC,0xB6,0xDA,0x21,0x10,0xFF,0xF3,0xD2,0xCD,0x0C,0x13,0xEC,0x5F,0x97,0x44,0x17,0xC4,0xA7,0x7E,0x3D,0x64,0x5D,0x19,0x73,0x60,0x81,0x4F,0xDC,0x22,0x2A,0x90,0x88,0x46,0xEE,0xB8,0x14,0xDE,0x5E,0x0B,0xDB,0xE0,0x32,0x3A,0x0A,0x49,0x06,0x24,0x5C,0xC2,0xD3,0xAC,0x62,0x91,0x95,0xE4,0x79,0xE7,0xC8,0x37,0x6D,0x8D,0xD5,0x4E,0xA9,0x6C,0x56,0xF4,0xEA,0x65,0x7A,0xAE,0x08,0xBA,0x78,0x25,0x2E,0x1C,0xA6,0xB4,0xC6,0xE8,0xDD,0x74,0x1F,0x4B,0xBD,0x8B,0x8A,0x70,0x3E,0xB5,0x66,0x48,0x03,0xF6,0x0E,0x61,0x35,0x57,0xB9,0x86,0xC1,0x1D,0x9E,0xE1,0xF8,0x98,0x11,0x69,0xD9,0x8E,0x94,0x9B,0x1E,0x87,0xE9,0xCE,0x55,0x28,0xDF,0x8C,0xA1,0x89,0x0D,0xBF,0xE6,0x42,0x68,0x41,0x99,0x2D,0x0F,0xB0,0x54,0xBB,0x16]INV_SBOX[0]*256foriinrange(256):INV_SBOX[SBOX[i]]i# 逆向移位definv_shift_rows(s):return[s[0],s[13],s[10],s[7],s[4],s[1],s[14],s[11],s[8],s[5],s[2],s[15],s[12],s[9],s[6],s[3]]defgf_mult(a,b):p0for_inrange(8):ifb1:p^a hi_bit_seta0x80a(a1)0xFFifhi_bit_set:a^0x1bb1returnpdefinv_mix_columns(s):out[0]*16foriinrange(0,16,4):cs[i:i4]out[i]gf_mult(0x0e,c[0])^gf_mult(0x0b,c[1])^gf_mult(0x0d,c[2])^gf_mult(0x09,c[3])out[i1]gf_mult(0x09,c[0])^gf_mult(0x0e,c[1])^gf_mult(0x0b,c[2])^gf_mult(0x0d,c[3])out[i2]gf_mult(0x0d,c[0])^gf_mult(0x09,c[1])^gf_mult(0x0e,c[2])^gf_mult(0x0b,c[3])out[i3]gf_mult(0x0b,c[0])^gf_mult(0x0d,c[1])^gf_mult(0x09,c[2])^gf_mult(0x0e,c[3])returnout# AES解密defdecrypt_block(block,round_keys):statelist(block)# 第一步异或最后一轮密钥 (Round 14)state[a^bfora,binzip(state,round_keys[14])]# 中间 13 轮逆向推导forround_idxinrange(13,0,-1):stateinv_shift_rows(state)state[INV_SBOX[b]forbinstate]state[a^bfora,binzip(state,round_keys[round_idx])]stateinv_mix_columns(state)# 最后一轮 (Round 0)stateinv_shift_rows(state)state[INV_SBOX[b]forbinstate]state[a^bfora,binzip(state,round_keys[0])]returnstate# CBC 解密链ptbytearray()prevlist(iv)foriinrange(0,len(ct),16):blockct[i:i16]dec_blockdecrypt_block(block,round_keys)pt_block[a^bfora,binzip(dec_block,prev)]pt.extend(pt_block)prevblock# 去除PKCS#7填充pad_lenpt[-1]flagpt[:-pad_len].decode(utf-8,errorsignore)print(flag)FLAG得到flagdart{c3d4f5cc-8aab-46ce-a188-2fc453f3b288}

相关文章:

某国赛CTF逆向题目Writeup:re2

目录脱壳第一层EXE第二层EXEFLAG脱壳 010打开 UPX改了特征码,版本5.1.0 直接拖到ida分析不出来 这里我们选择动态调试脱壳,先找OEP,f9运行到入口 触发TLS回调函数断点,停在了ret上 64位UPX壳中不会用一个明显的跨段jmp指令跳…...

深度拆解DeFi经典漏洞案例,Sonne Finance Exploit

在 DeFi 安全事件中,发生在 Sonne Finance上的漏洞非常具有研究价值。攻击者并没有利用传统的重入漏洞或闪电贷操纵,而是利用 借贷协议中“利率与份额计算的精度错误”,最终在几笔交易中抽走约 2000 万美元资产。这类漏洞本质属于 share acco…...

百度文库免vip下载文档_百度文库vip兑换码

这个还是我朋友给我说的一个工具,可以直接下载文档。也不需要登录会员。给大家看一下。方法在这:点我去下载 这个就是测试下载的文档,还是不错的。大家有需要可以去试试看 今日密码在这...

DevSecOps平台建设之Vue3可视化和代码示例

这是我们结合的一份关于Vue3基础理论知识和代码案例的开发教程 Vue2 和 Vue3 最根本的区别在于响应式系统的实现方式,这一变化解决了 Vue2 在数据监听方面的诸多局限性。 Vue2 的 Object.defineProperty 实现 Vue2 使用 Object.defineProperty 来实现响应式系统&…...

免费查AI率的网站有哪些?这3个亲测靠谱

免费查AI率的网站有哪些?这3个亲测靠谱 上周帮室友改论文,她用DeepSeek写了一章文献综述,结果学校预检AI率直接飙到60%多。她问我有没有免费查AI率的地方,想先自己测一下到底哪些段落被标红了。 说实话,现在网上搜&quo…...

南昌本地靠谱的整木定制公司

在南昌,随着人们生活品质的提高,对于家居装修的要求也越来越高,整木定制成为了许多别墅、大平层和高端住宅业主的首选。然而,市场上的整木定制公司众多,如何选择一家靠谱的公司成为了一个难题。今天,就为大…...

记忆函数 II 题解

题目链接 2630. 记忆函数 II - 力扣(LeetCode) 思路 题目所提到 相等才给出缓存的结果,那么我们用 hash 的想法,给每个参数记录下来 对于简单数据类型 —— 值相等 ,类型相等即可 对于复杂数据类型 —— 需要是指…...

2026年,绿壳蛋为何成为餐桌新宠?揭秘专业生产背后的品质坚守

清晨,当你敲开一枚温润如玉的绿壳蛋,看着橙黄透亮的蛋黄在平锅中慢慢凝固,或许不会想到,这枚小小的鸡蛋背后,是一场从田间到餐桌的现代农业品质革命。近年来,绿壳蛋以其独特的营养价值与生态概念&#xff0…...

【MinerU】技术深度解析:开源PDF文档智能提取的利器

文章目录MinerU技术深度解析:开源PDF文档智能提取的利器一、引言二、核心功能特性2.1 智能内容提取2.2 高精度识别能力2.3 技术优势三、技术架构解析3.1 整体架构3.2 核心技术栈3.2.1 PDF-Extract-Kit3.2.2 多后端支持3.3 处理流程详解步骤1:文档类型检测…...

Spring Boot 3.5正式普及!Java虚拟线程+GraalVM原生镜像,启动仅0.3秒

文章目录前言虚拟线程:终于不用为"开线程"心疼了传统线程就像全职员工虚拟线程是"临时工大军"GraalVM原生镜像:Java的"预制菜"革命JVM启动慢是为啥?AOT编译:直接把菜炒好端上桌上手实操&#xff1a…...

做立辉物性表学到的word技巧

在word, 如何不让第一页的页眉设置跑到第二页? 插入分节符:首先,将光标放在第一页内容的末尾。然后点击Word顶部菜单栏的【布局】→【分隔符】→ 在“分节符”中选择【下一页】-1-3-8。这一步会把文档分成两个独立的“节”,第一页…...

geocode.com.cn:经纬度查询省市县乡街道的地理编码服务

在很多业务里,用户上传的并不是详细地址,而是一组经纬度。比如外勤打卡、物流轨迹、设备定位、地图标注、风控分析、LBS 推荐、乡镇级数据统计等场景,系统真正需要的往往不是“坐标”,而是“这个点属于哪个国家、哪个省、哪个市、…...

Windows系统漏洞MS17-010全解析

Windows操作系统的定义Windows是由微软公司开发的一系列图形用户界面操作系统,主要用于个人电脑、服务器和移动设备。它提供了直观的交互方式,支持多任务处理,并兼容广泛的硬件和软件。主要特点图形用户界面(GUI)&…...

2026年高校AI检测政策收紧:免费降ai工具还能用多久

2026年高校AI检测政策收紧:免费降ai工具还能用多久 2025年秋季学期,教育部发布了一份关于加强高校学术诚信建设的指导意见,其中明确提到了对AI辅助写作的规范要求。到了2026年春季,多所高校跟进出台了具体的AI检测执行方案。 政…...

模型解释技术特征重要性可视化

模型解释技术特征重要性可视化:揭开黑箱的钥匙 在人工智能和机器学习快速发展的今天,复杂模型(如深度神经网络、集成模型等)的“黑箱”特性一直是困扰研究者和应用者的难题。模型解释技术通过揭示模型内部决策逻辑,帮…...

深入解析UniAD架构:面向决策规划的端到端自动驾驶Transformer模型全景报告

深入解析UniAD架构:面向决策规划的端到端自动驾驶Transformer模型全景报告 引言:自动驾驶架构的范式转移与“以规划为导向”的哲学 在自动驾驶技术的发展演进中,系统架构经历了从基于规则的专家系统到模块化深度学习流水线,再到如今端到端(End-to-End, E2E)神经网络架构…...

Rust的Box堆分配与栈上大数组在递归数据结构中的选择标准

Rust作为一门注重安全与性能的系统级编程语言,在内存管理上提供了独特的设计选择。其中,递归数据结构的内存分配策略尤为关键,开发者常常需要在Box堆分配与栈上大数组之间做出权衡。本文将深入探讨这两者的选择标准,帮助开发者在不…...

Go JSON 序列化性能对比与优化

Go JSON 序列化性能对比与优化 在现代Web开发中,JSON作为数据交换的主流格式,其序列化性能直接影响系统的吞吐量和响应速度。Go语言凭借高效的并发模型和简洁的语法,成为许多高性能服务的首选,但其标准库的JSON序列化性能在某些场…...

安全测试入门:OWASP Top 10

安全测试入门:OWASP Top 10 在数字化时代,网络安全威胁日益严峻,企业和开发者亟需掌握安全测试的核心知识。OWASP(开放网络应用安全项目)发布的Top 10榜单,是公认的Web应用安全风险权威指南。它为安全测试…...

组织技术矩阵式团队与功能式团队的管理效率对比

组织技术矩阵式团队与功能式团队的管理效率对比 在现代企业管理中,团队组织方式直接影响管理效率。矩阵式团队和功能式团队是两种常见的结构,前者强调跨部门协作,后者则以职能分工为核心。本文将从决策效率、资源调配、沟通成本、创新能力和…...

拆分管理化技术中的拆分计划拆分实施拆分验证

拆分管理化技术是现代项目管理中的核心方法之一,其核心环节包括拆分计划、拆分实施和拆分验证。通过将复杂任务分解为可管理的小模块,团队能够更高效地推进项目,同时降低风险。这一技术广泛应用于软件开发、工程建设等领域,尤其适…...

用ip命令替代过时的ifconfig和route命令

在Linux网络管理的演进历程中,ifconfig和route曾是管理员最熟悉的工具。随着网络技术的复杂化,这些传统命令逐渐显露出功能局限和兼容性问题。如今,ip命令作为iproute2工具集的核心组件,以更强大的功能和统一的语法成为现代Linux系…...

边缘设备管理平台搭建

边缘设备管理平台搭建:赋能智能时代的终端管控 在物联网和5G技术快速发展的今天,边缘计算成为数据处理的关键节点。边缘设备管理平台作为连接海量终端与云端的中枢,能够实现设备高效管控、数据实时处理及资源灵活调度。如何搭建一个稳定、安…...

C++ constexpr 编译期优化实践

C constexpr 编译期优化实践 在现代C开发中,性能优化始终是开发者关注的重点之一。而constexpr关键字自C11引入以来,逐渐成为编译期计算的重要工具,能够在程序运行前完成复杂的计算任务,显著提升运行时效率。本文将探讨constexpr…...

如何实现一个「分布式配置中心」?(如Apollo、Nacos原理)

在微服务架构中,如何高效管理成千上万的配置项?分布式配置中心应运而生,它像一名精准的交通指挥员,确保每个服务实时获取最新配置。本文将深入剖析其核心原理,并以Apollo、Nacos为例,揭示其设计奥秘。 **配…...

python-flask二手母婴用品商城全程服务管理系统_139td

目录需求分析与功能模块划分技术栈选择数据库设计核心表关键功能实现示例(Flask代码)测试与部署注意事项项目技术支持可定制开发之功能创新亮点源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作需求分析与功能模块划分…...

市场营销自动化:客户旅程与触点的优化

市场营销自动化:客户旅程与触点的优化 在数字化时代,企业如何高效触达客户并提升转化率成为关键挑战。市场营销自动化通过技术手段,将客户旅程中的各个环节串联起来,优化触点体验,实现精准营销。它不仅能够节省人力成…...

加解密篇 - 非对称加密算法 (RSA、DSA、ECC、DH)

目录: 简介 RSA算法 DSA算法 ECC算法 DH算法 1. 简介 1.1 概念 非对称加密需要两个密钥:公钥 (publickey) 和私钥 (privatekey)。公钥和私钥是一对,如果用公钥对数据加密,那么只能用对应的私钥解密。如果用私钥对数据加密&#xf…...

C/C++: 栈包含哪些数据信息

函数参数 (32、64位的参数传递又不一样,ABI) 局部变量; 临时寄存器保存; 栈地址指针,栈底寄存器; 指令返回地址; The frame is the area on the stack that holds local variables and saved registers 所以导致栈溢出的情况,一般就是局部变量,这个可注入的点。函数参…...

获取微信授权的code的方式

微信公众号。通过跳转到一个固定的拼接的url。然后获取到这个url页面中通过获取url上面带的参数code就行了url https://open.weixin.qq.com/connect/oauth2/authorize?appid公众号的appid&redirect_uri${encodeURIComponent(跳转到的url的链接地址)} "&respons…...