前言:学习笔记。
常规:下载 解压 查壳。
64位>>>64 IDA Pro打开。
output内容:
常规:查找字符串再进main()
没有看见什么关键信息,进main()看看
分析:
原程序打开flag文件,进行遍历读取并且判断是(i&1)与0的关系(= !=)
!= 执行 左移操作。
= 执行 i *ptr[i]操作。
output.txt应是操作之后的结果。(flag.txt>>>output,txt=密文)
注意点:
原程序中:for ( i = 1; i <= 19; ++i ) 进行遍历。
说明flag.txt文件遍历时,是从第1位开始而非第0位。
同时,output.txt中数据只有19位,而非20位(int类型,不用'\0')
此时,198就变成了第0位 而非第1位。逆向时,需要补位,保持与flag格式一致。
C脚本:
思路:
关键点:什么会变,什么不会变。
变:
!= 执行 右移操作。
= 执行 ptr[i] / i操作。
output.txt需要补位。
不变:
脚本:
核心:保证位一致。
方法一:补位
方法二:不补位。
flag: flag{d9-dE6-20c}
总结:
① 读懂原程序是逆向关键。
② 细节决定成败。(有时逆向不出来,不是实力不行,而是细节漏掉了。)