CTF题库>实验吧>该题不简单 (无语了,想给你们制造点悬念都没有了,哎!直接去做题吧)

打开链接
在这里插入图片描述
并且下载压缩包解压
题目要求找到 用户名为hello 的注册码
我们运行题目 看到
在这里插入图片描述
会一直提示错误
其实在ollydbg里面可以看到的
在这里插入图片描述
但是这道题还是静态分析吧 !!!
在IDA里根据 CrackeMe 2011 # 2
可以搜索字符串找到他=它
在这里插入图片描述
点进去之后 发现这个函数 sub_4011D0
在这里插入图片描述
F5反编译得到
在这里插入图片描述

GetDlgItemText函数里面的4个参数:

第一个是句柄 API都得通过句柄操作,如果在MFC中,本项可以不写,默认为this
第二个为ID,即你想要得到那个控件的ID
第三个为TEXT值, 你得先定义一个字符串用来获取该值
第四个为文本最大长度
函数功能:该函数获取对话框中与控制有关的文本或标题。

函数原型:UINT GetDlgltemText(HWND hDlg,int nlDDlltem,LPTSTR IpString int nMazCount);
这个函数主要是读取 hello 这个传入的用户名 

上面的都不太重要主要下面的
lstrcat是函数功能:该函数将字符串lpString2附加在另一个字符串lpString1后面。

strcpy,即string copy(字符串复制)的缩写。
strcpy是一种C语言的标准库函数,strcpy把含有’\0’结束符的字符串复制到另一个地址空间,返回值的类型为char
*

知道了函数大致意思 接着分析题目

在这里插入图片描述
通过分析可以知道 , 这段代码会将用户输入的用户名的每个字符遍历一遍把每个字符的序号(从 0 开始算)与这个字符的ASCII码的平方相乘 , 然后整体再加上序号 , 得到的和继续对 0x42 求余 , 最后将结果加上 33 , 然后再转为ASCII码然后再将上述结果连接在字符串 ‘Happy@’ 之后构成注册码

那么我们编写脚本完成

在这里插入图片描述
运行得到
在这里插入图片描述

username = "Hello"
counter = 0;
password = "Happy@"
for i in username:
    password = password + chr((counter + counter * ord(i) * ord(i)) % 0x42 + 33)
    counter = counter + 1
print(password)

提交发现正确
在这里插入图片描述
之后提交即可哈哈哈哈哈
在这里插入图片描述

发布了218 篇原创文章 · 获赞 309 · 访问量 29万+

猜你喜欢

转载自blog.csdn.net/qq_42777804/article/details/100053120