小编par*_*vir的帖子

linux键盘驱动源码

我一直致力于为 Linux 制作自己的键盘驱动程序。所以我遇到了这两个链接:usbkbd.catkbd.c

现在我很困惑其中哪一个是目前驱动我的键盘的实际代码。据我所知,atkbd.c 相当血腥,并且有扫描码到键码的转换。所以它应该是代码,尽管我不确定。

如果 atkbd.c 是代码,那么其他代码是做什么用的?

linux kernel-module linux-device-driver linux-kernel

5
推荐指数
1
解决办法
8617
查看次数

C中printf()中单引号和双引号的区别

我对 C 的 printf() 中双引号和单引号的使用有疑问。我有以下代码:

#include<stdio.h>
int main(int argc, char** argv) {
    char buffer[100];
    strncpy(buffer, argv[1], 100);
    printf(buffer);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

所以当我编译并运行它时,会发生以下结果:

./a.out 'AAAA%8$p'

AAAA0x70243825**41414141**

./o "AAAA%8$p"

AAAA
Run Code Online (Sandbox Code Playgroud)

请注意,在第一种情况下,我输入了单引号,在后一种情况下,我输入了双引号。

这里发生了什么。

Q2。我正在关注此链接。所以我的问题是,运行时输入 argv[1] 中的 AAAA 如何能够影响 printf() 的输出。起初我以为这只是巧合,但我输入并得到以下内容

./o 'BBBB%8$p'

BBBB0x70243825**42424242**
Run Code Online (Sandbox Code Playgroud)

编辑:所以我认为看到答案存在一些误解。我知道直接“printf(buffer)”的滥用。因此,我将引用我之前提到的相关链接:

由于 printf 的参数数量可变,因此它必须使用格式字符串来确定参数数量。在上面的例子中,攻击者可以传递字符串“%p %p %p %p %p %p %p %p %p %p %p %p %p %p %p”并欺骗 printf 认为它是这样的有 15 个参数。它会天真地打印堆栈上接下来的 15 个地址,认为它们是它的参数:

$ ./a.out "%p %p %p %p %p %p %p %p %p %p %p %p …
Run Code Online (Sandbox Code Playgroud)

c printf string-formatting

0
推荐指数
1
解决办法
1991
查看次数