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.明日计划

加密与解密逆向分析技术 函数参数-寄存器和全局变量、返回值

原创粉丝点击