首页 > 其他分享 >[CISCN 2022 东北]hana 题解(易语言逆向)

[CISCN 2022 东北]hana 题解(易语言逆向)

时间:2024-04-28 23:11:06浏览次数:65  
标签:字节 题解 hana 函数 缓冲区 文本 易语言 加密算法 CISCN

[CISCN 2022 东北]hana

脱壳过程

首先看一下程序信息

程序检测到了UPX的特征,但是下面的特征又显示是VMP壳

使用010 Editor打开文件

将两个VMP0和VMP1改成UPX0和UPX1并保存文件,接下来使用UPX脱壳

分析程序

这里需要用到一个易语言反编译插件以及一个易语言函数查询网站

IDA易语言反编译插件E-Decompiler - 『逆向资源区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

易语言知识库 - 最新易语言在线帮助手册 (125.la)

把exe用IDA打开,一路动态调试会进入主要函数,位置在0x4010b0(可能会有花指令,不多可以写个脚本或者手动去除)

找到之后用易语言反编译器插件,会将里面的函数重新命名,方便阅读。不过我的IDA伪代码界面好像不支持中文显示,所以代码使用插件后看起来有点抽象(可以点击函数然后按n,这样就能显示了),但是在汇编视图里没有问题

接下来就是函数流程分析了,搭配在线易语言函数查询网站使用。

下面是要用到的结构体

typdef struct 字节集
{
   int unkown;
   int length;
   char* bytes;
};

函数伪代码如下

主函数()
{
    文本 = 标准输入(1);
    文本长度 = 取文本长度(文本);
    缓冲区1 = 到字节集(文本);
    缓冲区2 = 解压数据(&unk_48049D); // unk_48049D是储存密钥的字节集结构体的地址
    密钥 = 到文本(缓冲区2);
    缓冲区3 = 加密数据(缓冲区1, 密钥, 2);
    if(字节集比较(缓冲区1, &dword_4804C3[2], 文本长度)) // dword_4804C3是储存密文的字节集结构体地址
    	标准输出(“Right!”);
    else
    	标准输出(“Wrong!”);
    
}

通过函数查询网站可知,加密数据函数的描述如下

语法:  字节集  加密数据 (字节集数据, 密码文本, [加密算法])

参数名	描 述
字节集数据	必需的; 字节集。为命令提供所需的字节集数据。
密码文本	必需的; 文本型。
加密算法	可选的; 整数型。指定具体使用的加密算法,可以为以下常量值之一:1: #DES算法; 2: #RC4算法。加密和解密必须使用相同的算法,有关算法的具体说明请参阅有关文献。如果本参数被省略,则默认值为1,即DES算法。

这里传入的加密算法参数为2,即RC4加密算法。通过动态调试可知密钥的值是 Wrong!

编写脚本

之后我们将密文数据导出然后写个python脚本解密即可

from Crypto.Cipher import ARC4

key = b"Wrong!"
rc4 = ARC4.new(key)
enc = bytes.fromhex("56ECA0DC5707F4A3E977BF93BC8652A5146AA5BDB5D27F0B9B671D08EFC9325D43ED1E014B7B")
flag = rc4.decrypt(enc)![](/i/l/?n=24&i=blog/3317193/202404/3317193-20240428230327432-1114105678.png)

print(flag)

标签:字节,题解,hana,函数,缓冲区,文本,易语言,加密算法,CISCN
From: https://www.cnblogs.com/S1nyer/p/18164717

相关文章

  • Codeforces Round 941 (Div. 1) 题解(A-C)
    比赛链接:https://codeforces.com/contest/1965官解链接:https://codeforces.com/blog/entry/128914比较手速的一场,C与D之间出现了较大的gifficultygap。所幸C题猜得比较快(虽然证明其实比较难),最终rank190,performance2525,成功压线拿下Grandmaster。cpchenpi,堂堂上红!......
  • AtCoder-abc351_d 题解
    原题翻译题意简述给定\(H\timesW\)的网格图,如果一个字符是#,则不能走到该字符上;如果是.,则可以走到该字符上,但如果它周围\(4\)个格子中有#字符,则不能再继续行走了。自由度是指从一个格子出发,能走到不同格子的数量(可以出发多次)。求出所有格子的最大自由度。思路考虑......
  • SAP S4HANA 根据PO号码得到各个ITEM的Conditions数据
    SAPS4HANA根据PO号码得到各个ITEM的Conditions数据   1,如下的采购订单4500001572.   Item10的condition数据里存在PB00,JFRB,NAVM,SKTO,WOTB等条件类型。如上图。  2,先执行事务代码SE16,tableEKKO得到凭证条件号。   输入采购订单号码,执行, ......
  • 通配符匹配|dfs,hash|题解
    [CQOI2014]通配符匹配题目描述几乎所有操作系统的命令行界面(CLI)中都支持文件名的通配符匹配以方便用户。最常见的通配符有两个,一个是星号(*),可以匹配0个及以上的任意字符:另一个是问号(?),可以匹配恰好一个任意字符。现在需要你编写一个程序,对于给定的文件名列表和一个包含通配符的......
  • DozerCTF-PWN题解
    这次比赛一共放了4道pwn题,3道栈上的,比较菜,只会做栈1.pwn_fclosefrompwnimport*context(os='linux',arch='amd64',log_level='debug')io=remote('139.196.237.232',32985)#io=process("./pwn")libc=ELF("./libc.so.6&q......
  • abc351g 题解
    这场abcF、G质量堪忧。怎么能扔板子上来呢?板子:P4719【模板】"动态DP"&动态树分治Solution这种每次修改对后面询问有影响,又每次都要输出答案的,离线就基本做不了了,这时候就往动态算法想,其实做过几道ddp的题就看出来这是个板子。由于题目中的式子性质优良,我们很明显可以把......
  • CF1966D Missing Subsequence Sum 题解
    题意:给定\(n(n\le10^6)\)和\(k(k\len)\)。构造一个长度小于等于\(25\)的序列\(a\)满足:1.不存在一个子序列的和为\(k\)。2.对于\(1\lei\len,i\nek\),存在一个子序列的和为\(i\)。看到长度为\(25\),首先肯定会想到二进制。那么我们先构造出一个序列\([2^......
  • ABC351G题解
    考虑动态dp的套路,先树剖一下,令\(son(x)\)为点\(x\)的重儿子。\(g_x=\prod\limits_{u\inC(x)\landu\neqson(x)}f_u\)。于是有\(f_x=f_{son(x)}g_x+a_x\)。于是\(\begin{bmatrix}f_x&1\end{bmatrix}=\begin{bmatrix}f_{son(x)}&1\end{bmatrix}\begin{bmatrix}g_......
  • 【BFS】abc351D Grid and Magnet 题解
    传送门D-GridandMagnet题意:给定h行w列的图表,其中部分位置有磁铁,人物会在磁铁四周((x+1,y),(x-1,y),(x,y+1),(x,y-1))停止,某点的自由度定义为从该点出发最多可到的方块数目可以走重复路前置例题:求连通块大小洛谷P1141思路:由自由度的定义联想到连通块的大小,从而决定用BFS......
  • ABC351_F 题解
    实际上很板。考虑在\(i\)后小于\(val_i\)的数都对答案没贡献,所以我们只需要知道在\(i\)后且大于\(val_i\)的数的和以及有多少个这样的数就可以了。知道了我们要求什么,就可以一眼权值线段树。从后往前扫不断加入数,然后访问对应区间即可,当然因为值域比较大,所以还要离散化......