18.10.8 实验吧----迷路
伴随着悠扬的歌声,我们打开这个exe
反正我看到标题我怀疑是maze迷宫类型的题目
靠字符串定位(you win)
但是找到主要段之后,因为sp不平衡要手动平衡栈,如下
我自己是靠patchbytes才成功的,要是同样有需要patchbytes,但不知道机器码这里有个链接:https://blog.****.net/qq_42192672/article/details/82964838
然后这题目最坑的地方我实在OD中发现的
我真的XXXX,原来迷路是这个意思,把一个按钮隐藏了,那我原先那块分析他干嘛(出题人不可能藏个错的吧……)
od里ctrl+g搜索ShowWindow下断
这个下断过程其实还蛮纠结的,给你们细细说一下我怎么做的,先是下断,跳转到了ShoeWindow内部,然后单步执行回代码段,会发现停在call ShowWindow代码的下一句,然后回调断点,重新运行就好啦,如下图
我们可以右下角在栈中看见这个按钮是被隐藏的(SW_HIDE),看来运气比较好,直接找了被隐藏的,不用重新找了,把00000000改成00000001就可以把按钮显示出来了,我自己是直接用resource_hacker改按钮属性的,如下
好了好了,刚开始可以分析,其实关键就是要找出关键函数对应的地址,然后去IDA里面接着分析,真是心累,但是我更改了按钮的属性之后就会直接卡死,谁来救救我
但也没办法,只能继续做,在GetWindowTextA处下断,od里逐步跟,有个函数很关键,如下
我们先说一下我是怎么定位到这个函数的吧,我们可以看到401F47(错误提示的地方)设置内存访问断点来定位,毕竟判断是否正确的不太容易找,但是判断失败还是容易的
定位之后我们在IDA里看一下这个函数的判断方式
看出来是个格式判断,重要的信息就是的flag的格式,继续看吧,不明白……我们换成这种格式重新运行一边
这里我把401F9D的语句先nop掉了,为了观察下面两个函数要干嘛,后来发现这两个函数都用到了我们传入的参数,宁可杀错不可放过,在IDA里面都观察一下
先是第一个,如下
emmmm,好像不是我们可以揣测的
第二个,如下
我们可以看到传参函数(401740)和401860传入的参数一样,不难看出该函数是对传入的字符串进行一种改变,到时候再回来看
继续单步执行,总中找到变形之后的字符串(正确的值),逆着推回去
逆的方法就在函数401860中,写脚本
key=['b','5','h','7','6','0','h','6','4','R','8','6','7','6','1','8','b','B','w','B','4','8','B','r','W','9','2','H','4','w','5','r']
v8=0
v6=28
v5=5 #3/5
flag=''
for i in range(len(key)):
if 48<=ord(key[i]) and ord(key[i])<=57:
flag+=key[i]
continue
elif 65<=ord(key[i]) and ord(key[i])<=90:
num=ord(key[i])-65
for j in range(0,26):
if ((v6+5*j)%26==num):
flag+=chr(j+65)
break
elif 122>=ord(key[i])and ord(key[i])>=97:
num=ord(key[i])-97
for j in range(0,26):
if ((v6+5*j)%26==num):
flag+=chr(j+97)
break
print('OOCTF{'+flag+'}')