初世纪

upload successful

输入不正确就会出现这个弹窗

ida打开程序

定位WinMain函数

upload successful

找到DialogBoxParam的回调函数

upload successful

函数原型:
    int DialogBoxParam(HINSTANCE hInstance,LPCTSTR IpTemplateName,HWND hWndParent, DLGPROC IPDialogFunc,LPARAM dwlnitParam);
参数:
hlnstance       标识一个模块的实例,该模块的可执行文件含有对话框模板。
IpTemplateName  标识对话框模板。此参数可以指向一个以NULL结尾的字符串的指针,该字符串指定对话框模扳名,或是指定对话框模板的资源标识符的一个整型值。如果此参数指定了一个资源标识符,则它的高位字一定为零,且低位字一定含有标识符。一定用MAKEINTRESOURCE宏指令创建此值。
hWndParent      指定拥有对话框的窗口。
IpDialogFunc    指向对话框过程的指针。
dwInitParam     指定传递到对话框过程中的 WM_INITDIALOG 消息 IParam 参数的值。
返回值 如果函数调用成功则返回值为在对函数EndDialog的调用中的nResult参数,该EndDialog函数用于中止对话框。如果函数调用失败,则返回值为-1。
F5大法定位关键代码

upload successful

upload successful

函数功能:该函数获取对话框中与控制有关的文本或标题。
函数原型
    UINT GetDlgltemText(HWND hDlg,int nlDDlltem,LPTSTR IpString int nMazCount);
参数
    hDlg       指向含有控制的对话框的句柄。
    nlDDlgltem 指定标题或文本将被检索的控制的标识符。
    IpString   指向获取标题或文本的缓冲器的指针。
    nMaxCount  指定被复制到lpString参数指向的缓冲区的字符串的最大长度。如果字符串的字符最大长度超过范围,则该字符串被截断。
返回值 如果函数调用成功,则返回值表示被复制缓冲区的字符串的长度,不包括以NULL结尾的字符串。如果函数调用失败,则返回值为零。若想获得更多错误信息,请调用GetLastError函数。

得到注册码为6Ewi9H

验证

upload successful


Exam

upload successful

OD调试之

upload successful

通过字符串找到关键点

upload successful

可以看出来一些流程,输入字符串,得到长度,然后判断是否在10~30之间,将字符串copy到另外一个地方,比较字符串的第八个位置是否为’A’。

upload successful

进入此函数

upload successful

该函数的逻辑是:将输入的第七个字符串换成’#’,字符串的每位都与0x1F进行xor运算。然后下面没有思路了

IDA查看之

upload successful

找到字符串(将字符串复制到的地址)的交叉引用,挨个扫一眼

upload successful

可以看到这一个函数

upload successful

找到该函数的交叉引用

upload successful

可以看到第二个参数就是’invalid argument’

upload successful

关键比较处,a2就是’invalid argument’ ^ 28后的结果,dword_2F3088就是我们输入字符串复制到的地址

在关键部分下断点,可以得到比较的字符串

upload successful

到此,程序整体逻辑也就明了了,输入字符串,判断第八位是否为A,将第八位换成#,整体字符在与 0x1f 异或,得到的字符 和 ‘invalid argument’与28异或后的结果相比较

脚本

In [1]: flag = "invalid argument"
In [2]: temp = ''
In [3]: for i in range(0,len(flag)):
   ...:     temp += chr(ord(flag[i]) ^ 28)
In [4]: temp
Out[4]: 'urj}pux<}n{iqyrh'
In [5]: for i in range(0,len(temp)):
   ...:     flag += chr(ord(temp[i]) ^ 0x1f)
In [6]: flag = ''
In [7]: for i in range(0,len(temp)):
   ...:     flag += chr(ord(temp[i]) ^ 0x1f)
In [8]: flag
Out[8]: 'jmubojg#bqdvnfmw'
# 最后将#换成'A'即可

验证

upload successful

总结

KCTF的题目质量是真的好,准备把这几年的比赛题目都拿来做做,学习学习,还是有很多姿势的。。。。



本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!