格式化字符

char s[10]
printf(s)

这样虽然也可以输出,但是输入交给用户就会出现问题,如果输入的字符串为”%x%x%x%x”会直接出现内存中的数据,这是由于printf函数不知道参数,对于特定的%,会去取相应的参数,直到检索到字符串结束.所以尽管没有参数,上面的代码也会将字符串后面的内存当作参数,以16进制输出.任意的内存读取需要用到%s,其对应的参量是一个指向字符串首地址的指针,且局部变量(格式化字符串,即在printf中的)是存储在栈中,所以一定可以找到输入的字符串.
此时如果需要修改一些其他变量值,只需要计算参数的偏移量,找出参数位置,通过%n的使用,即可修改程序的参数

kali

kali中在配置burp suite代理时注意将代理改为127.0.0.1后要在浏览器中相应的修改代理至127.0.0.1,同时如果需要访问https的页面需要导入burp suite的CA证书.

变量覆盖

$与$$的使用 $$称为可变变量
例如:
$value){ ${$key} = $value; } echo $a; ?>
提交?a=1,会被解析为$a=1,造成变量覆盖

extract()使用不当
与上一个意思基本相同也是将数组中的每一个键值对赋值为单独的变量;
parse_str()将查询字符串解析到变量中

import_request_variables()将GET,POST,COOKIE的参数注册成变量也会造成变量覆盖