入门级追码(等级3)
本帖最后由 ICEY 于 2021-1-24 13:57 编辑等级3:
{:1_927:}美好的夜晚,可不要浪费了,学点知识吧!{:1_927:}这次的RM依旧是 给 像我一样的新手 练习用的。
(我的水平不足以让我写出让高手玩的RM{:1_936:})下载:成功截图:重要的是看懂汇编指令推断算法哦。如果是爆破的话未免太简单了https://static.52pojie.cn/static/image/smiley/default/45.gif。
小提示(如果没思路):刮刮乐1.看看区段。2.密钥可能会比你想象的要长一点。3.可不止有一处验证呢。
本帖最后由 weikun444 于 2020-12-30 08:54 编辑
read(0, v3, 0xC8u); //取输入
for ( i = 0; i <= 8; ++i )
dword_405020 = v3 - 48;//逐位减48
注:402000里存的是码表
然后进入验证处:
void __cdecl __noreturn sub_401356(int a1)
{
signed int i; //
int v2; //
v2 = 0;
for ( i = 0; i <= 7; ++i )
{
if ( *(_DWORD *)(4 * i + a1) != dword_402000 )
sub_4013F2();//打印错误信息
++v2;//8位逐位比较
}
if ( v2 == 8 )//为8说明每位相等
sub_40F00A();//进入正确处理
sub_4013F2();//打印错误信息
}
void __noreturn sub_40F00A()
{
int v0; // edx
int v1; // eax
v0 = 0;
v1 = dword_405040;
do
{
v1 = dword_40FF6C;
++v0;
}
while ( v1 != 2 );
if ( v0 == 5 )
sub_4013D8();//打印 i love you
sub_40140C(); //打印 good
} 小白不会,只能这样{:1_923:} 还是比较简单的
第一层:一共输入9个数
第二层:检查前8个数与dword_402000是否匹配
写个脚本读一下:
```
a=""
for i in range(0x402000,0x40201f,4):
a += str(Dword(i))
print(a)
```
第三层:
这其实算是一个迷宫,dword_40FF6C一共有9个有效数字,但是要满足用户输入的第9个数字向v1赋值后,刚好循环五次退出,才算成功。
很明显是要从7开始也就是dword_40FF6C。 分析了一会儿。
IDA中
发现是和内存地址402000作比较,那么前面八位的数据就出来了。
下一关:
根据内存地址0040FF6C这结合算法得出第九位的值为:2
我很好奇IDA里面全是未识别函数的伪代码咋能看懂,OD操作37555561 这几位必须一样
后面是在根据最后输入的一位进行判断,比较复杂 ,没完全看懂,大概是 ...*4+固定值]... 让这个值在那里面转来验证 加油!加油!加油!加油!加油! 加油,一起学习 嗯嗯,一切学习下~~ 楼主好牛,已经399分了,送你一个热心,升级!{:1_899:} 谢谢分享{:1_918:}
页:
[1]
2