汇编语言学习(调试一个缓存溢出的程序)

原创 2004年07月18日 18:11:00

汇编语言学习(调试一个缓存溢出的程序)

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

最近在学习调试,downloadwinbg使用起来一头雾水,不得不开始学习汇编。下面是我的学习过程。

从微软那里downloadwindbg,好像是一个不错的工具(我还没深入,掌握了几个命令),有downloadSymbol

先花了一上午,把汇编出略看了一下,知道了什么是通用寄存器,什么时段寄存器,什么是lea,什么是stos等等。

接下来,从开始菜单,运行windbg,选择Open Executable…打开你要调试的程序。下图红圈表示汇编模式,不然的话源码文件也会被打开,这样的话函数调用的细节也可以看得很清楚。

 

 

 

中间是命令窗口,右上是调用栈,右下局部变量。

windbg调试,第一步当然要设置端点,需要使用bp命令。在命令窗口下面输入bp WinMain回车,bp foo回车。

   可以用bl命令列一下,看看有没有设置好。设置完成后输入g回车,程序开始运行直到断点。 

 

 

 

程序在WinMain的入口中断了。使用f10单步调试,

 

     

 

 

在调用foo之前有一个push eax,这是参数入栈,我向foo传递了一个字符串。

接着按f11跟踪进入函数。

 

 

      

 

      push ebp                      函数的返回地址入栈(我理解的是否正确)?

sub esp,0x4c                      给当前函数分配空间(为什么分配0x4c)?

mov ecx,0x13                      为什么只初始化0x13字节的空间?

mov eax,[ebp+0x8] ebp+0x8是传给foo的字符串地址。

Lea ecx,[ebp-0xc] [ebp-0xc]就是buf的首地址。

接下来,我们使用dd /c 1 esp看一下对栈内容

 

 

      

 

0012fedc存放的函数返回后的地址。(为什么比call stacks窗口中的值大四字节)

使用d ebp-0xc,保存的地址是0012fecc。这个地址strcpy函数要拷贝字符串的目的地址。

执行完strcpy后,我们在看一下对栈内容,dd /c 1 esp

晕到。

 

      

 

保存在对栈中的函数的返回地址,居然被改变了,这样黑客就可以通过改变这个地址来执行他想要执行的过程了,当然探索缓存溢出这个工作也不是很容易的。

 

下面是原码:

#include "stdafx.h"

 

void foo(const char* input)

{

    char buf[10];

 

    //Pass the user input straight to secure code public enemy #1.

    strcpy(buf, input);

 

}

 

void bar(void)

{

    ::MessageBox(NULL,"Hacked","hello",MB_OK);

}

 

int APIENTRY WinMain(HINSTANCE hInstance,

                     HINSTANCE hPrevInstance,

                     LPSTR     lpCmdLine,

                     int       nCmdShow)

{

      // TODO: Place code here.

 

       foo(lpCmdLine);

 

       return 0;

}

 

 

      push ebp                             函数的返回地址入栈(我理解的是否正确)?

sub esp,0x4c                      给当前函数分配空间(为什么分配0x4c)?

mov ecx,0x13                    为什么只初始化0x13字节的空间? 

0012fedc存放的函数返回后的地址。(为什么比call stacks窗口中的值大四字节)?

 

 以上我的几个问题希望高手告知。谢谢。

 

汇编语言学习(调试一个缓存溢出的程序)

汇编语言学习(调试一个缓存溢出的程序)   最近在学习调试,download了winbg使用起来一头雾水,不得不开始学习汇编。下面是我的学习过程。 从微软那里download了windbg,好像是一个...
  • bluecrest
  • bluecrest
  • 2004年07月18日 18:11
  • 2073

windbg+网线双机调试内核

最近要调试bluetooth,涉及到具体硬件因此不能用虚拟机和命名管道调试内核了,另外现在的PC追求轻便化,因此连串口都没了,不得不考虑使用网线调试。网上转了一圈发现了这篇:基于网络的内核调试   ...
  • lixiangminghate
  • lixiangminghate
  • 2016年06月29日 20:13
  • 4239

汇编语言学习体会

在没有学习汇编语言以前,我可能会对汇编这门强大而又难学的程序设计语言产生怀疑,因为现在我们有那么多的高级编程语言可以学习,尤其是现在日益强大的面向对象语言。而且每种语言都要比汇编语言学起来容易,而且开...
  • bitsjx
  • bitsjx
  • 2010年06月11日 20:53
  • 6285

汇编语言简单小程序——运算类编程实验

运算类编程实验   欢迎大家阅读我的博客,如果有错误请指正,有问题请提问,我会尽我全力改正错误回答问题。在此谢谢大家。 实验目的 (1)掌握使用运算类指令及调试方法 (2)掌握运算类指令对各状态标...
  • qq923132714
  • qq923132714
  • 2017年11月28日 13:58
  • 271

使用Windbg调试.Net应用程序

1. 解决线上.NET应用程序的如下问题: 崩溃CPU高程序异常程序Hang死 2. 安装WinDbg: http://msdn.microsoft.com/en-us/windows/ha...
  • kntao
  • kntao
  • 2011年12月20日 11:55
  • 7631

Windbg调试----Windbg入门

Windbg简单来说就是一个Windows下对用户态/内核态的程序进行调试,以及对Core Dump文件的分析。对于Crash,资源泄露,死锁等问题的分析,Windbg是一个强有力的利器。相关资料本人...
  • CJF_iceKing
  • CJF_iceKing
  • 2016年08月05日 13:26
  • 4400

王爽《汇编语言》实验10.2——解决除法溢出的问题

王爽《汇编语言》实验10.2——解决除法溢出的问题 被除数位dword型,除数为word型, 结果为dword型。...
  • mp4spig
  • mp4spig
  • 2016年08月08日 00:48
  • 1152

一个简单的溢出程序解析

下面是一段包含缓冲区溢出的代码: #include using namespace std; void attacker() { cout...
  • caterpillarous
  • caterpillarous
  • 2015年11月30日 20:49
  • 1036

windbg调试服务程序

相比通过输出日志来跟踪程序运行状态,我更倾向使用调试器。虽然我早知调试服务很麻烦,总不会比调试驱动还麻烦吧?基于这个想法,我尝试了在win7上使用windbg调试服务并记录于此。     window...
  • lixiangminghate
  • lixiangminghate
  • 2016年12月28日 15:57
  • 1421

windbg调试实例(3)——崩溃蓝屏之内核堆栈溢出

windbg调试实例(3)——崩溃蓝屏之内核堆栈溢出 1、崩溃发生背景 一个系统内核驱动程序运行过程中导致蓝屏。 2、提取dump文件 a) Dump可用前提:崩溃存储为核心内存存储,该项设置...
  • chenchong_219
  • chenchong_219
  • 2012年12月23日 11:27
  • 3841
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:汇编语言学习(调试一个缓存溢出的程序)
举报原因:
原因补充:

(最多只允许输入30个字)