前言:学习笔记
常规思路:下载 解压 查壳
64>>>64IDAPro打开
常规思路:先查找字符串在进入main函数。
东点点 西看看 先了解大致的内容
通过对字符串的东点点 西看看 【肯定是进去过patch_me()的】
再结合main()中 并没有什么有用的东西,可以判断,关键信息在patch_me中。
>>>进入看看。
发现如下
简单的分析 程序逻辑:
观察发现,case1 是我们想要的
case2 case3 是输出一句话 没什么作用
case4 看起来像是对f2进行赋值【此处s是局部变量 >>> 拼接 f2<s】
case5 循环8次。 if ( %2 = 1)执行>>> f2[j] -= 2; else 执行>>> f2[j+1] (自增) 【对f2的处理】
default 不管不重要 =。=
思路:
发现:有用的case只有 1 4 5
把case1作为切入点。【因为我们想得到flag【s】】 case1中 s等于 f1 + f2 (f1已知。) f2(未知)
关键就是求f2。
>>>而f2在case4 和case5 中有操作。 【case4是赋值(strcpy、strcat)、case5是某种算法】
case4 >>> 赋值 >>> f2 []= {0x69,0x36,0x75,0x67,0x60,0x6F,0x66,0x7F,0【结尾】};
【为什么这么写?>>>你把rbp+s 当作address # +1 +2...看作offset >>address+offset->数组寻址】
case5>>> 变形>>>对原f2的值进行处理。
猜测程序完整执行顺序应该是,先进行case 4 再进行case 5 最后执行 case 1。
直接还原该过程。(照抄就行了。)