170517 逆向-通过堆栈传递函数参数
来源:互联网 发布:北航高等理工学院知乎 编辑:程序博客网 时间:2024/06/07 03:13
1625-5 王子昂 总结《2017年5月16日》 【连续第227天总结】
A.加密与解密 函数的参数和返回值30%
B.函数传递参数有三种方式:堆栈、寄存器和全局变量
如果是堆栈,那么就需要定义参数在堆栈中的顺序,并约定函数被调用后由谁来平衡堆栈
如果是寄存器,那么就要确定参数存放在哪个寄存器中
每种机制都有其优缺点,并且与使用的编译器有关
堆栈传递参数:
堆栈是后进先出的数据结构。栈顶指针ESP指向堆栈的顶部,调用函数时调用者依次把参数压栈,然后调用函数,函数被调用以后从堆栈中取出参数。函数运行结束后,调用者或者函数要修改堆栈使其恢复原样(即平衡堆栈)
在参数传递中,有两个关键问题:
1.按照什么顺序把参数压栈
2.谁来平衡栈堆
这两个问题由调用约定确定。不同的语言定义了不同的调用约定。
stdcall调用约定是Win32 API函数采用的约定方式。内容为:入口参数按从右往左压栈。由被调用的函数负责平衡堆栈。
通常过程:
调用者将函数执行完毕时应返回的地址和参数压入堆栈
子程序使用ebp指针+偏移量对堆栈中的参数寻址并取出
子程序使用ret或retf指令返回。此时CPU将eip置为堆栈中保存的地址,并继续予以执行
堆栈只有一个出口即栈顶;堆栈操作的对象只能是字操作数(4个字节)
对于局部变量(生命期从声明开始,该代码块结束为止),代码块一般就是这个函数,因此在函数平衡堆栈的时候也会把局部变量的内存清除。通过改变栈顶指针esp的方式。
此外,还有一组指令:enter和leave,它们可以帮助进行堆栈的维护
enter表示push ebp/mov ebp,esp/sub esp,xxx
leave表示add esp,xxx/pop ebp
eg:
enter xxxx,0;0表示xxxx空间存放局部变量
...
leave;恢复现场
ret 8;返回
注:8表示在ret后把堆栈指针esp加上8,即清除8个字节的内存
今天写pyqt的时候开始考虑之后与数据库进行通信时的数据结构了,于是尝试使用pymysql库
游标方式操作mysql基本与直接命令行操作没什么区别,即可以直接字符串操作,也可以使用格式符来参数化
顺便复习了一波mysql的命令
更改表结构的命令关键词为alter
eg:
alter table test change old_column new_column varchar(20);
//表示把test表里的old_column列名改为new_column,格式为varchar(20)
change表示更改列名,add表示新增列,drop表示删除
新增的时候在最后加上after column_n,表示加在某一列之后
insert为新增行,update set n='x'为更新现有行的内容,最后要加上where子条件来限制行,否则将改变所有行
注意字符串要加引号
C.明日计划
加密与解密逆向分析技术 函数参数-寄存器和全局变量、返回值
- 170517 逆向-通过堆栈传递函数参数
- 向setTimeout传递函数参数
- 用引用传递函数参数
- javascript 中传递函数参数
- js传递函数作为参数
- 向setTimeout传递函数参数
- 向setTimeout传递函数参数
- js传递函数作为参数
- Python传递函数参数
- 基础知识-通过引用来传递函数参数(直接访问函数参数)
- 传递函数
- 逆向操作堆栈
- 通过MatLab将传递函数离散化
- 经典问题:向setTimeout传递函数参数
- [转载]经典问题:向setTimeout传递函数参数
- 用指针传递函数参数的问题
- 经典问题:向setTimeout传递函数参数
- android______________jni和java的参数传递函数
- SpringBoot相关的知识点
- 用canvas制作表情包
- html 点击复制功能
- Java学习笔记(十五)--线程
- 机器人繁殖
- 170517 逆向-通过堆栈传递函数参数
- 静态路由配置
- 169.n1-banner下方的标题和使用ViewPagerIndicator实现圆点
- Android studio 下OpenCV,NDK,配置
- eclipse配置mybatis 的xml提示
- 递归翻转一个字符串
- T4模板之基础篇
- Android 进阶6:两种序列化方式 Serializable 和 Parcelable
- python安装更新和pip安装使用阿里源及yum问题解决