buzhifou01 发表于 2019-12-1 19:59

“百度杯”十一月场 CrackMe01

本帖最后由 buzhifou01 于 2019-12-1 20:00 编辑

0x1破解详解
1查壳,发现无壳



2.首先用OD打开CrackMe01.exe发现终止,接着装反调式插件打开,运行的时候发现,需要输入flag,用ida打开
发现GetWindowTextW函数,该函数取文本框中内容。








3.在OD中对GetWindowTextW下断,接着f9,由于GetWindowTextW在多个地方调用,因此需要f9多次。在文本框中输入字符,输入123456789,点击click,发现没反应。





4.接着我们在ida的import窗口中查找突破函数,找到下面几个有价值的函数:
PostMessageW:用于将一条消息放入到消息队列中


SendMessageW:这两个函数将指定的消息发送到一个或多个窗口


GetMessageW:从调用线程的消息队列里取得一个消息并将其放于指定的结构


DefWindowProcW:为应用程序没有处理的任何窗口消息提供缺省的处理
5.在ida中查看调用PostMessageW的代码块,可以看到PostMessage函数各个参数的值,lParam是输入的个数,wParam是输入的内容。hWnd是接收消息的窗口句柄。









6.双击hWnd,查看引用情况,选中第二个进入,发现WNDCLASSEX 中最重要的成员lpfnWndProc右边有个sub_4027f0函数,进入这个函数




7.看到下面有一个非常重要的消息处理函数DefWindowProcW,往下看看到一个算法代码,一共两个循环,第一个循环累加输入字符串中每个字符的ASCII值+2*数组下标的值,第二个循环是让chText这个数组中的每个字符进行异或处理。




8.在往下可以看到一个if语句从判断条件可以看出计算后的v6为0x4B6。



9,接着可以看到以下代码,其中有函数DrawTextW,后面有把数组chText做为参数,那么这里就跟flag有着联系,当输入的flag正确时,会输出这个flag





10.所以得到flag的代码如下:
chText=

for i in range(0,22):
print chr(chText^0x4B6)


flag{ICHUNQIU_FE362DBE}

题目下载:链接:https://pan.baidu.com/s/1ao6KIX-L3d36T9lrJ3z6LA
提取码:55ay


Ginobili 发表于 2019-12-2 21:29

hbkccccc 发表于 2019-12-1 21:36
感谢楼主学习了

请问 if语句从判断条件可以看出计算后的v6为0x4B6 如何算出的

写个脚本运行一下逻辑算出来的吧

hbkccccc 发表于 2019-12-1 21:36

本帖最后由 hbkccccc 于 2019-12-1 21:46 编辑

感谢楼主学习了

请问 if语句从判断条件可以看出计算后的v6为0x4B6 如何算出的

幻狐boke 发表于 2019-12-1 20:14

谢谢LZ无私奉献

果果没有糖葫芦 发表于 2019-12-1 20:14

感谢楼主学习了{:1_887:}

NanKeYM 发表于 2019-12-1 20:19

打ctf的,前来进行学习{:1_927:}

cayne 发表于 2019-12-1 21:06

dlfeng 发表于 2019-12-1 22:51

大佬大佬!

越飞越远 发表于 2019-12-2 08:30

感觉自己是个文盲

小黑侠 发表于 2019-12-2 08:50

感谢楼主 学习了刚好在对这个有点疑惑

世界如此温柔 发表于 2019-12-2 08:59

感谢分享
页: [1] 2 3
查看完整版本: “百度杯”十一月场 CrackMe01