以PWN视角看待C函数

您所在的位置:网站首页 格式化字符串溢出攻击中,实现向内存写入数据的格式符 以PWN视角看待C函数

以PWN视角看待C函数

2024-07-17 15:22| 来源: 网络整理| 查看: 265

scanf函数是标准输入函数的一种,它的一些特性可以作为一些PWN题的利用空间。本文档记录对scanf函数的实验与分析的过程与结果。 scanf测试的重点是格式化的字符串。对于后面的参数来说,如果可以在之前修改对应于字符串的指针参数,那么可以实现任意地址写,这个不是scanf本身的特性,不做分析。

测试所用版本 gcc版本:gcc (Debian 10.3.0-12) 10.3.0,编译命令:gcc -o ./scanf_test.o ./scanf_test.clibc版本:GNU C Library (Debian GLIBC 2.32-4) stable release version 2.32测试平台:Linux kali 5.10.0-kali9-amd64 #1 SMP Debian 5.10.46-4kali1 (2021-08-09) x86_64 GNU/Linux 测试内容

所有结果均在Kali虚拟机上进行过测试,查阅了一些大佬的文章,对其中的一些内容也进行了测试。

参数%d

正常输入时,输入为范围在-2147483648~2147483647内的整数。

如果输入范围在-9223372036854775808~9223372036854775807内的整数,则会截断高位读取,此范围是long long int的范围。

如果输入范围在long long int范围之外,则统一将参数赋值为-1(0xFFFFFFFF)

如果输入为非数字,分为下列情况: – (1) 如果输入仅有一个,则该输入无效,该值不变。 – (2) 如果输入有数字前缀(如12345abcd),则scanf仅会读取前面的数字,从第一个非数字开始,后面全部舍弃(12345)。 – (3) 如果输入有多个且使用一个scanf语句(如scanf(“%d, %d”, &a, &b))。输入第一个非数字后,后面的所有输入均为无效,前面的输入可以赋值。 – (4) 如果输入有多个且使用多个scanf语句(含循环,即一个scanf中仅有一个输入),则输入非数字时,如果输入的不是’+’或’-’,则后面紧跟的所有scanf均自动跳过,变为无效,不能输入。如果输入的是’+’或’-’,则会跳过当前输入,后面仍然可以进行输入。应用:XCTF dubblesort

1. 测试单参%d参数: #include #include int main(){ int a = 12345; scanf("%d", &a); printf("a = %d\n", a); } 输出结果: ┌──(root💀kali)-[/Pwnprojects/features/exec] └─# ./scanf_test.o 16666 a = 16666 ┌──(root💀kali)-[/Pwnprojects/features/exec] └─# ./scanf_test.o 2147483648 a = -2147483648 ┌──(root💀kali)-[/Pwnprojects/features/exec] └─# ./scanf_test.o 12345678901234567890 a = -1 ┌──(root💀kali)-[/Pwnprojects/features/exec] └─# ./scanf_test.o + a = 12345 ┌──(root💀kali)-[/Pwnprojects/features/exec] └─# ./scanf_test.o 1234abcd a = 1234 2. 测试多参%d参数: #include #include int main(){ int a = 12345, b = 23456, c = 34567; scanf("%d %d %d", &a, &b, &c); printf("a = %d, b = %d, c = %d\n", a, b, c); } 输出结果: ┌──(root💀kali)-[/Pwnprojects/features/exec] └─# ./scanf_test.o 10000 q a = 10000, b = 23456, c = 34567 ┌──(root💀kali)-[/Pwnprojects/features/exec] └─# ./scanf_test.o 10000 1234d a = 10000, b = 1234, c = 34567 ┌──(root💀kali)-[/Pwnprojects/features/exec] └─# ./scanf_test.o 10000 - a = 10000, b = 23456, c = 34567 ┌──(root💀kali)-[/Pwnprojects/features/exec] └─# ./scanf_test.o 10000 - 12345 a = 10000, b = 23456, c = 34567 3. 测试单参%d循环输入: #include #include int main(){ int a[4] = {1, 2, 3, 4}; for(int i=0; i


【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3