SMC的逆向示例学习

1.概述学习

SMC(Self Modifying Code)动态代码加密技术:

指通过修改代码或数据,阻止别人直接静态分析

然后在动态运行程序时对代码进行解密,达到程序正常运行的效果

2.隐藏加密原理以及处理

1.处理方法:

1.找到对代码或数据加密的函数后通过idapython写解密脚本

2.动态调试到SMC解密结束的地方dump出来

2.处理实践原理:

SMC的实现是需要对目标内存进行修改的,.text一般是没有写权限的。那么就需要拥有修改目标内存的权限

1.linux系统中

可以通过mprotect函数修改目标内存的权限

2.Windows系统中

VirtualProtect函数实现内存权限的修改

3.常见的处理特征

1.VitualProtect函数的出现

img

2.动态调试

下断点,单步调试进入加密代码

将加密逻辑加载出来里哟美好ucp或者dump下来,转换为

3.nssctf平台题目示例

1.ida打开

image-20240308165804120

一般看见标注的位置的代码,极可能为SMC加密

2.发现关键加密缺失,进入汇编层,找到call的对象

image-20240308165721974

3.进入后ucp反编译查看详情

image-20240308165923887

发现合理可能是出题人给的hint,就是smc加密

提出代码,但是好像没啥东西

__int64 GetNextNumber()
{
int i;   // [rsp+0h] [rbp-10h]
int j;   // [rsp+4h] [rbp-Ch]
int k;   // [rsp+8h] [rbp-8h]
int v4;   // [rsp+Ch] [rbp-4h]

v4 = count++;
for (i = 0; i <= 63; ++i)
{
  count += i;
  count ^= i;
}
for (j = 0; j <= 63; ++j)
{
  count -= j;
  count = j ^ (j * count);
}
for (k = 0; k <= 63; ++k)
  count ^= 0xC0DEC0DE;
return (unsigned int)(v4 - 1059143458);
}

4.这个时候要动态调试,对该位置重新进行ucp反编译,从而提出数据

0x0000004E, 0x00000052, 0x00000051, 0x00000040, 0x00000050, 0x00000041, 0x00000075, 0x00000061,
0x0000002B, 0x0000002C, 0x0000004F, 0x00000025, 0x0000006A, 0x0000005C, 0x00000034, 0x0000005D,
0x00000031, 0x00000065, 0x0000003A, 0x00000022, 0x0000004B, 0x0000001C, 0x00000058, 0x0000005D,
0x0000001B, 0x00000059, 0x0000004B, 0x0000001A, 0x00000058, 0x0000004C, 0x00000050, 0x00000048,
0x0000003F, 0x00000052, 0x00000011, 0x0000000E, 0x00000042, 0x0000003A, 0x00000047, 0x00000009,
0x0000003C, 0x00000008, 0x0000003C, 0x0000004E, 0x00000033, 0x00000036, 0x00000002, 0x00000035,
0x00000003, 0x0000002E, 0xFFFFFFFF, 0x00000005, 0x00000023, 0x0000001E, 0x00000012, 0x0000000D,
0x0000001E, 0xFFFFFFFA, 0x0000003B, 0xFFFFFFFC, 0x00000033, 0x00000006, 0x00000016, 0x0000003E

5.exp

#include <stdio.h>
int main(int argc, char const* argv[])
{
  int data[64] = {
  0x0000004E, 0x00000052, 0x00000051, 0x00000040, 0x00000050, 0x00000041, 0x00000075, 0x00000061,
  0x0000002B, 0x0000002C, 0x0000004F, 0x00000025, 0x0000006A, 0x0000005C, 0x00000034, 0x0000005D,
  0x00000031, 0x00000065, 0x0000003A, 0x00000022, 0x0000004B, 0x0000001C, 0x00000058, 0x0000005D,
  0x0000001B, 0x00000059, 0x0000004B, 0x0000001A, 0x00000058, 0x0000004C, 0x00000050, 0x00000048,
  0x0000003F, 0x00000052, 0x00000011, 0x0000000E, 0x00000042, 0x0000003A, 0x00000047, 0x00000009,
  0x0000003C, 0x00000008, 0x0000003C, 0x0000004E, 0x00000033, 0x00000036, 0x00000002, 0x00000035,
  0x00000003, 0x0000002E, 0xFFFFFFFF, 0x00000005, 0x00000023, 0x0000001E, 0x00000012, 0x0000000D,
  0x0000001E, 0xFFFFFFFA, 0x0000003B, 0xFFFFFFFC, 0x00000033, 0x00000006, 0x00000016, 0x0000003E
  };
  for (int i = 0; i < 64; i++)
  {
      printf("%c", data[i] + i);
  }

  return 0;
}
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇