Reversing.kr Position分析题解
Posted 我是小张同学啊
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Reversing.kr Position分析题解相关的知识,希望对你有一定的参考价值。
先看下程序界面和要求:
76876-77776是固定的数值,要求在空白处输入相应的
字符。要求字符数4个,且最后一个为p。答案不唯一。
1,首先我们查下壳,没有加壳,c++写的程序.
2,使用IDA查看下,
很多这样的函数,让人没有头绪。
3,再使用OD查看下,地址并不是常见的。我们查看下是否有反调试之类的函数。
最常见的函数isdebugerPresen.按下ctrl+N,输入函数
还真有这个函数,使用d fs:[30]+2 使0修改为1,然而并没有什么用。
4,寻找到获取输入的位置,常见的函数getdlgitemtextA(w),同样没有找到。
仔细在程序中找一张,发现了这段代码。这以下的好像是关键的判断部分。在IDA中看下它的流程框图。
5,对代码进行分析。
首先对输入的长度进行了判断,长度为4,不符合即结束。
对输入的字符进行判断,要在a--z之间,且4个字符中不能有一样的。
接下来就进入到了数据处理部分。仔细观察下面的程序,主要是对AL,BL,CL,DL进行操作,将其放入相应的推栈位置中取出比较。
不难发现在这段程序中有10个跳转,相对应的7 6 8 7 6 7 7 7 7 6这10个数据,每个跳转对应一次比较。
。。。
比较的值又是什么呢,来看一下。这里以第一次和第二次为例。
看cmp ax,di ,不用想di的值就是7(给定序列中的第一个,因为第一次比较),重点就是ax的值哪里来的。call函数的大概作用就是把ecx的值赋给ax。ecx的值就要看add ecx,edx 指令了。ecx来自bl,而edx来自ebp--0x20.而这所有的赋值都要往上看,
这里不再具体分析指令的意义。
判断的依据就是从堆栈中取出相应的数据复制给相应的寄存器,寄存器相加赋值给ax,ax再和di(给定序列中的值)
比较。其实这只是前部分,前部分是两个字符,后部分也是两个字符,对字符的处理也是一样。每部分对数据都会有一次处理。具体可以查看程序分析。下面给出相应的对应关系。
前部分:
这里输入的数据用数组表示a[4];a[0]表示第一个数据。
堆栈 地址 所对应的数据用堆栈的偏移表示
ebp-0x20 e580 20(偏移量)
ebp-0x1d e583 1d
ebp-0x25 e578 25
ebp-0x24 e57c 24
ebp-0x1f e581 1f
ebp-0x1e e582 1e
ebp-0x28 e590 28
ebp-0x1c e584 1c
ebp-0x27 e579 27
和序列对应关系
20(上面的偏移量)+bl(最先开始的一次判断,没有使用堆栈,分析程序可以得出)=7
1d+25=6
24+1f=8
28+1e=7
1c+27=6
每个寄存器中值运算来源
20 (偏移量)(ebp-0x20)= (a[0] and 1)+5
1c=a[0]>>4 and 1+5
1f=a[0]>>1and 1+5
1e=a[0]>>2and 1+5
1d=a[0]>>3and 1+5
28=a[1]and 1+1
24=a[1]>>4and 1+1
27=a[1]>>1and 1+1
25=a[1]>>3and 1+1
bl=a[1]>>2and 1+1
以上是第一部分的信息,有不懂的需要分析程序。
下面是第二部分的信息。
这里输入的数据用数组表示a[4];a[0]表示第一个数据。
堆栈 地址 所对应的数据用堆栈的偏移表示
ebp-0x20 e580 20(偏移量)
ebp-0x1d e583 1d
ebp-0x25 e578 25
ebp-0x24 e57c 24
ebp-0x1f e581 1f
ebp-0x1e e582 1e
ebp-0x28 e590 28
ebp-0x1c e584 1c
ebp-0x27 e579 27
和序列对应关系
20(上面的偏移量)+bl(最先开始的一次判断,没有使用堆栈,分析程序可以得出)=7
1d+25=7
24+1f=7
28+1e=7
1c+27=6
每个寄存器中值得来源
20 (偏移量)(ebp-0x20)= (a[2] and 1)+5
1c=a[2]>>4 and 1+5
1f=a[2]>>1and 1+5
1e=a[2]>>2and 1+5
1d=a[2]>>3and 1+5
28=a[3]and 1+1
24=a[3]>>4and 1+1
27=a[3]>>1and 1+1
25=a[3]>>3and 1+1
bl=a[3]>>2and 1+1
对于以上代码我们写一个python小脚本
代码如下:
ch=[]
for a in range(97,123):
ch.append(a)
print ch
for i in ch:
for j in ch:
if(((i&1)+5)+((j>>2&1)+1)==7)and(((i>>3&1)+5)+((j>>3&1)+1)==6)and(((j>>4&1)+1)+((i>>1&1)+5)==8)and(((j&1)+1)+((i>>2&1)+5)==7)and(((i>>4&1)+5)+((j>>1&1)+1)==6):
print chr(i),chr(j)
print"-------"
for i in ch:
j=112
if(((i&1)+5)+((j>>2&1)+1)==7)and(((i>>3&1)+5)+((j>>3&1)+1)==7)and(((j>>4&1)+1)+((i>>1&1)+5)==7)and(((j&1)+1)+((i>>2&1)+5)==7)and(((i>>4&1)+5)+((j>>1&1)+1)==6):
print chr(i),chr(j)
结果如下:
答案分别为:
bump
cqmp
ftmp
gpmp(不符合要求,因为程序中规定了不允许有重复的字符出现)
以上是关于Reversing.kr Position分析题解的主要内容,如果未能解决你的问题,请参考以下文章
reversing.kr replace 之write up
[Reversing.kr] Easy_KeygenMe Writeup