某校内CTF比赛逆向四道题的分析
本帖最后由 mortalboold 于 2017-5-9 18:59 编辑一:签到题0x01:运行程序,显示flag就在这儿,直接IDA打开,进入main函数F5查看伪代码。
0x02:看到一串奇怪的字符串,并且v10和这段字符串有操作,后面if语句有v10,我们试着将这个字符串输入程序中运行,出现如下结果。
0x03:说明这串字符串就是正确的输入,然后根据字符串的特征可以看出是base64加密的。随便百度一个base64在线解密,顺利解出flag。
二:easycrack:
0x01:运行程序,please input the right ans,将程序拖到ida里。F5查看伪代码,有很多奇怪的函数,通过OD,IDA动静结合分析一下一些函数的用法。
0X02: 通过OD,可以看到其中的sub_4011ea和sub_401064,相当于printf和scanf函数,在IDA中按N修改名字。然后先随便一组数据。
0x03 根据OD观察内存变化,可以知道var_9c保存的是输入的值,然后后面的sub_4011BD看返回值eax中值可以看出这个函数求输入的长度,
var_a0里保存长度,将var_9c改名为input,A0改名为l。
0x04 然后var_74置0,后面比较var_74和输入的长度,大于(jge)等于就跳转到右边,否则进入左边。
左边的算法不是很清楚是什么操作,百度了一下,是对2去模的优化代码,(详细请看blog.csdn.net/qq276592716/article/details/6971781)。
0x04:根据前面的优化代码,确定如果var_74是奇数就跳转到右边的操作,否则进入左边。左边有对var_78与5比较,小于等于才会进入左边的流程,否则就退出了
。
0x05 因为现在var_74的值是0,所以我们先看左边的操作,通过OD。观察返回值(eax)值得变化,
可知道sub_401136是取字符串的操作,改名为getstring
0x06 ,继续往下看,接着是是getstring函数取var_8c的字符串,通过OD观察eax的可以看到取出的值是mortal,所以var_8c='mortal';
0x07:通过上面的分析左边的流程注释如下
接下来看流程图可知是,var_78++;var_74++,然后跳转到var_74和长度的比较,继续循环。
0x08:再分析右边的流程。因为左边已经把函数的功能分析完成,所以右边直接可以得出来,是将input的奇数位的数与3异或。
0x09;根据上面的分析,可以写出对input进行操作的伪代码i=0
x=0
str='mortal'
l=len(input)
for(i=0;i<len;i++)
{ if(i%2)
{ input=input^3}
else{
f(x>5)
break;
input=input^str
x++}}
0x0A:接下来就是看最后的比较了。首先var_74置0,与长度比较,大于就跳出循环,否则长度与25比较,不相等退出循环,根据这里能退出输入的长度为25位
0x0b 接下来就是讲input[0]与var_70做比较,相同就继续循环,var_74++;不等就把var_7c置0,跳出循环。
往上翻,可以看到var70到var_10有长度为25位的数据,正好与输入位数相同,所以判断是比较的字符串。
0x0c :写出逆算法成功解出flag
三crackme0x01 这是一道安卓逆向,直接祭出神器JEB反编译查看源码。0x02 :找到mainactivety ,然后按TAB键直接反编译出JAVA代码
0x03:逻辑很简单,就是输入的奇数位与sincnuisasher异或,然后奇偶位交换,后与V2的值比较
0x03:把代码直接复制到eclipse里,然后把算法反过来,先交换,再异或,然后将其中没有声明的变量声明一下,运行,直接跑出flag.
四:way0x01 od,ida载入程序
0x02 和第二题一样,继续用OD找出其中奇怪的函数的作用。 一样的首先找出了printf(40120d),和scanf(401064)函数,
在IDA中改名,然后随便输入1234567890,继续在OD里面单步(F8)跟
.
0x03 根据返回值,可以判断4011fe是算输入的长度,然后送入var_38
。
然后401145根据返回值可以知道也是个getstring。Var_2c保存的输入的值,改名为input
0x04然后在IDA直接f5看伪代码
发现只有四个if比较,就可以确认输入只能为0123之中的数字。0x05 在后面可以看到,v8是一个标志位,如果为真的话,就输入正确,在v8初始化时0,所以看哪些地方能改变v8的值,使其是个非0值。
0x06:在伪代码中,可以看出当getstring(v10)==“X”时,能使的v8为1,再根据汇编代码和OD单步跟,可以发现这个比较里,getstring是返回var_1c的值,
而var_1c=‘C*......*...****.*.****...*....*.*..**********.*..*....*...*...**.****.*.*...****.*....*.*******..*.***..*.....*.*.." "***.**.***.*...****....*X..*’
V10相当于一个下标。所以getstring的返回值var_1c=”X”,的时候就是正确的时候。
0x07:v10初始化为0 ,而var_1c才是‘x’,所以要找到v10的变化方式,通过伪代码可以看到,
当输入为0时,v10=v10-16,input=1时,v10=v10+1;Input=2时,v10=v10+16,input=3时,v10=v10-1;但是如果var+1c==”*”就会退出循环,
v8还是为0。
0x08:这是可以将var_1c看成是9*16的一个矩阵地图,如图。每行16元素,输入0,相当于向上移,1等于右移,2代表向下移,3代表左移。
然后走到X的位置,路线为222122232211010011100333030011111211011211122332330332223221110011112233。
0x09 :IDA发现提示正确后,还让我们看的清楚一些,后面还有一些函数,点最后一个函数进去(前面两个点过去发现没有什么实际用处)。在OD中该函数的位置下断点,f9运行到此函数出,单步走。
0x0A:找到flag
打了这么多能加精吗,,,虽然很菜,哈哈。最后一张图不知道为什么传上来,,,在后面写的时候排版没问题啊,保存后就变得奇怪了,最后还莫名其妙多了一张图。
题目下载:http://pan.baidu.com/s/1skKjupR 研究一下 mortalboold 发表于 2017-5-9 22:26
IDA f5后那几个连着的if语句里,那些数字你用鼠标点在上面,按r,就会变成char型,其中48就是*
*不是十六进制的2A,十进制的42吗 排版为什么一直不对啊 多了一张奇怪的图片 可以呀 楼主66的 研究一下 楼主可以把题目链接放上去 题目是好题,排版看着真心累 看成cf的来这打卡 感谢楼主分享,研究一下。