小伙伴们对我上一篇文章的反应完全出乎了我的意料,感谢大家对我的支持和认可。接下来我会精心的把这一系列课程设计好,尽量详细的展示给大家。上篇文章我列举了一个缓冲区溢出的小例子,并提到了dev c++、ollydbg、IDA Freeware这三款软件,并介绍了dev c++的基本用法。今天会补充一下Dev c++的用法。

今天补充的用法主要是为了以后编写shellcode做准备,这篇文章只讲用法,大家不必深究代码的功能。

0×00 如何编写汇编代码

下面给大家一个在dev下用汇编代码编译的MessageBox的的代码例子,可以弹出一个提示框,今天还是不讲代码,主要讲代码是如何编译的。

  1. #include<windows.h>
  2. int main()
  3. {
  4. LoadLibrary("user32.dll");
  5. __asm__("push 0x00000001"); //MessageBoxA的最后一个参数 入栈
  6. __asm__("mov byte ptr [ebp+0x26],0x57"); //W
  7. __asm__("mov byte ptr [ebp+0x27],0x61"); //a
  8. __asm__("mov byte ptr [ebp+0x28],0x72"); //r
  9. __asm__("mov byte ptr [ebp+0x29],0x6e"); //n
  10. __asm__("mov byte ptr [ebp+0x2a],0x69"); //i
  11. __asm__("mov byte ptr [ebp+0x2b],0x6e"); //n
  12. __asm__("mov byte ptr [ebp+0x2c],0x67"); //g
  13. __asm__("mov byte ptr [ebp+0x2d],0x00"); //表示字符截断,就是说代码截止
  14. __asm__("lea eax,[ebp+0x26]"); //把存储字符的起始地址赋给寄存器eax
  15. __asm__("push eax"); //把第三个参数入栈也就是标题
  16. __asm__("mov byte ptr [ebp+0x2e],0x61");
  17. __asm__("mov byte ptr [ebp+0x2f],0x62");
  18. __asm__("mov byte ptr [ebp+0x30],0x63");
  19. __asm__("mov byte ptr [ebp+0x31],0x64");
  20. __asm__("lea eax,[ebp+0x2e]");
  21. __asm__("push eax"); //把第二个参数入栈,也就是内容
  22. __asm__("push 0x00000000"); //MessageBoxA的第一个参数 入栈
  23. __asm__("mov eax,0x762cfdae"); //这个地址是临时搜的MessageBox的地址 ,大家目前需要自己找。
  24. __asm__("call eax");
  25. return 0;
  26. }

首先要编写汇编代码,我们要用__asm__()或__asm()方法包含起来,不要忘记还要用双引号。当然你要是觉得上面一行代码用一个__asm__()函数麻烦,你也可以在在一个函数里编写所有代码,像下面这样。不过要注意每行代码都要用双引号包裹,还要注意汇编代码后边的分号也要有哦。

  1. __asm(
  2. "mov byte ptr [ebp+0x26],0x57;"
  3. "mov byte ptr [ebp+0x27],0x61;"
  4. ); //W、a

0×01 如何编译汇编代码

我用的是intel风格的汇编,在dev下编译通常会遇到问题,向下面这样报很多错误。

解决方法其实很简单就是,在编译选项里加一个-masm=intel命令就好,具体步骤,是点击工具-编译选项,在弹出菜单中勾选“编译时加入以下命令”,把-masm=intel命令添加进去就好,如下图所示:

当我们再编译时就没有问题了。

0×02 看看汇编代码写出来MessageBox的效果

这里给大家跑出一个小问题,大家说说为什么abcd后面会出现“烫烫烫烫”的字样,大家认真思考哈。

0×03 intel与AT&T的不同

因为上面提到了intel汇编,感觉有必要提一下AT&T汇编,AT&T风格汇编在dev下是直接可编译的,如果你熟悉这种汇编风格,那么恭喜你。

汇编语言(英语:assembly language)是一种用于电子计算机、 微处理器、微控制器,或别样可编程器件个低级语言。拉弗同个设备中,汇编语言对应着弗同个机器语言指令集。

汇编风格

x86/amd64汇编指令的两大风格分别是Intel汇编与AT&T汇编,分别被Microsoft Windows/ Visual C++与GNU/Gas采用(Gas也可使用Intel汇编风格):

大家看图片直观感受一下就好。

0×04 将汇编代码转换成16进制机器码

学会了这步我们就可以提取shellcode了。

首先,要设置一个断点位置随意,可以在想设置断点的地方单击鼠标左键,也可以把光标移动到想要设置的行按F4键:

其次,依次点击如图的调试。

这时候我们点击查看cpu窗口会看到汇编代码,但不是我们想要的:

我们找到右下角的窗口看到发送命令到gdb,输入disassemble /r 就会得到16进制代码与汇编代码对应的结果。16进制代码就是我们想要的shellcode。

看我用红框标注的位置:

本来是想把三个软件全部讲了,结果一补充就写了这么多。为了大家方便查看还是保持每篇有一定的独立性吧,大家别嫌烦,俗话说磨刀不误砍柴工。以上就是今天的内容,咱们下期见

缓冲区溢出实战教程系列(二):dev c++编译汇编代码的更多相关文章

  1. 缓冲区溢出实战教程系列(三):利用OllyDbg了解程序运行机制

    想要进行缓冲区溢出的分析与利用,当然就要懂得程序运行的机制.今天我们就用动态分析神器ollydbg来了解一下在windows下程序是如何运行的. 戳这里看之前发布的文章: 缓冲区溢出实战教程系列(一) ...

  2. WPF入门教程系列二十三——DataGrid示例(三)

    DataGrid的选择模式 默认情况下,DataGrid 的选择模式为“全行选择”,并且可以同时选择多行(如下图所示),我们可以通过SelectionMode 和SelectionUnit 属性来修改 ...

  3. WPF入门教程系列(二) 深入剖析WPF Binding的使用方法

    WPF入门教程系列(二) 深入剖析WPF Binding的使用方法 同一个对象(特指System.Windows.DependencyObject的子类)的同一种属性(特指DependencyProp ...

  4. .Net Core实战教程(二):设置Kestrel的IP与端口的几种方法

    .Net Core实战教程(二):设置Kestrel的IP与端口的几种方法 1.直接写在代码方式 Program.cs代码如下: using System; using System.Collecti ...

  5. 「软件测试实战教程系列(三)」弃繁就简,接口测试神器Postman|收藏版

    软件测试实战教程系列(三)弃繁就简,接口测试神器Postman|收藏版 Postman主要帮我们干了三件事: 1.把相关集合放到一个集合当中方便管理. 2.对指定接口发送请求. 3.断言 下面我们使用 ...

  6. NDK-JNI实战教程(二) JNI官方中文资料

    声明 设计概述 JNI接口函数和指针 加载和链接本地方法 解析本地方法名 本地方法的参数 引用Java对象 全局和局部引用 实现局部引用 访问Java对象 访问基本类型数组 访问域和方法 报告编程错误 ...

  7. WPF入门教程系列二——Application介绍

    一.Application介绍 WPF和WinForm 很相似, WPF与WinForm一样有一个 Application对象来进行一些全局的行为和操作,并且每个 Domain (应用程序域)中仅且只 ...

  8. struts2官方 中文教程 系列二:Hello World项目

    先贴个本帖的地址,免得其它网站被爬去了struts2入门系列二之Hello World  即 http://www.cnblogs.com/linghaoxinpian/p/6898779.html ...

  9. 保姆教程系列二、Nacos实现注册中心

    前言: 请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i 上篇我们介绍到  保姆教程系列一.Linux搭建Nacos 注册中心原理 一.环境准备 Java版本:1.8+   (Linux ce ...

随机推荐

  1. 转 Python 操作 MySQL 数据库

    #########http://www.runoob.com/python/python-mysql.html Python 标准数据库接口为 Python DB-API,Python DB-API为 ...

  2. Webstrom 中写Vue没有代码提示如何解决?

    1. 如果你的Webstorm是2017版的,请更新到最新的2018,2018版本的webstorm自带了vue插件 找到 Help > About,查看你的Webstorm版本 2. 如果你的 ...

  3. ExtJS 开发总结

    1. ExtJS的定位是RIA,和Prototype.jQuery等类库的定位不同.使用ExtJS做开发,就是意味着以客户端开发为主,不然就不叫RIA框架了,而Prototype.jQuery等只是辅 ...

  4. 17965 幸运之星(优先做) 约瑟夫环问题O(n)

    17965 幸运之星(优先做) 时间限制:100MS  内存限制:65535K 提交次数:0 通过次数:0 题型: 编程题   语言: G++;GCC;VC Description 每年新年派对的最后 ...

  5. maya 安装不上

    AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...

  6. UGUI Slider

    1.新建一个Cube命名为Player,在上面挂一个脚本命名为Player,脚本内容如下: using System.Collections; using System.Collections.Gen ...

  7. 宋宝华: 关于Linux进程优先级数字混乱的彻底澄清

    宋宝华: 关于Linux进程优先级数字混乱的彻底澄清 原创: 宋宝华 Linux阅码场 9月20日 https://mp.weixin.qq.com/s/44Gamu17Vkl77OGV2KkRmQ ...

  8. #define\const\inline的区别与联系

    总结: const用于代替#define一个固定的值,inline用于代替#define一个函数.是#define的升级版,为了消除#define的缺陷. 参考内容:http://www.cnblog ...

  9. HDU 4364——Matrix operation——————【模拟题】

    Matrix operation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  10. B树和B+树对比,为什么MySQL数据库索引选择使用B+树?

    一 基础知识 二叉树 根节点,第一层的节点 叶子节点,没有子节点的节点. 非叶子节点,有子节点的节点,根节点也是非叶子节点. B树 B树的节点为关键字和相应的数据(索引等) B+树 B+树是B树的一个 ...