-
-
[原创]安恒2020 KCTF春季赛1 签到题
-
发表于: 2020-7-28 17:01 4958
-
一、打开程序
输入aaaaa,显示MessageBox
二、查询字符串
1.View->Open subviews->Strings查询字符串
其中包含good!right!字样,双击进去,可知在函数sub_401750中调用
2.打开函数sub_401750
该函数中的goog!right!字样仅用于MessageBoxA显示窗口用
推测某函数输入密码后,调用该函数显示MessageBox
3.查看函数调用
View->Open subviews->Function calls查看函数调用
可知在00401A3B处被调用
三、分析调用位置代码
查询调用位置代码,在调用位置之前便是逻辑判断是否显示good,right的部分
CWnd::GetWindowTextA(CString &)是获取窗口标题,不用管它
CString::GetBuffer(int)是获取字符串缓冲区指针,即输入字符串
1.获取字符串指针
mov [ebp+Str], eax mov edx, [ebp+Str]
最后edx保存输入字符串指针,在OllyDBG中EDX=00B92380,指向数据区域的输入ddddd(调试时输入的密码是ddddd)
2.把字符串转换成整型数
atoi (表示 ascii to integer)是把字符串转换成整型数的一个函数
push edx ;首先将edx(Str)入栈 call ds:atoi ;然后调用atoi add esp, 4 ;调用结束后平衡堆栈 mov [ebp+var_20], eax ;保存转化后的整数eax mov eax, [ebp+var_20]
3.计算逻辑判断
sub eax, edx ;OllyDBG调试时,EDX=0 sar eax, 1 ;eax算术右移1位,即eax=eax/2 cmp eax, 50h ;比较eax与0x50h(80)
四、综上所述
输入字符串记为Str
若atoi(Str)/2==80
则输出goog,right
易得160和161是解
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
看原图
赞赏
雪币:
留言: