黄金列车 發表於 2024-5-17 22:34:00

汇编语言基础及编译原理(网安)

<h1 id="汇编语言基础及编译原理">汇编语言基础及编译原理</h1>
<h2 id="二进制基础">二进制基础</h2>
<h3 id="程序的编译-汇编与链接">程序的编译 汇编与链接</h3>
<ul>
<li>从c语言到可执行程序<br>
源代码.c<br>
编译<br>
汇编代码.s<br>
汇编<br>
目标文件.o<br>
链接(静态库直接拷贝,动态库运行时通过动态链接方式加载)<br>
可执行文件(p)</li>
</ul>
<h3 id="x86机器指令入门">x86机器指令入门</h3>
<h4 id="栈">栈</h4>
<p>一种先进后出的数据结构<br>
被用于保存函数的局部(保存局部变量和返回地址)<br>
栈往低地址增长<br>
esp栈顶指针<br>
push 入栈<br>
pop 出栈</p>
<ul>
<li>基础指令<br>
mov 寻址<br>
add 加操作<br>
sub 减操作<br>
lea 加载有效地址<br>
inc 加一<br>
dec 减一<br>
imul 乘法<br>
idiv 除法<br>
and or xor 与 或 异或<br>
not neg 非<br>
shl shr 左右移</li>
<li>jmp<br>
j<br>
cmp 比较<br>
call ret 函数调用/返回</li>
</ul>
<h4 id="intel-与-att">Intel 与 AT&amp;T</h4>
<p>左右相反<br>
AT&amp;T中$表立即数<br>
%为地址<br>
intel为[]<br>
AT&amp;T为()</p>
<h3 id="调用约定">调用约定</h3>
<p>调用约定<em><strong>约定了函数之间如何传参 如何传返回值</strong></em></p>
<ul>
<li>调用者负责清理栈上参数(Caller Clean-up)<br>
<em><strong>cdecl</strong></em><br>
optlink</li>
<li>被调用者负责清理栈上参数(Callee Clean-up)<br>
stdcall<br>
fastcall<br>
主要是操作栈(64位寄存器中如果传参少可以直接用寄存器传参)<br>
eax保存返回值<br>
ebp保存栈顶指针<br>
<img src="https://img2024.cnblogs.com/blog/3444086/202405/3444086-20240515193515762-807661822.jpg" alt="" loading="lazy"></li>
</ul>
<h2 id="elf与动态链接">ELF与动态链接</h2>
<h3 id="elf文件格式">ELF文件格式</h3>
<ul>
<li>Segment:在ELF(Executable and Linkable Format)格式中,segment是指具有相同属性的节(section)的集合。这些属性主要包括<em><strong>可读、可写和可执行等</strong></em>权限。Segment主要描述了<em><strong>磁盘上可执行文件的内存布局以及如何映射到内存中</strong></em>,是程序装载时被内核解析的必要组成部分。</li>
<li>Section:Section是指包含<em><strong>代码或数据的逻辑区块</strong></em>。例如,一个程序中的全局变量或特定的函数代码都可以构成一个section。Section的信息主要用于<em><strong>链接和调试</strong></em>,它对于程序的执行来说不是必需的,<em><strong>但没有节头表,会使得一些工具如gdb和objdump难以定位符号信息</strong></em>。</li>
</ul>
<h4 id="segment和section之间存在密切的关系一个segment可以包含一个或多个section而每个section都必须属于某个segment">Segment和section之间存在密切的关系。一个segment可以包含一个或多个section,而每个section都必须属于某个segment。</h4>
<p>这种结构设计使得程序的不同部分可以根据需要被分配不同的属性和权限。例如,一个典型的程序可能包括一个包含代码的.text section和一个包含未初始化数据的.bss section,它们可能同属于一个具有执行权限的segment</p>
<h4 id="segment主要关注程序如何被操作系统加载到内存中而section则更关注程序本身的结构和运行时行为"><em><strong>Segment主要关注程序如何被操作系统加载到内存中,而section则更关注程序本身的结构和运行时行为。</strong></em></h4>
<h4 id="在实际操作中可以使用如readelf这样的工具来查看elf文件中segment和section的具体信息例如使用readelf--l命令可以显示哪些section被映射到一个segment中这有助于理解程序的内存布局和优化内存使用">在实际操作中,可以使用如readelf这样的工具来查看ELF文件中segment和section的具体信息。例如,使用readelf -l命令可以显示哪些section被映射到一个segment中,这有助于理解程序的内存布局和优化内存使用</h4>
<ul>
<li>ELF Header : 架构版本信息等,以及下面两个的位置和数量</li>
<li>Program header table : 每个表定义了一个segment,每个segment可包含多个section</li>
<li>Secton header table : 每个表定义了一个section</li>
</ul>
<h4 id="readelf--h-查看elf-header">readelf -h 查看ELF Header</h4>
<h4 id="readelf--l-查看program-header">readelf -l 查看Program Header</h4>
<h4 id="readelf--s-查看section-header">readelf -S 查看Section Header</h4>
<p><img src="https://img2024.cnblogs.com/blog/3444086/202405/3444086-20240526211008038-808706877.bmp" alt="" loading="lazy"></p>
<ul>
<li>通过/proc//maps查看内存映射情况</li>
</ul>
<h3 id="静态链接启动过程">静态链接启动过程</h3>
<h3 id="动态链接与延迟绑定">动态链接与延迟绑定</h3>
<ul>
<li>动态链接是一种运行时才会加载和链接程序所依赖的共享库技术</li>
<li>linux最常见的共享库 libc</li>
<li><em><strong>重定位</strong></em></li>
<li>待填充项<br>
<img src="https://img2024.cnblogs.com/blog/3444086/202405/3444086-20240527182819379-2098549495.bmp" alt="" loading="lazy"></li>
</ul>
<h1 id="后面部分为ctf中的二进制内容不需要的可以跳过">(后面部分为CTF中的二进制内容,不需要的可以跳过)</h1>
<h3 id="got表劫持攻击">GOT表劫持攻击</h3>
<h4 id="什么是got表">什么是GOT表</h4>
<p><img src="https://img2024.cnblogs.com/blog/3444086/202405/3444086-20240527183200710-1425993271.bmp" alt="" loading="lazy"></p>
<h2 id="二进制漏洞类型与原理">二进制漏洞类型与原理</h2>
<h3 id="栈溢出与堆溢出">栈溢出与堆溢出</h3>
<h3 id="整数溢出">整数溢出</h3>
<h3 id="释放后使用uaf">释放后使用(UAF)</h3><br><br>
来源:https://www.cnblogs.com/qqjz-l/p/18194571
頁: [1]
查看完整版本: 汇编语言基础及编译原理(网安)