首页 > 其他分享 >elrond32

elrond32

时间:2023-11-11 17:12:48浏览次数:31  
标签:int elrond32 argv a1 a2 字符串 argc

前置知识

int __cdecl main(int argc, char **argv)

* argc: 整数, 为传给main()的命令行参数个数。
* argv: 字符串数组。
argv[0] 为程序运行的全路径名;
argv[1] 为在DOS命令行中执行程序名后的第一个字符串;
argv[2] 为执行程序名后的第二个字符串;
...
argv[argc]为NULL。

 所以说这题相当于是传了一个a2字符串

 而这里是对函数进行操作

 

数据存放

 所以如果汇编代码中是按照db(一个字节)来储存数据的话就需要4个db来进行表示,不足的就补0,如下

 

 注意

这里看到这些数字要联想到ASCII码,r键转换

 

 

 

解题

先分析if部分的关键函数

 

看到都指向label,说明因该是对字符串进行多次同一类型 的操作

 然后这里的话相当于是说对字符串进行位移,每次操作一个的意思,然后a2从0开始进行特定的变化

看到a2变化后是%11,而且case的情况只有11个,说明这里的a1应该只有11位或者只需要这么多

那么也可以手搓a2的变化范围进而得到a1的值

string a1=[105,115,101,110,103,97,114,100]

然后分析下一个函数

 

可以看到 v2 是从 unk_8048760 处复制了 33 个 int,查看 unk_8048760 的值发现是一长串数字,刚开始还把我迷惑了,我觉得这么长因该不会是有用的东西吧

 后面才知道这是用0来填充了(一个 int 占 4 个字节,所以剩下 3 个的字节用 0 填充),将0去掉就可以得到准确的数据了

写出脚本得到,注意这里也只需要a1字符串的8个

 

key=[105,115,101,110,103,97,114,100]
v2=[0x0F,0x1F,0x04,0x09,0x1C,0x12,0x42,0x09,0x0C,0x44,0x0D,0x07,0x09,0x06,0x2D,0x37,0x59,0x1E,0x00,0x59,0x0F,0x08,0x1C,0x23,0x36,0x07,0x55,0x02,0x0C,0x08,0x41,0x0A,0x14]
flag=''
for i in range(33):
    flag+=chr(v2[i]^key[(i%8)])
print(flag)

 

标签:int,elrond32,argv,a1,a2,字符串,argc
From: https://www.cnblogs.com/lhqrusht0p/p/17823262.html

相关文章