【发布时间】:2023-03-09 15:10:01
【问题描述】:
假设这段代码接受用户输入并且容易受到格式字符串攻击:
int main(int argc, char *argv[])
{
char user_input[100];
...
scanf("%s", user_input);
printf(user_input); // vulnerable to attack
return 0
}
假设我想利用printf 行写入特定地址0x41414141。
通常,如果地址在堆栈上偏移,您可以覆盖该地址的值。例如,将输入 %5\$n 写入第 5 个参数,在堆栈中偏移。
但是如果这个地址0x41414141没有在栈上偏移,那我怎么写呢?
有多个示例表示传入输入,例如\x41\x41\x41\x41 %x %x %x %n,其中%x %x %x 将printf() 的指针移向存储在格式字符串中的指定地址。显然这最终会覆盖地址0x41414141 的值?如果这确实有效,那么我怎么知道格式字符串的地址是什么?我不知道在 gdb 中寻找什么。
【问题讨论】: