首页
社区
课程
招聘
[原创]安恒2020 KCTF春季赛1 签到题
发表于: 2020-7-28 17:01 4958

[原创]安恒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直播授课

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//