首页 > 其他分享 >SMC出题记录

SMC出题记录

时间:2023-10-06 12:22:42浏览次数:37  
标签:字节 记录 print decrypt 0x48 出题 test SMC

SMC出题记录:

SMC:当我们用IDA反汇编时看到的就是异或前的机器码,也就是加过密的。而程序运行中会自己调用for循环解密机器码,所以运行起来就没问题,而对静态分析会产生干扰

出题源码:

#include <stdio.h>
#include <Windows.h>
#include <stdlib.h>

void test(){
    printf("Congratulation!!!\n");//说明解密成功
    return;
}
void decrypt() {
    DWORD old;
    VirtualProtect(test, 4096, PAGE_EXECUTE_READWRITE, &old); // 修改内存页权限
    for (int i = 0; i < 27; i++)//这里的27取决于test的字节码长度
    {
        *((char*)test + i) ^= 0x90;//SMC解密
    }
    VirtualProtect(test, 4096, old, NULL);
}

int main()
{
    printf("SMC Test\n");
    decrypt();
    test();
}

在这里取出要加密的test的字节码

image

并把字节码按照decrypt函数的密钥(0x90)xor下

a=[0x55, 0x48, 0x89, 0xE5, 0x48, 0x83, 0xEC, 0x20, 0x48, 0x8D, 0x0D, 0xA1, 0x2A, 0x00, 0x00, 0xE8, 0xAC, 0x15, 0x00, 0x00, 0x90, 0x48, 0x83, 0xC4, 0x20, 0x5D, 0xC3]
for i in range(len(a)):
    print('{:02X}'.format(a[i]),end='')#方便在010 Editor里面直接ctrl+F查找替换
print()#换行
for i in range(len(a)):
    print('{:02X}'.format(a[i]^0x90),end='')#限制格式去掉0x,转为大写,方便后面在010 Editor里面替换字节码
print('\n',len(a))

找到test函数的位置:image

Ctrl+Shift+V替换!image

此时SMC加密就完成了

拖入IDA查看

image

可以看到test在静态分析时是被混淆的

我们在decrypt函数后打好断点,F7跟进

image

可以看出此时已经被解密好了

image

CP一下后面没定义的字节码

然后就反汇编成功了

image

程序也可以正常执行到这一步

标签:字节,记录,print,decrypt,0x48,出题,test,SMC
From: https://www.cnblogs.com/zydt10/p/17744417.html

相关文章

  • 错误记录
    NOIP2023训练赛1区分有根树同构,无根树同构。DP计数时不要搞混了。NOIP2023训练赛2猜结论很重要。有必要时观察、手玩样例。尤其是CF的推性质题,时常根据样例能看出关键结论来。NOIP2023训练赛3注意值域数组,判断是否能够与节点数组一样使用N定义数组。离散化后,格外......
  • 记录一次gcc的编译
    在deepin23上编译gcc13.2deepin20素以软件版本过老被人诟病,换成最新的deepin23之后情况大有好转,但是gcc版本为11.2,鄙人对此仍有意见,所以特意研究了如何编译一份较新的gcc来用。1.下载源码包http://mirrors.ustc.edu.cn/gnu/gcc/我相关在中科大镜像站下载东西,选择13.2版本的压......
  • SQL SERVER 存储过程执行日志记录方法(有案例)
    查询历史执行总体情况SELECTTOP100db_name(d.database_id)asDBName,s.nameas存储名称,s.type_descas存储类型,d.cached_timeasSP添加到缓存的时间,d.last_execution_timeas上次执行SP的时间,d.last_elapsed_timeas[上次执行SP所用的时间(μs)],......
  • 2023.9-2023.10 做题记录
    好菜啊,被爆杀了/kk1.CF1572ABook模拟赛上看错题了!#$%!#&%^&#*2.CF348DTurtles类似Catalan数的推导3.CF1271DPortals贪心题。4.CF1545BAquaMoonandChess数数题。注意两个连续的1的移动即可。5.AT_agc007_b[AGC007B]ConstructSequences简单题。注意值......
  • 牛客刷题记录第三天
    packageobject;/***1.子类构造器必须调用父类构造器*2.静态方法要想使用非静态属性和方法,必须要创建对象,用对象.属性,对象.方法(),*不能直接属性,方法()*/classPerson{Stringname="Noname";publicPerson(Stringnm){name=nm;}}......
  • cmd powershell 命令行窗口保存更多的历史记录输出行数,防止上面的输出被自动删除
    布局-屏幕缓冲区大小-高度调大或者是用https://stackoverflow.com/questions/71099275/can-view-the-history-of-powershell-outputs这个办法自动保存到一个txt文件中参考https://stackoverflow.com/questions/1740876/more-lines-in-command-window ......
  • Prometheus记录规则&查询结果持久化
    一、查询持久化在Prometheus的表达式浏览器进行的查询会生成新的时间序列,但其结果仅临时保存于PrometheusServer之上。在样本数据量较大、工作较为繁忙的PrometheusServer上,对于那些查询频率较高且运算较为复杂的查询而言,实时查询会存在一些响应延迟的情况。此时,记录规则和告警规......
  • Flink学习记录
    Flink学习记录1简介1.1梗概ApacheFlink是一个框架和分布式处理引擎,用于对无界和有界数据流进行状态计算。对比Spark来说,FLink是真正的流式计算框架,而不是像Spark的微批处理1.2工程搭建<properties><flink.version>1.13.0</flink.version><slf4j.vers......
  • access 使用Update更新记录时,提示"操作必须使用一个可更新的查询"
    原SQL:UPDATE刀具申购明细SET刀具申购明细.关闭=-1where刀具申购明细.申购数量<=(SELECTSum(Round(Nz([入库数量],0)*1,2))AS入库合计FROM采购入库tempLEFTJOIN刀具入库明细ON采购入库temp.申购ID=刀具入库明细.采购IDGROUPBY采购入库temp.申购ID)我本......
  • java多线程中的 锁(暂时记录)
    P150-lock----锁----那一节publicclassThreadExtendextendsThread{  staticintticket=0;  staticLocklock=newReentrantLock();  publicvoidrun(){    while(true){      lock.lock();      if(ticket......