特别基础,一点点代码底子就可以看懂!!
右键下载的附件用IDA 64bit模式打开, 一切默认即可.
看到界面后F5看伪C语言代码
进入主函数(直接点圈起来的main)
[一般F5第一个进去的界面都是各种库函数的调用,这里用的__libc_start_main就是GNU C库里的一个函数, 类似写hello_world 开始第一行: include "iostream"那句代码的作用一样]
双击main跳转到主函数继续看
[
第一行main函数之前的_int64 指明函数返回的是64位整数, 后面的_fastcall是调用模式, 一般都是linux或者windows的特殊调用模式, 这题不用特别观察, 因为上级函数都不属于这题的范围了, 需要观察的情况是有没有可能触发内存溢出漏洞的情况。
后两行是初始化变量, c语言的变量调用前需要声明类型, 下面不再赘述。
v5赋了一个从内存中读取的值, 具体值我们是很难知道的, 属于没啥用的信息。
接着输出一串文本, 提示你要输入数据。
然后做了一个判断, 使用ifgets函数判断输入的数据是不是超过254位或者输入了一些“特殊字符”, 防止输入数据过大或者程序无法识别的字符。
接着就是重头戏了, 还是一个判断, 把我们输入的数据传到一个函数sub_4006FD中, 这个函数的作用应该是判断我们的数据是不是对的, 对的则返回 0正确结束函数, 错的就返回 1错误结束函数。
]
(1和0后面的LL是long long类型的意思, 还是数据类型声明, 和函数头那串参数有关系)
双击sub_4006FD进入函数中
[
前四行不再赘述, v3是一个包含4个64位整数的数组, 下面三行是访问v3数组的索引,把数组内三个元素都赋为这个字符串在内存中的地址,再转换成64位整数(类似把字符串转换成ascii码吧, 但是有偏移)。
for循环12次
标红的这个是密码的正确判断, 看懂这个就把题目做出来了。
先看中间括号的内容(v3[i % 3] + 2 * (i / 3))
先访问v3的索引[i % 3], i是一个从1到12的数字, 就是重复访问v3的索引0,1,2 大概四次, 再加上简单计算的数字(偏移量)。
*(char *)(i +a1)先i + a1, a1在第一行声明了是一个64位整数, 再转换成字符型指针, 再访问这个指针。
再看开头的*(char *), 又进行了一次转换成指针再访问的操作, 最后判断是否不等于1。
如果不等于1, 那么函数会错误的结束, 反之则正确结束, 得到结果.
]
那我们怎么得到指针中的值呢?
代码里给了v3数组前三个元素的值, 把c语言写的判断用python再写一遍再拼接不就出来了吗, 简直so ez.
result后面为什么要对ASCII码再减一, 因为判断式等于1啊, 减去这个1不就不等于1了吗
flag:
Code_Talkers