第一次写x86高级过程,调试了好久才处理好。 在vs2019中,使用extern的方式组建多模块程序,enter和leave指令是多余的。汇编器自动生成了堆栈帧:自动保存并设置了ebp的值,还会帮你生成leave指令。最后,汇编器生成的ret指令是不带参数的。 和单模块程序不同,在main过程中,p ...
分类:
其他好文 时间:
2021-04-15 12:29:35
阅读次数:
0
CreateRemoteThread 部分源码 push edi ; CreateSuspended lea ecx, [ebp+UserStack] push ecx ; UserStack lea ecx, [ebp+ThreadContext] push ecx ; ThreadContext ...
分类:
其他好文 时间:
2020-11-25 12:38:51
阅读次数:
7
今天做pwn程序题在栈的部分琢磨了好久,没搞清楚char类型和int类型在栈中占几小个,就一直纠结在画图那,之后去查了一下寄存器大小,像eax,ecx,esp,ebp这种寄存器都是32位的,也就是刚好一个整型的内存大小,而栈帧中的一个刚好可以保存一个寄存器,所以应该是32位,保存一个char变量就占 ...
分类:
其他好文 时间:
2020-11-01 10:34:26
阅读次数:
18
一、基础知识 1、Liunx汇编 主要寄存器:EAX、EBX、ECX、EDX、EBP、ESI、EDI、EIP、ESP(其中ESP是堆栈栈顶寄存器,EBP是堆栈基址指证针,EIP寄存器不能直接使用和修改。调用call时会修改EIP指针。EBP和ESP总指向同一个堆栈,EBP指向栈底,ESP指向栈顶) ...
分类:
其他好文 时间:
2020-07-09 20:57:31
阅读次数:
110
1.概述 ESP寻址方式有弊端: 因为ESP中存储的时当前堆栈的地址,所以如果我们向栈顶压入数据时,栈顶位置的值必定发生变化,此时如果再用ESP寻找原来的变量,需要修正才能正确找到。 因此用到了EBP寻址: ESP中存储的是当前栈顶指针的值。 EBP存储的是栈底指针的值 EBP寻址的思路: 把EBP ...
分类:
其他好文 时间:
2020-07-07 15:50:02
阅读次数:
63
Visual Studio编写C++代码使用汇编函数 新建空项目 新建如下源文件 ;test.asm ;测试函数 三个数相加 ;.386 .model flat, c ;public test_ .code test_ proc ;初始化栈帧指针 push ebp mov ebp,esp ;加载参数 ...
分类:
编程语言 时间:
2020-06-24 23:18:39
阅读次数:
106
涉及到以下汇编指令: pushl: 入栈 ebp指向栈底 esp指向栈顶 入栈时只需要将esp下移, 将入栈的值放入esp指向的地址,如下图所示: popl: 出栈 先将栈顶的数据保存,再将esp上移 call:顾名思义,调用一个函数 调用一个函数需要将当前执行到的指令位置(eip寄存器的值)保存, ...
分类:
其他好文 时间:
2020-05-07 00:26:08
阅读次数:
72
栈迁移 当我们的rop链过长时很可能栈空间不够,并且ebp之前的空间其实只是填充一些没什么用的数据 栈迁移机理 与传统的pop_ret类似,利用level_ret实现栈的迁移,都是寻找很小短的零碎代码,进行拼接,和拼积木很像。 level ret//拆解 mov ebp,esp//esp跟着ebp走 ...
分类:
其他好文 时间:
2020-04-30 13:27:11
阅读次数:
109
转自:https://durant35.github.io/2017/10/29/VM_Stacks/ Linux 中有几种栈?各种栈的内存位置? 关于栈 函数调用栈的典型内存布局 栈帧 (Stack Frame) 的边界由栈帧基地址指针 EBP 和 栈指针 ESP 界定,EBP指向当前栈帧底部 ( ...
分类:
编程语言 时间:
2020-04-27 19:49:37
阅读次数:
86
首先简要回顾一下缓冲区溢出的攻击大系: ◆栈溢出(stack smashing) 未检查输入缓冲区长度,导致数组越界,覆盖栈中局部变量空间之上的栈桢指针%ebp以及函数返回地址retaddr,当函数返回执行ret指令时,retaddr从栈中弹出,作为下一条指令的地址赋给%eip寄存器,继而改变原程序 ...
分类:
其他好文 时间:
2020-02-23 22:35:56
阅读次数:
91