前置知识
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