Home avatar

Wings

整数运算

注意
好像 CSAPP 没涉及到运算在逻辑电路上的实现 (暂时没看到后面), 但是计组课本上居然有… 日后看情况补充吧, 可能得等计组考试前两天才会学这玩意.

无符号整数比较简单, 因为其加法, 乘法, 减法 (这里不讨论整数的除法) 运算都是在模域 $2^w$ 下的, 可以直接将结果用人理解的方法算出来. (如果有需要的话把算出的这个结果转换成二进制表示.)

IEEE 754 浮点数表示

浮点数Floating Point是表示实数的一种方法. 它的思想类似于科学计数法, 即将数字写成 $x = (-1)^S M \cdot 2^E$ 的形式. 那么需要记录 符号Sign $S$, 尾数Mantissa $M$ 和指数或阶(码)Exponent $E$.

Pwn ret2text in x86

ret2text 的意思是返回到特定代码段.

程序被装载后, 在(虚拟)内存中是这样的:

Linux进程地址空间布局 (图源 «程序员的自我修养»)
Linux进程地址空间布局 (图源 «程序员的自我修养»)

调用一个函数的时候, 内存中栈上的数据是这样排列的:

栈帧 (图源 «程序员的自我修养»)
栈帧 (图源 «程序员的自我修养»)

其中, 返回地址Return Address 指的是函数执行完成之后, 要执行的下一条指令的地址.

可以看到, 栈是从高位向低位增长的, 而数组是从低位向高位填充的. 也就是说, 如果 数组越界 不加处理, 我们可以 覆盖掉返回地址, 从而控制程序的运行.

然而, 在开启了 栈不可执行保护NX 的程序中, 我们不能够在栈中写入 shellcode, 覆盖掉返回地址一般来说是程序代码段中的内容.

call 指令先 push 下一个命令的地址(返回地址), 再 jmp. leave 是恢复上一个栈桢, retpop eip.