patch

used for a reverse problem named sm4 in MoeCTF2024

当题目给了解密函数或者加解密对称的函数有一些特殊的方法,可以不去逆算法

  • **4C**: 这是 REX 前缀,用于扩展寄存器和操作数的大小。4C 指定了指令使用扩展的 64 位寄存器(在此指令中为 r8),并且涉及到 r8 这一高位寄存器
  • **8D**: 这是 LEA指令的操作码
  • **45 10**: 这是操作数的 ModR/M 字节和位移量。45 表示目标寄存器是 r8(4D的时候表示rcx),源操作数的基址寄存器是 rbp,并且有一个 8 位符号扩展的位移量。10 是位移量

栈结构如下

1
2
3
4
5
6
7
8
9
10
11
-0000000000000120 ; Frame size: 120; Saved regs: 8; Purge: 0

-0000000000000100 enc db 48 dup(?) ; enc: 48字节
-00000000000000D0 Data_plain db 48 dup(?) ; Data_plain: 48字节
-00000000000000A0 key db 16 dup(?) ; key: 16字节
-0000000000000090 decode_Result db 50 dup(?) ; decode_Result: 50字节
-0000000000000050 encode_Result db 50 dup(?) ; encode_Result: 50字节
-0000000000000012 len db ? ; len: 1字节
-0000000000000011 i db ? ; i: 1字节
+0000000000000000 s db 8 dup(?) ; s: 8字节
+0000000000000008 r db 8 dup(?) ; r: 8字节

A0-50=50,所以上图黄色位置为50

现在要改为enc,A0-100=-60,变成A0,相当于把加密后的数据快速改成密文,也可以调试的时候一位位改

输入长度为48位(题目要求)的时候正常输出flag


patch
https://j1ya-22.github.io/2025/02/05/patch/
作者
j1ya
发布于
2025年2月5日
许可协议