0x00 Intro
这里记录一些在CTF PWN类题目经常要考虑的技术点,是一些与C/ASM相关,比较底层的东西。总结来说有:
- C和汇编之间的参数传递
- 栈的细节
- 64位程序参数传递
只有对这些细节都清楚了,那么利用时,如何构造Payload就没有想象中那么困难了。这里目前还是只限于x86-64架构。
0x01 C和汇编之间的参数传递
有编译器基础的都知道,GCC将C语言编译为机器语言中间有几个过程。
- 预处理(将宏展开)
- 汇编(将C代码转为汇编代码)
- 编译(将汇编转为机器码)
- 链接(将静态库,多个源文件.o,进行合并,得到可执行文件)
也就是说C的一级是汇编。当使用IDA工具反汇编得到伪代码时,有时,需要反复交叉查阅,汇编和C代码。所以有必要熟悉下汇编和C的参数传递之间的对应关系。
C和汇编的函数调用的语法不太一样。所以转换过程需要留意。
举个例子来说:
func(a1, a2);
这是一个C语言中的函数调用。如果是汇编,则会是这个样子
pushl $a2
pushl $a1
call func
可以看到,汇编语言中,程序员要手动将参数压入栈中。X86架构下,最后一个参数先压栈,然后是倒数第2个,为什么是这个样子,以及如何记住。在下一个环节说栈的细节时,会详细说下。
<