首页 > 其他分享 >[安洵杯 2019]crackMe

[安洵杯 2019]crackMe

时间:2023-07-08 09:12:20浏览次数:40  
标签:编码 old key temp 安洵 crackMe 2019 base 函数

[安洵杯 2019]crackMe

将exe文件放入ida打开后,首先按shift+F12查看字符串,发现了base64的编码表和一串疑似经过加密/编码处理过后的字符串

image-20230703150255400

此时推测该字符串不是由正常base64编码得来,可能进行了换码操作,因此点进引用了该编码表的地方

image-20230703150416870

此时发现该函数对base64的编码表进行了大小写转换的操作,然后下面提示hook成功,此时推测程序在运行过程中的流程发生了变化

继续点进Handler进行分析

image-20230703151107616

发现将一串关键的字符串传入了v2当中,然后执行了sub_411172()函数,我们点进去继续进行分析

image-20230703151743457

结合资料发现这是SM4加密,而且刚刚传入v2的值是密钥,我们接着向下分析

image-20230703151940397

经过加密之后,程序执行了系统函数SetUnhandledExceptionFilter,查询资料得知该函数的作用是当程序发生异常则会执行参数中指向的函数,推测程序在运行到此处之前会出现异常,然后程序会进入TopLevelExceptionFilter函数之中,目的应该是隐藏这个函数的调用,我们点进该函数分析

image-20230703152351947

该函数首先对Str2进行了相邻两位换位操作,点击查看后发现变换完之后就是之前所说的疑似进行编码/加密过后的字符串

image-20230703152615131

接下来就是一个对Str1的赋值操作,我们点进去进行分析

image-20230703152853210

发现该流程正是base64的编码过程,不过有些不太一样,我们仔细查看后发现,将后面填充的“=”变成了“!”,而且下方还执行了一个函数sub_4110FF(),点进去查看

image-20230703153147138

发现最后有一个移位的操作,这里可以理解为将变换后的base64编码表再循环左移了24位

在给Str1赋值之后,我们接着在分析sub_411136()函数

image-20230703153525843

发现该函数最后判断Str1是否与Str2相等

此时推测程序的流程为:用户的输入→SM4加密→换码base64编码→与Str2比较

因此我们首先要得到SM4加密之后的密文:

str2 = '1UTAOIkpyOSWGv/mOYFY4R!!'
old_base = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
temp = []
new_base = [0 for i in range(64)]
for i in range(len(old_base)):
    if old_base[i].isalpha():
        if old_base[i].isupper():
            temp.append(old_base[i].lower())
        else:
            temp.append(old_base[i].upper())
    else:
        temp.append(old_base[i])
for i in range(len(temp)):
    new_base[(i+64-24)%64] = temp[i]

print(''.join(new_base))

这样就得到了变化之后的base64编码表

image-20230703160243621

通过工具解码后得到了加密之后的密文(此处注意将“!”替换为"=")

image-20230703160430415

之后再编写SM4解密脚本得到flag,完整解题脚本如下:

from pysm4 import encrypt, decrypt
str2 = '1UTAOIkpyOSWGv/mOYFY4R!!'
old_base = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
temp = []
new_base = [0 for i in range(64)]
for i in range(len(old_base)):
    if old_base[i].isalpha():
        if old_base[i].isupper():
            temp.append(old_base[i].lower())
        else:
            temp.append(old_base[i].upper())
    else:
        temp.append(old_base[i])
for i in range(len(temp)):
    new_base[(i+64-24)%64] = temp[i]

print(''.join(new_base))

miwen = '0x'+'59 D0 95 29 0D F2 40 06 14 F4 8D 27 69 06 87 4E'.replace(' ','')
key = 'where_are_u_now?'
key_temp = ''
print(miwen)
for i in range(len(key)):
    key_temp += (hex(ord(key[i])))
print('0x'+key_temp.replace('0x',''))
miwen_num = 0x59D095290DF2400614F48D276906874E
key_num = 0x77686572655f6172655f755f6e6f773f

mingwen = bytes.fromhex(hex(decrypt(miwen_num, key_num))[2:]).decode() 
print('flag{'+mingwen+'}')

因此flag为:flag{SM4foRExcepioN?!}

标签:编码,old,key,temp,安洵,crackMe,2019,base,函数
From: https://www.cnblogs.com/h40vv3n/p/17523227.html

相关文章

  • AT_bcu30_2019_qual_a 题解
    思路纯模拟题,给定N和P后,定义一个计数器sum,重复N次输入,每输入一次就判断P也就是子弹的能量是否≥每面墙的厚度x,如果是,就用P减去x,sum增加1,表示穿过了一面墙,否则跳出循环,输出sum。代码#include<iostream>usingnamespacestd;intmain(){intn,p,sum=0,......
  • AT_nikkei2019ex_h 题解
    思路这是一道博弈题,最优策略是高桥的k一直是1,青木的k一直是0,可以保证拿走的硬币不超过剩下的硬币,这样每次两人都取完后拿走硬币的数量是8^1+8^0,结果是9,那么就用Nmod9,得出的结果就是剩下的硬币。如果结果是0,那么最后拿的就是青木,输出Lose。如果结果是2、4、6,都......
  • AT_nikkei2019ex_e 题解
    思路进题扫一眼题目描述,可以写成这样:是不是很眼熟?这不就是角谷猜想嘛,但它不是让我们求步数果,而是求结果。它给了步数,求结果那就要倒推,第二个样例给了P最大时,也就是1000输出的结果1789997546303,我们就用这个结果往前推,带入角谷猜想的运算过程,就可以了。记得开longlong。......
  • Visual Studio2019 BackgoroundImageLayout属性
    ​BackgroundImageLayout属性值背景图片重复:BackgroundImageLayout属性设置为Tile(默认)背景图片左边显示:BackgroundImageLayout属性设置为None背景图片右边显示:BackgroundImageLayout属性设置为None,同时RightToLeft属性设置为Yes背景图片居中显示:BackgroundImageLayout属性设......
  • 2019年中国公有云厂商发展状况白皮书
     前 言     云发展白皮书做了三年的中国公有云厂商收入利润综合排名,到了这次想要继续推出来,在文章快要完成三分之二的时候,突然有了更强烈的想法,就是立足中国公有云厂商收入利润综合排名,直接升级为:2019年中国公有云厂商发展状况白皮书。一方面,让大家可以更全面了解公有云及......
  • 2019年中国公有云厂商收入利润排名
    继续延续了往年的统计方法,即:云计算是一个筐,什么都可往里装。 从公有云到私有云,从私有云到公有云,抑或还采取混合云,企业上云变得十分普遍。行业数字化转型,在很大程度上推动了公有云厂商进入了一个发展的新阶段。从而,也促使2019年中国公有云厂商获得了更好的发展结果。 据阿明(Aming)......
  • P7316 [COCI2018-2019#3] NLO
    考虑延续GDKOI普及组签到题的做法。先枚举\((x,y)\)考虑他会更新哪些节点,那么这个在GDKOI上是体现在一个差分上面。这里\(n\)很大而\(k\)很小,那么我们就可以考虑枚举\(n\)和\(k\),但是使用线段树来做。但是注意到一个事情,我们做区间赋值附的不是简单的$0/1$......
  • P5471 [NOI2019] 弹跳
    我只会签到题.jpg。显然可以使用二维线段树优化建图拿到一定的部分分,但是这并不优秀。考虑从值域上来入手dijkstra。看做是装置间的最短路顺带更新节点,那么我们可以写一个树套树来维护这一些待更新的点,因为dist是递增的,所以可以更新后删去这些点,然后就可以\(n\logn\)的空......
  • OpenGL环境配置 和 测试代码(GLEW/GLFW VS2019)
    1.配置 2.测试代码:2.1 在黑板色的窗口上画一个三角形1#include<iostream>23//GLEW4#defineGLEW_STATIC5#include<GL/glew.h>67//GLFW8#include<GLFW/glfw3.h>91011//Functionprototypes12voidkey_callback(GLFWw......
  • IDEA 2019 java开发工具软件安装教程
    IDEA全称IntelliJIDEA,是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的java开发工具,尤其在智能代码助手、代码自动提示、重构、J2EE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、创新的GUI设计等方面的功能可以说是超常的。软件介绍析您的代码,查找......