堆栈:为了程序的中间结果存储值
查看堆栈
找到寄存器窗口 复制FS的地址 dd搜索
反汇编窗口 寄存器窗口 内存窗口 堆栈窗口
MOVS ESI EDI 用做内存的复制 起始地址和目标地址
STOS 以ecx为计数器 把 EAX中的内容放入EDI所指的地址中
PUSH(压入) 拿出指定数据压栈 并调整指针到数据压栈位置 修改esp
相当于一个mov 一个sub
POP(弹出) 将栈顶数据拿出放到指定!寄存器 并调整指针+4 修改esp
相当于一个mov 一个add
简写 MOVSB MOVSW MOVSD
STOSB STOSW STOSD
EAX 接受返回值
ECX 计数器 calculator
ESP 栈指针寄存器(值为堆栈用到哪里了)从大地址往小地址用
stack position
修改EIP的指令:
EIP CPU下一次要执行的地址 通过JMP/CALL指令修改
CALL指令 逐一执行按f7 ①修改了EIP地址 ②把下一行指令存入堆栈(与JMP的区别)
CALL指令 修改了EIP 下一行压入堆栈 ESP-4
CALL指令 把CALL下一行地址存入栈顶 再执行CALL包含的内容
RET指令 把栈顶拿到EIP 并在栈顶指针+4
RET 把栈顶的值放入EIP 栈顶指针+4
欺诈F8
使用F8调试 遇到CALL指令 会默认执行完内部代码执行下一行
如果在CALL内部更换ESP地址 则F8 会跟丢(默认在CALL的下一行打断点)
所以遇到CALL使用F7调试
多个参数 (假定是五个参数)
MOV EAX, DWORD PTR DS:[ESP+14]
ADD EAX, DWORD PTR DS:[ESP+10]
ADD EAX, DWORD PTR DS:[ESP+C]
ADD EAX, DWORD PTR DS:[ESP+8]
ADD EAX, DWORD PTR DS:[ESP+4]
函数的