2017WHCTF - CRACKME

换个博客地址,换一片心情,换一片领域

这个题本质上没有太大难度,逆向的基本思路:从错误的提示中去寻找注册码的判断地方,反向追溯


错误提示:哎,注册码错了,你得换个新的呦!

这里有个小问题是,错误提示不是硬编码存在程序之中,而是在函数004016A0里通过异或生成的

怎么看出来的呢?

任意输入注册码,停在这个函数这里,发现堆栈里的数据是这些

2017WHCTF - CRACKME_第1张图片

这些都是硬编码,然后异或出来,就是输出的错误提示


说明:输入了错误的注册码!废话!重点是:程序在这之前已经判断过了这个注册码是否为正确的,需要找到判断的条件和跳转地址

2017WHCTF - CRACKME_第2张图片

最重要的是调用地址:00401701,00401741。说明呢,在这两个地方调用了错误提示函数,去找这里就好


在00401701和00401741的最前面下断,发现停在了这里

2017WHCTF - CRACKME_第3张图片

找到00401621,函数框架是这样的

2017WHCTF - CRACKME_第4张图片

看到这里,很明显就是判断的地方了:4015F7的判断0x21是字符串长度,那么401630是关键函数!


打开IDA看看401630:

2017WHCTF - CRACKME_第5张图片

v5+=10,while(v5<330),说明长度是33(也就是0x21)

srand(v4),随机化,可是,这里的v4是个常数,是个伪随机,意思就是说,这里的v4=rand()%10,每次程序跑起来都是固定的值,那么我们只需要输入一个错误代码,然后每次跟踪这里的正确值匹配就好了

输入一个abcdefghijklmnopqrstuvwxyz1234567就可以得到答案

2017WHCTF - CRACKME_第6张图片

看到这里的40166D,判断条件是je,说明输入的值需要相等,那么我们在调试的时候改成jmp

2017WHCTF - CRACKME_第7张图片

一次一次的找到正确的值就行

2017WHCTF - CRACKME_第8张图片2017WHCTF - CRACKME_第9张图片

前面很明显abcde是对应到flag{

最终的答案是:

flag{The-Y3ll0w-turb4ns-Upri$ing}

输入进去就得分了咯


然后回到401663这里,这里的ecx很明显就是计数器了,cl是我们的输入每一位

随机值是一个数组的偏移,加上基址是从这个里面找到的

2017WHCTF - CRACKME_第10张图片

你可能感兴趣的:(CTF比赛题,Reverse)