小伙伴们对我上一篇文章的反应彻底出乎了个人意料,感谢你们对个人支持和承认。接下来我会精心的把这一系列课程设计好,尽可能详细的展现给你们。上篇文章我列举了一个缓冲区溢出的小例子,并提到了dev c++、ollydbg、IDA Freeware这三款软件,并介绍了dev c++的基本用法。今天会补充一下Dev c++的用法。html
今天补充的用法主要是为了之后编写shellcode作准备,这篇文章只讲用法,你们没必要深究代码的功能。c++
下面给你们一个在dev下用汇编代码编译的MessageBox的的代码例子,能够弹出一个提示框,今天仍是不讲代码,主要讲代码是如何编译的。shell
#include<windows.h> int main() { LoadLibrary("user32.dll"); __asm__("push 0x00000001"); //MessageBoxA的最后一个参数 入栈 __asm__("mov byte ptr [ebp+0x26],0x57"); //W __asm__("mov byte ptr [ebp+0x27],0x61"); //a __asm__("mov byte ptr [ebp+0x28],0x72"); //r __asm__("mov byte ptr [ebp+0x29],0x6e"); //n __asm__("mov byte ptr [ebp+0x2a],0x69"); //i __asm__("mov byte ptr [ebp+0x2b],0x6e"); //n __asm__("mov byte ptr [ebp+0x2c],0x67"); //g __asm__("mov byte ptr [ebp+0x2d],0x00"); //表示字符截断,就是说代码截止 __asm__("lea eax,[ebp+0x26]"); //把存储字符的起始地址赋给寄存器eax __asm__("push eax"); //把第三个参数入栈也就是标题 __asm__("mov byte ptr [ebp+0x2e],0x61"); __asm__("mov byte ptr [ebp+0x2f],0x62"); __asm__("mov byte ptr [ebp+0x30],0x63"); __asm__("mov byte ptr [ebp+0x31],0x64"); __asm__("lea eax,[ebp+0x2e]"); __asm__("push eax"); //把第二个参数入栈,也就是内容 __asm__("push 0x00000000"); //MessageBoxA的第一个参数 入栈 __asm__("mov eax,0x762cfdae"); //这个地址是临时搜的MessageBox的地址 ,你们目前须要本身找。 __asm__("call eax"); return 0; }
首先要编写汇编代码,咱们要用__asm__()或__asm()方法包含起来,不要忘记还要用双引号。固然你要是以为上面一行代码用一个__asm__()函数麻烦,你也能够在在一个函数里编写全部代码,像下面这样。不过要注意每行代码都要用双引号包裹,还要注意汇编代码后边的分号也要有哦。编程
__asm( "mov byte ptr [ebp+0x26],0x57;" "mov byte ptr [ebp+0x27],0x61;" ); //W、a
我用的是intel风格的汇编,在dev下编译一般会遇到问题,向下面这样报不少错误。windows
解决方法其实很简单就是,在编译选项里加一个-masm=intel命令就好,具体步骤,是点击工具-编译选项,在弹出菜单中勾选“编译时加入如下命令”,把-masm=intel命令添加进去就好,以下图所示:sass
当咱们再编译时就没有问题了。ide
这里给你们跑出一个小问题,你们说说为何abcd后面会出现“烫烫烫烫”的字样,你们认真思考哈。函数
由于上面提到了intel汇编,感受有必要提一下AT&T汇编,AT&T风格汇编在dev下是直接可编译的,若是你熟悉这种汇编风格,那么恭喜你。工具
汇编语言(英语:assembly language)是一种用于电子计算机、 微处理器、微控制器,或别样可编程器件个低级语言。拉弗同个设备中,汇编语言对应着弗同个机器语言指令集。spa
x86/amd64汇编指令的两大风格分别是Intel汇编与AT&T汇编,分别被Microsoft Windows/ Visual C++与GNU/Gas采用(Gas也可以使用Intel汇编风格):
你们看图片直观感觉一下就好。
学会了这步咱们就能够提取shellcode了。
首先,要设置一个断点位置随意,能够在想设置断点的地方单击鼠标左键,也能够把光标移动到想要设置的行按F4键:
其次,依次点击如图的调试。
这时候咱们点击查看cpu窗口会看到汇编代码,但不是咱们想要的:
咱们找到右下角的窗口看到发送命令到gdb,输入disassemble /r 就会获得16进制代码与汇编代码对应的结果。16进制代码就是咱们想要的shellcode。
看我用红框标注的位置:
原本是想把三个软件所有讲了,结果一补充就写了这么多。为了你们方便查看仍是保持每篇有必定的独立性吧,你们别嫌烦,俗话说磨刀不误砍柴工。以上就是今天的内容,我们下期见