输入密码程序的分析 ■分析: 用户提供的密码被放在buf仟缓冲区并与参照密码比 较,如果不匹配,那么,需要从用户那里再次请求提供密 码. ■第二次输入前不清除buff. 依次类推,到达接受Wrong password执行分支,使用 调试器,进行搜索,就会找到. 2022/11/8 Chen Kaiming Copyright 2007
2022/11/8 Chen Kaiming Copyright 2007 6 ■分析: 用户提供的密码被放在 buff 缓冲区 并与参照密码比 较,如果不匹配, 那么需要从用户那里再次请求提供密 码. ■第二次输入前不清除 buff. 依次类推, 到达接受Wrong password 执行分支, 使用 调试器, 进行搜索, 就会找到. 输入密码程序的分析
实验和验证 执行list1p7.exe 输入密码:chenkaiming ●00425A30 iob dd offset bufin ●00425A30 "chenkaiming \n\n" 00425A38 dd offset_bufin "chenkaiming\n\n" (00425A38不合题意,舍去) 2022/11/8 Chen Kaiming Copyright 2007 7
2022/11/8 Chen Kaiming Copyright 2007 7 实验和验证 执行 list1_p7.exe 输入密码: chenkaiming ⚫ 00425A30 _iob dd offset _bufin ⚫ 00425A30 "chenkaiming\n\n" ⚫ 00425A38 dd offset _bufin "chenkaiming\n\n" ( 00425A38 不合题意, 舍去)
■搜索立即数 0x00425A30得两处: 00401042 push offset_iob 00401047 push 64h /最大密码长度 00401049 lea eax,[ebp+var_68]/密码缓冲区指针 0040104C push eax 0040104D call fgets 00401052 add esp,OCh //弹出三个参数 00401055 push "myGOODpassword\n" 0040105A lea ecx,[ebp+var_68] 0040105D push ecx 0040105E call strcmp 00401063 add esp,8 00401066 test eax,eax 00401068 jz short loc_401079 0040106A push offset@;"Wrong password\n" 0040106F call printf 2022/11/8 Chen Kaiming Copyright 2007
2022/11/8 Chen Kaiming Copyright 2007 8 ■搜索立即数 0x00425A30 得两处: 00401042 push offset _iob 00401047 push 64h //最大密码长度 00401049 lea eax, [ebp+var_68] // 密码缓冲区指针 0040104C push eax 0040104D call fgets 00401052 add esp, 0Ch //弹出三个参数 00401055 push "myGOODpassword\n" 0040105A lea ecx, [ebp+var_68] 0040105D push ecx 0040105E call strcmp 00401063 add esp, 8 00401066 test eax, eax 00401068 jz short loc_401079 0040106A push offset@ ; "Wrong password\n" 0040106F call printf
方法2在密码输入函数上没置断点 void CCrackme_01Dlg::OnOk( { char buff[PASSWORD_SIZE]; CEdit m_password; m_password.GetWindowTextA(&buff[O] PASSWORD_SIZE); if(strcmp(&buff[O],PASSWORD)) { printf("Wrong Password"); m_password.SetSel(O,-1,0) return; } else printf("Password OK"): CDialog::OnOK(); } 2022/11/8 Chen Kaiming Copyright 2007
2022/11/8 Chen Kaiming Copyright 2007 9 方法2 在密码输入函数上设置断点 void CCrackme_01Dlg::OnOk() { char buff[PASSWORD_SIZE]; CEdit m_password; m_password.GetWindowTextA(&buff[0], PASSWORD_SIZE); if (strcmp(&buff[0], PASSWORD)) { printf("Wrong Password"); m_password.SetSel(0,-1,0); return; } else { printf("Password OK"); } CDialog::OnOK(); }
方法2在密码输入函数上没置断点 void CCrackme_01Dlg::OnOk( { char buff[PASSWORD_SIZE]: CEdit m_password; m_password.GetWindowTextA(&buff[O] PASSWORD_SIZE): if(strcmp(&buff[O],PASSWORD)) { printf("Wrong Password"); m_password.SetSel(0,-1,0): return; } else printf("Password OK"): CDialog::OnOK(); } 2022/11/8 Chen Kaiming Copyright 2007 10
2022/11/8 Chen Kaiming Copyright 2007 10 方法2 在密码输入函数上设置断点 void CCrackme_01Dlg::OnOk() { char buff[PASSWORD_SIZE]; CEdit m_password; m_password.GetWindowTextA(&buff[0], PASSWORD_SIZE); if (strcmp(&buff[0], PASSWORD)) { printf("Wrong Password"); m_password.SetSel(0,-1,0); return; } else { printf("Password OK"); } CDialog::OnOK(); }