风信子靶场题目SMC复现及解题思路

首先。打开题目,下载文件解压后,放入PE中查看有无壳,以及文件是多少位,如下显示,无壳,64位

 放入ida中查看,shift+F12招到字符串后,点击后,按Ctrl+X交叉引用,F5得到伪代码,如下

 对代码分析知,此段代码对地址范围内的数据进行异或运算

for ( i = &unk_403020; i < qword_403BA0; ++i )
    *i ^= 0xDEADBEEFBADB7EADui64;

然后调用 VirtualProtect()函数,上网搜一下函数作用(第一次做题时没想到这个点)知

 VirtualProtect()是更改调用过程的虚拟地址空间中已提交页面区域的保护作用。

第一个参数是  要更改其访问保护属性的页面区域的起始页的地址

第二个参数是  要更改其访问保护属性的区域的大小(以字节为单位)

第三个参数是 内存保护选项。 此参数可以是 内存保护常量之一。

                     0x10代表

 VirtualProtect()具体作用参见一下网站:https://learn.microsoft.com/zh-cn/windows/win32/api/memoryapi/nf-memoryapi-virtualprotect

第四个参数是   指向一个变量的指针,该变量接收页面指定区域中第一页的上一个访问保护值。 如果此参数为 NULL 或未指向有效变量,则该函数将失败。

大概了解代码后,调试设置断点,然后设置为local windows dwbugger,点击緑色按钮开始调试

 随便输入一个数值

 找到异或运算的起始地址(G跳转到相应地址)与终止地址,选中,按U表示当前指令为未知,显示16进制原始硬编码,解析未定义内容。然后找到起始地址函数unk_403020按C转换为代码,最后按P创建函数,后即可查看函数

P指令输入

 创建函数后,可查看函数

 查看函数,分析代码,先将 \"5'"赋给v3,并给v3数组其它值赋值。

 第一个for循环将v2初始化为0,第二个for循环将a1处值+j后给v2,第三个for循环将v2做异或与运算。最后判断v2等于v3后即为flag

 看懂代码后我们来写脚本

#include<stdio.h>
int main(){
  char v3[52]={" \"5'"};
  int k,j;
   
  v3[4] = 26;v3[5] = 50;v3[6] = 44;v3[7] = 34;v3[8] = 62;v3[9] = 49;v3[10] = 19;v3[11] = 14;v3[12] = 21;v3[13] = 4;v3[14] = 2;v3[15] = 21;v3[16] = 62;v3[17] = 47;v3[18] = 4;
  v3[19] = 4;v3[20] = 5;v3[21] = 62;v3[22] = 56;v3[23] = 14;v3[24] = 20;v3[25] = 19;v3[26] = 62;v3[27] = 37;v3[28] = 4;v3[29] = 3;v3[30] = 20;v3[31] = 6;v3[32] = 62;v3[33] = 50;
  v3[34] = 10;v3[35] = 8;v3[36] = 13;v3[37] = 13;v3[38] = 28;
char a1[100];
for ( k = 0; k <= 0x26; ++k )
  {
   a1[k] =v3[k] ^ 0x61u;}
printf("%s",a1);
	return 0;
} 

得到flag

附:

ida操作常用指令,参考文章:http://t.csdn.cn/YCeQc

一篇不错的SMC介绍:奇安信攻防社区-初探smc动态代码保护

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值