avatar

漏洞测试作业三:OLLYDBG软件破解
  • ollydbg使用入门

题目一

image-20200317210716065

代码:

#include <iostream>
using namespace std;
# define password "12345678"
bool verifyPwd(char* pwd)
{
int flag;
flag = strcmp(password,pwd);
return flag==0;
}
void main()
{
bool bFlag;
char pwd[1024];
printf("please input password:");
while(1)
{
scanf("%s",pwd);
bFlag=verifyPwd(pwd);
if(bFlag)
{
printf("passed\n");
break;
}else
{
printf("wrong password, please input again:\n");
}
}
}

使用debug模式运行,拿到exe文件

image-20200317211748248

用ollydbg打开,单步执行

image-20200317212052362

单步调试,找到主函数

image-20200317213521238

F7步入

image-20200317213828732

跳转至主函数

image-20200317213922692

输入

image-20200317214105272

找到verifyPwd函数

image-20200317214352472

image-20200317214414725

跳转到verifyPwd函数

image-20200320171345288

在学习的过程中,使用vc6查看已经划分好的反汇编代码

其中框出的部分为调用verifyPwd函数并将返回值赋给bFlag的代码

image-20200323090432718
反汇编代码 作用
lea edx,[ebp-404h] [enp-404]中存储的是输入的字符串
push edx 字符串地址入栈
call @ILT+15(verifyPwd) (00401014) 函数跳转
add esp,4 将函数调用前push的edx值弹出
mov byte ptr [ebp-4],al 将函数返回值赋给bFlag

题目二

image-20200323092641646
  • flag==0,即输入字符串为“12345678”

  • 跳转进入函数

    image-20200323093632694
  • 进入strcmp

    image-20200323093749719![image-20200323105229337](/images/漏测作业/漏测作业三/image-20200323105229337.png> image-20200323105229337

  • verifyPwd函数:
地址 汇编代码 注释 寄存器
00401030 push ebp ; 2_1_1.verifyPwd(void)
00401031 mov ebp,esp
00401033 sub esp,44
00401036 push ebx
00401037 push esi
00401038 push edi
00401039 lea edi,[ebp-44]
0040103C mov ecx,11
00401041 mov eax,CCCCCCCC
00401046 rep stos dword ptr [edi]
00401048 mov eax,dword ptr [ebp+8]
0040104B push eax
0040104C push offset 0043101C ; ASCII “12345678”
00401051 call strcmp ; [strcmp 调用函数
00401056 add esp,8 eax=0(strcmp函数返回值)
00401059 mov dword ptr [ebp-4],eax 将寄存器eax的值写入内存
0040105C xor eax,eax eax清零
0040105E cmp dword ptr [ebp-4],0 flag==0 返回值与0进行比较
00401062 sete al 设置al,如果相等则设置
00401065 pop edi eax=1,即verifyPwd返回值为1
00401066 pop esi
00401067 pop ebx
00401068 add esp,44
0040106B cmp ebp,esp
0040106D call _chkesp
00401072 mov esp,ebp
00401074 pop ebp
00401075 retn
  • strcmp函数
    地址 汇编代码 注释 寄存器
    00408220 mov edx,dword ptr [esp+4] ; ASCII “12345678”(原密码)
    00408224 mov ecx,dword ptr [esp+8] ; ASCII “12345678”(用户输入部分)
    00408228 test edx,00000003
    0040822E jnz short 0040826C
    00408230 mov eax,dword ptr [edx] eax=34333231(对应密码前四位,小端存储)image-20200323113424926
    00408232 cmp al,byte ptr [ecx] al与[ecx]第一位比较,相等 al=31
    00408234 jne short 00408264 不跳转
    00408236 or al,al al不为0
    00408238 jz short 00408260 不跳转
    0040823A cmp ah,byte ptr [ecx+1] ah=32
    0040823D jne short 00408264 不跳转
    0040823F or ah,ah
    00408241 jz short 00408260 不跳转
    00408243 shr eax,10 eax右移16位 eax=00003433
    00408246 cmp al,byte ptr [ecx+2] al=33
    00408249 jne short 00408264
    0040824B or al,al
    0040824D jz short 00408260
    0040824F cmp ah,byte ptr [ecx+3] ah=34
    00408252 jne short 00408264
    00408254 add ecx,4 访问后四位数据 ecx=38373635
    00408257 add edx,4 edx=38373635
    0040825A or ah,ah ah=34
    0040825C jnz short 00408230 or结果不为0,跳转至该表第五行,eax被赋值为38373635
    0040825E mov edi,edi
    00408260 xor eax,eax 所有判断均相等 eax=0
    00408262 retn f返回

题目三

image-20200323120545862

方法一

找到跳转语句

image-20200323121253239

修改

image-20200323121336341

跳转成功

image-20200323121457054

方法二

找到返回值设置代码

image-20200323121849837

更改为“返回1”

image-20200323122009122

继续运行,返回eax=1

跳转成功并输出passed

image-20200323122711537
Author: Michelle19l
Link: https://gitee.com/michelle19l/michelle19l/2020/03/23/漏测作业/漏测作业三/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Donate
  • 微信
    微信
  • 支付寶
    支付寶