困惑如何阅读汇编指令
Posted
技术标签:
【中文标题】困惑如何阅读汇编指令【英文标题】:Confused how to read assembly instruction 【发布时间】:2015-05-24 14:48:01 【问题描述】:我有一些关于阅读汇编指令的问题。我知道基本的指令语法,但是当一些寄存器前面带有一些地址时,或者问题使用了任何奇怪的指令时,它会变得混乱。是否有任何易于理解的汇编指令参考集?
例如,我有一个问题要阅读这些说明:
0x401050 <what>: push %ebp
0x401051 <what+1>: mov %esp,%ebp
0x401053 <what+3>: sub $0xc,%esp
0x401056 <what+6>: mov 0x8(%ebp),%eax
0x401059 <what+9>: add $0x4,%eax
0x40105c <what+12>: mov %eax,0xfffffffc(%ebp)
0x40105f <what+15>: mov 0x8(%ebp),%eax
0x401062 <what+18>: imul 0xc(%ebp),%eax
0x401066 <what+22>: mov %eax,0xfffffff8(%ebp)
0x401069 <what+25>: mov 0xc(%ebp),%edx
0x40106c <what+28>: mov 0x8(%ebp),%eax
0x40106f <what+31>: sub %edx,%eax
0x401071 <what+33>: mov %eax,0xfffffff4(%ebp)
0x401074 <what+36>: mov 0xfffffff8(%ebp),%eax
0x401077 <what+39>: add 0xfffffffc(%ebp),%eax
0x40107a <what+42>: add 0xfffffff4(%ebp),%eax
0x40107d <what+45>: leave
0x40107e <what+46>: ret
0x401089 <main>: push %ebp
0x40108a <main+1>: mov %esp,%ebp
0x40108c <main+3>: sub $0x18,%esp
0x40108f <main+6>: and $0xfffffff0,%esp
0x401092 <main+9>: mov $0x0,%eax
0x401097 <main+14>: mov %eax,0xfffffff0(%ebp)
0x40109a <main+17>: mov 0xfffffff0(%ebp),%eax
0x40109d <main+20>: call 0x401420 <_alloca>
0x4010a2 <main+25>: call 0x4014b0 <__main>
0x4010a7 <main+30>: mov 0xc(%ebp),%eax
0x4010aa <main+33>: add $0x4,%eax
0x4010ad <main+36>: mov (%eax),%eax
0x4010af <main+38>: mov %eax,(%esp)
0x4010b2 <main+41>: call 0x4014d0 <atoi>
0x4010b7 <main+46>: mov %eax,0xfffffffc(%ebp)
0x4010ba <main+49>: mov 0xc(%ebp),%eax
0x4010bd <main+52>: add $0x8,%eax
0x4010c0 <main+55>: mov (%eax),%eax
0x4010c2 <main+57>: mov %eax,(%esp)
0x4010c5 <main+60>: call 0x4014d0 <atoi>
0x4010ca <main+65>: mov %eax,0xfffffff8(%ebp)
0x4010cd <main+68>: mov 0xfffffff8(%ebp),%eax
0x4010d0 <main+71>: inc %eax
0x4010d1 <main+72>: mov %eax,0x4(%esp)
0x4010d5 <main+76>: mov 0xfffffffc(%ebp),%eax
0x4010d8 <main+79>: add $0x2,%eax
0x4010db <main+82>: mov %eax,(%esp)
0x4010de <main+85>: call 0x401050 <what>
0x4010e3 <main+90>: mov %eax,0xfffffff4(%ebp)
0x4010e6 <main+93>: mov 0xfffffff4(%ebp),%eax
0x4010e9 <main+96>: mov %eax,0x4(%esp)
0x4010ed <main+100>: movl $0x40107f,(%esp)
0x4010f4 <main+107>: call 0x4014c0 <printf>
0x4010f9 <main+112>: mov $0x0,%eax
0x4010fe <main+117>: leave
0x4010ff <main+118>: ret
问题是:
该程序从命令行调用,如下所示: ./程序 5 7 该过程命名为从 main 调用的内容,带有以下参数:
1) 6, 8
2) 7, 8
3) 5, 7
4) 7, 5
从main调用的过程名为what,并返回main并返回值:
1) 11
2) 24
3) 42
4) 66
谁能指导我这个示例中的说明如何工作?任何建议或帮助将不胜感激。谢谢。
【问题讨论】:
您期待什么样的帮助?0xc(%ebp)
是不是“前面有某个地址的注册”? (提示:它不是一个“地址”。)0xfffffff8(%ebp)
符号是否令人困惑? (提示:这是一个负数。)请重新阅读您的课程笔记。
(Add.) .. 个别指令的规范参考是英特尔® 64 和 IA-32 架构软件开发人员手册 (link to download page),尽管“易于理解”的限定条件在很大程度上是意见并以经验为基础。
我认为您应该先尝试通过教程或课程学习一些组装基础知识,然后才能清楚得多。另请注意,汇编有 2 种不同的语法:AT&T-Syntax 和 Intel-Syntax。您的代码现在采用 AT&T 语法,这在英特尔处理器中并不常见。了解程序集的来源(反汇编、来自 C 代码、...)也很有帮助
【参考方案1】:
您应该尝试将该二进制文件加载到 IDA 中。 IDA 让您可以更好地了解结构,并且更容易理解您要询问的内容(除了阅读说明)。
编辑:https://www.hex-rays.com/products/ida/
这是针对二进制文件的,如果它符合您的需要,在上面的页面上也有这个软件的免费版本。您也可以使用演示版本来完成您的工作。我使用 IDA Pro (demo) 查看和编辑 ios App Binaries。
对于下面的 cmets,您是 Stack Exchange 最糟糕的事情 - 因此这是我最后一次尝试提供帮助。是Reddit。
【讨论】:
您至少应该添加一个链接。你不能指望读者知道 IDS 是什么。我自己不得不谷歌它。 如果 OP 没有二进制文件怎么办?这也可以是一个文本文件。以上是关于困惑如何阅读汇编指令的主要内容,如果未能解决你的问题,请参考以下文章