“百度杯”十一月场 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
hbkccccc 发表于 2019-12-1 21:36
感谢楼主学习了
请问 if语句从判断条件可以看出计算后的v6为0x4B6 如何算出的
写个脚本运行一下逻辑算出来的吧 本帖最后由 hbkccccc 于 2019-12-1 21:46 编辑
感谢楼主学习了
请问 if语句从判断条件可以看出计算后的v6为0x4B6 如何算出的 谢谢LZ无私奉献 感谢楼主学习了{:1_887:} 打ctf的,前来进行学习{:1_927:} 大佬大佬! 感觉自己是个文盲 感谢楼主 学习了刚好在对这个有点疑惑 感谢分享