前面的内容中我们使用VC++内联汇编,虽然很方便,但是无法定义字符串常量,导致我们需要把字符串的ASCII码找到,再一个一个压入栈中,比较繁琐,本节,我们换一个汇编工具——nasm,选择它是因为它可以跨平台使用。

有了这个汇编工具,我们就可以定义字符串常量了,例如:

/*****************************************************************************/
DB  “example_1”, 0x00
DB  “HelloWorld”, 0x00
/*****************************************************************************/
  • 1
  • 2
  • 3
  • 4

这样方便是方便了,但是出现了新的问题,我们不可能写成这个样子:

/*****************************************************************************/
push    ebp
        mov ebp, esp        db      “example_1”, 0x00
db      “HelloWorld”, 0x00
db      “user32.dll”, 0x00        lea     ebx, [ebp-24h]
        push    ebx
        mov ebx, 0x7c801d7b
        call        ebx // LoadLibraryA
/*****************************************************************************/
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

因为三个字符串为数据,而不是指令,不可能夹在指令中间,这样会让CPU将数据当做指令运行,程序跑飞。因此,只能放在指令区域之外。但是,又必须放在代码段中,因为Shellcode只有指令,没有数据段。因此,有了下面这种经典的做法:将字符串定义放置到一条CALL指令之后,由于CALL指令会将返回地址压栈,此时压入栈中的地址就为第一个字符串的地址,从而,我们可以在此后的代码中在栈上获取该字符串的地址。如下结构:

/*****************************************************************************/ JMP short GetString
RunMsgBox:
...
GetString:
CALL RunMsgBox
DB  “example_1”
DB  “HelloWorld”
/*****************************************************************************/
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

这种结构就充分说明了指令和数据并不区分,本来CALL指令用来在栈上保存指令,结果现在被用来保存数据了。

下面就是利用上述结构编写的汇编程序:

/*****************************************************************************/
// example_8 nasm下的汇编Shellcode
SECTION .textBITS 32global _main_main:
    jmp short GetStringRunMsgBox:
    pop     ebx    push    ebx             ; "user32.dll"
    mov     eax, 0x7c801d7b  ; LoadLibraryA
    call    eax    xor     eax,eax
    push    eax
    lea     ebx, [ebx+11]    ; "example_1"
    push    ebx
    lea     ebx, [ebx+10]    ; "HelloWorld"
    push    ebx
    push    eax    mov     ebx, 0x77d507ea ; MessageBoxA
    call    ebx    push    eax
    mov     ebx, 0x7c81cafa  ; ExitProcess
    call    ebx    GetString:
    call    RunMsgBox
    db      "user32.dll", 0x00
    db      "example_1", 0x00
    db      "HelloWorld", 0x00
/*****************************************************************************/
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

RunMsgBox中第一句pop ebx就将“user32.dll”的首地址保存在了ebx,这里注意与栈不同,后面的ebx地址是加而不是减。使用命令:

nasm -f win32 example_8.asm

编译为obj文件。然后使用VS的cl.exe,链接为exe:

cl example_8.obj libcmt.lib

运行exe,成功:

 
图34

下面我们在Immunity Debugger来看看: 
 
图35

这一段就是完整的代码,可见,字符串数据全部被反汇编为指令了,上图中标出了三个字符串的结尾符。

标出了结尾符之后,问题也就来了,是的,空字节,又出现了空字节,而且这次更不好处理,因为我们只用了字符串的首地址。为了不出现空字节,我们定义字符串的时候不能加0x00结束符,但是使用字符串的时候又需要该结束符,而且,这样定义的字符串位于代码段,代码段是不可写的,也就是一旦定义,不可修改。所以,如果空字节会引起问题,就不要这样定义。使用直接压栈的方法反而容易处理。

使用nasm有个好处,就是可以直接编译为bin格式,即操作码,例如:

nasm -f bin -o example_8.bin example_8.asm

用HexEdit打开example_8.bin,如下:

 
图36

这样,可以简单的写个程序将bin文件写出为Shellcode,就不用再去Immunity Debugger一个字节一个字节的抠出来了。

栈溢出笔记1.5 换一个汇编工具相关推荐

  1. 推荐一个快速证件照换底色的工具超级好用

    推荐一个快速证件照换底色的工具超级好用 www.yzcopen.com/img/idphoto 选择好图片转换 下载无水印照片即可 方便着急和不会ps的朋友 不去摄影棚,不用PS

  2. 学习笔记之编程达到一个高的境界就是自制脚本语言(图)

    学习笔记之编程达到一个高的境界就是自制脚本语言(图) 编程达到一个高的境界就是自制脚本语言,通过这可以精通编程里面的高深的技术,如编译原理.语言处理器.编译器与解释器,这些都是代表一个程序员实力的技术 ...

  3. MySQL数据库学习笔记(十二)----开源工具DbUtils的使用(数据库的增删改查)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  4. Angular+Flask搭建一个记录工具

    平时用的最多的文本编辑器就是Notepad++,很多东西都是通过Notepad++直接记录的: 没有看完的网页链接 要整理.收藏的网页 读书笔记 要处理的事情 待看/看过的文档和电子书 等等... 随 ...

  5. 推荐我记视频课程笔记的方法和几个工具

    本人写过机器学习笔记和深度学习笔记,细心的朋友可以发现我有参考视频的字幕.我推荐我记笔记的方法和几个工具(所有工具现在都有最新版,但还是旧版好用).(黄海广) 1.提取字幕文本 提取视频字幕如果视频格 ...

  6. 栈溢出笔记1.3 准备Shellcode

    经过1.1和1.2节的讲述,我们已经知道了怎样更改EIP的值. 程序运行函数之后将跳转到我们设定的位置開始运行,因此,我们须要准备一个自己的程序,接手后面的工作.这是一个什么样的程序?是一个C语言编写 ...

  7. 微信帝国进化史:一个通讯工具如何在八年内制霸互联网?

    作者 | 沈星佑 本文经授权转自知晓程序(ID:zxcx0101) 12 月 30 日,微信 7.0 for Android 正式版上线,继 9 天前已经推送的 iOS 版本,微信在 2018 年底终 ...

  8. 汇编工具DOSBOX安装使用

    ----------------------------------- 版权信息 ------------------------------------ 此文链接: http://blog.csdn ...

  9. ( 持续更新,目前含 200+ 工具类 ) DevUtils 是一个 Android 工具库, 主要根据不同功能模块,封装快捷使用的工具类及 API 方法调用。

    DevUtils GitHub About ( 持续更新,目前含 200+ 工具类 ) Roadmap DevUtils 是一个 Android 工具库,主要根据不同功能模块,封装快捷使用的工具类及 ...

最新文章

  1. GPU 内存的分级综述(gpu memory hierarchy)
  2. IMPORTANT: BizTalk Server 2004 fixes for Windows XP SP2 and .NET FW 1.1 SP1
  3. redis 命令行 操作
  4. 【转】 Oracle中分区表的使用
  5. 源码方式安装最新版本snmp的过程
  6. 使用Git上传文件至Github中
  7. dynamipsGUI+VMware
  8. CxImage使用介绍
  9. 国内AGV机器人厂家数目统计及区域分布分析
  10. PC是夕阳行业?你们图样图森破
  11. 2016网易春季校园招聘产品策划笔试
  12. 看电子巨头的那些分分合合
  13. 天下武功唯快不破,实时分析让企业决策又快又准
  14. 基于RecyclerView的图片浏览器
  15. 使用搜狗接口对微信公众号爬虫
  16. 动力电池罗生门:“无钴”的一张大网
  17. spa:单页web应用(介绍,实现思路及技术点,路由,router-link相关属性)
  18. RNA-seq生信分析流程
  19. 批量替换一个文件中的文件名,例如将文件夹中s**_abnormal.jpg文件修改为s**_abnor.jpg
  20. 如何做一个基于JAVA失物招领网站系统毕业设计毕设作品(springboot框架)

热门文章

  1. java class 文件分析_大概优秀的java程序员都要会分析class文件吧
  2. android自定义dialog 例子,android dialog自定义实例详解
  3. java retry 设置上限_java-如何设置Spring Retry模板重试最大尝试次数:无限
  4. 分享我们承建的三篇NAR的数据库
  5. FCPX无缝扭曲过渡转场Twirl Transition Pack for Mac
  6. windowswps怎么以文件形式发送_手机WPS怎么以文件形式发送
  7. Java学习之连接数据库
  8. s7.net 写数据到plc_机器视觉软件开发系列——松下PLC下位机通信协议简介和实现...
  9. matlab fftshift_MATLAB信号频谱分析FFT详解
  10. QML笔记-KeyNavigation的使用(2种例子)