- 修改栈返回地址,改变程序执行流程
- ELF动态解析符号过程
- jmp用法以及原理分析
- 很详细的二进制炸弹报告CSAPP Lab2: Binary Bomb
- GDB下查看内存命令(x命令)
- 80X86寄存器详解
- 汇编语言跳转指令
XCHG指令不允许的情况有以下四种:
- 不能同时都为内存操作数
- 任何一个操作数都不能为段寄存器
- 任何一个操作数不能为立即数
- 两个操作数的长度不能不相等
PHASE_3
PHASE_4
一个和我的炸弹很像的代码:参考
XCHG
交换指令XCHG是两个寄存器,寄存器和内存变量之间内容的交换指令,两个操作数的数据类型要相同,可以是一个字节,也可以是一个字,也可以是双字。
MOVZBL
ESP和EBP
关于MOV指令
MOVSX说明:带符号扩展传送指令
符号扩展的意思是,当计算机存储某一个有符号数时,符号位位于该数的第一位,所以,当扩展一个负数的时候需要将扩展的高位全赋为1.对于正数而言,符号扩展和零扩展MOVZX是一样的,将扩展的高位全赋为0.
首先理解下plt是procedure linkage table,got是global offset table。got表中存放的是外部符号的地址。plt表中存放的是函数地址。下面看下实验具体情况。
参考:介绍
(ch&0xf0)里ch是你输入的字符,&按位与运算符,0xf0是8位掩码,这里将ch低4位掩出,>>是算术右移运算符,将已掩出低4位的值的低4位移出,只剩下高4位.
(ch&0x0f)原理同上,不过是将高4位掩出
参考:
1.CSAPP: bomb lab
2.二进制炸弹
3.超强大神指导
4.bomblab实验-bomb1~6and隐藏关
5.实验参考
关于ret指令
https://blog.csdn.net/u013018721/article/details/51264199
在这里RET指令的内部操作是:栈顶字单元出栈,其值赋给IP寄存器。即实现了一个程序的转移,将栈顶字单元保存的偏移地址作为下一条指令的偏移地址。
不带任何参数时,用于在子程序的结束位置,被调用的子程序必须有ret指令,否则调用没有ret指令的子程序会导致自陷,子程序执行完之后处于失控状态。带参数ret n 表示子程序返回主程序的同时,堆栈弹出n个字节(栈顶指针减n)
关于cmp
https://blog.csdn.net/wfq_1985/article/details/6166002