从一个玩具函数开始:
gets函数:会读取输入的内容直到遇到换行或EOF停止,gets(buffer)而读取到的内容去了buffer数组;
在不进入另一个call的情况下buffer算是临时变量,存在堆栈中 O(∩_∩)O。
这里是一个程序的源代码和汇编代码
保存返回地址
把ebp设为栈基地址,esp为偏移地址
栈16字节对齐,编译的时候优化的吧 对齐访问效率高一些
给栈分配空间(60个字节)(不清楚是0x60个字节还是0x60+2个字节,如果是0x60的话esp本身指向的额地址不就算是栈外面了)
栈顶空间设置为0(modified为0这个栈顶存放的应该就是modified了,c语言中的int型数据64位系统下,采用64位编译器进行编译处理时,发生变化的变量类型是:long。)
(1c-5c=40十进制64)这句是把buffer复制到eax 这里buffer数组是esp+1C开始向低地址处延伸到esp+5C
把eax复制到esp指向的位置
call gets
比较0x00和esp+0x5c(modified)
分析到这里就够了,我要做的就是把输入的字符足够多,多到64位填满再多把modified的空间覆盖掉
gdb命令
disas main 执行main函数
r run
b *xxxx 下断点
x $esp+0x5c 查看这个地址的堆栈
ni 单步步过
si 单步步入