前言:学习笔记
常规思路: 下载 解压 查壳
64>>>拉入 64 IDA Pro
常规思路: 查找字符串>>>main
东点点西看看 = =
看完之后再反。
main()>>>
Decry()点进去【当然你东点点西看看的时候肯定也进去了。】
进去原因:main(中没有可用的、有价值的信息、而Decry() C语言中,好像没有这个Decry()吧,说明这是自定义函数。
正向分析:
第一部分:
为什么src 和 v9 要反着来? 小端序啊!
为什么知道它是小端序?
?
字节序 LE>>>小端序 BE>>>大端序>>>【查壳的时候说了啊!】
大端序 12 34 56 78 (日常所见)
小端序 78 56 34 12 (接触 C、汇编、应该不得陌生哦)
为什么 key3 key1 不反着来?
不懂,没关系。
理解为>>>hift+F12查找的>>>查找字符串,其查找的字符直接用就行。
第二部分:
大小写转换!
emmm C语言 写过类似练习,,,
你就看作key[v3%v5] <=> key[i] +32 “ % ” 取模 取余都是它 !!
32dec>>>20h
在ASCII码表中 大小写 相差20h 32dec (王爽老师汇编语言有提过。)
第三部分:
总结:
text = (已知)
key = (已知)
key进行了 大小写转换。
if T >> str2 = text >>> True flag!
str2的算法中 key[XXX] -XX + XX ...都是已知的。只有v1是外界获取来的【getchar()】,so?>>>v1的值就是flag。
而v1的范围(已知)那么重点就是求v1的值。
C逆向脚本(严格来说,我自己感觉不是逆向脚本。。。)
编写思路:
正向中,首先进行了 key的大小写转换,然后再带入后面的算法当中去执行。
那么,我们首先第一步就是 大小写转换。
第二步>>进行算法的执行(或者说 爆破 求v1具体的值)
因为 text = str2
所以 只需要 判断 text[i] == (v1 - 39 - key[v3 % v5] + 97) % 26 + 97; 即可
则>>>strlen(text)的长度为外层循环【 因为是对text[i]的爆破 】
内层循环就是v1的取值返回。
v1的范围已知的哦!(第三遍了好像。。。哈哈哈)
第一步:大写->小写
python的.lower()直接就转了。靠了, 还是python简单。
第二步:求爆破求v1的值。
简单点直接取整个ASCII码表再进行细分【先粗后细】
细:v1的范围是 A~Z a~z (正向分析 得来的。)
###不过注意点 C中 不能写成 A<=v1<=Z || a<=v1<=z 这种格式!!不可以! 原因好像是二元啥的 忘了。。
欧克 flag{v1};