- 下载下来文件以后发现是一个64位ELF文件。
- 64位IDA载入后查看主函数,F5查看伪代码。
- 需要在执行的时候传入参数。
1 | if ( (unsigned int)verify(argv[1], argv, envp) ) |
- 这是一个关键判断,跳进去看看。
- 双击encrypted 进入对应数据段。
根据题意,如果所传参数在执行对应操作以后与encrypted数据段的数据对应相等,则提示成功。如果有一处不等,则提示错误。
写得算法如下。
- 但是经过调试,发现有几个位置无法进行输出,如2 、4 、 6 、7等。
- 苦思冥想无果以后请教大佬。
一句这TM用了溢出, 点醒了梦中人。
因为算法中执行了位操作,所以极有可能导致溢出,所以算法有缺陷。
- 在后面加上&0xff以后, 运行结果便正常了。
0xff表示取后两位。 例如: 0x1d1&0xff 就是0xd1。