gpt4 book ai didi

c - 堆栈处理函数参数的方式

转载 作者:太空宇宙 更新时间:2023-11-04 00:08:35 25 4
gpt4 key购买 nike

我正在研究 The Shellcoder's Handbook 的 Format String 部分。正如书中所建议的那样,我使用这样的代码来进行测试:

[格式字符串.c]

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {

if(argc>1) {

if(argc>2) {
printf("Push a key to continue...\n");
getc(stdin);
}
printf("Sortie format string => ");
printf( argv[1] );
printf("\n");

}
printf("\n");

}

所以,我知道诀窍是用偏移量在堆栈上定位你的参数(你传递给 formatstring 的链,稍后由 printf 使用)。

./formatstring "aaaa%$offset\$x"

(将 kernel.randomize_va_space 设置为 0,使偏移量保持不变)。为了找到这个偏移量,他们使用了一个小的批处理脚本

for((i=0; i<1000; i++)); do echo -n "$i " && ./formatstring "AAAAAAAA%$i\$x"; done | grep 4141

我把它弄出来了(这里 offset=137)

137 Sortie format string =>  AAAAAAAA41414141
138 Sortie format string => AAAAAAAA25414141

首先,我的“AAAAAAAA”在堆栈上没有“对齐”(我在这里只能数出 7 个 41,但我向格式字符串发送了 8 个“A”),并且它们在堆栈上的放置方式似乎随着时间的推移而改变=> 如果我在 2 小时后启动我的 bash 脚本 (for),可能是“A”的“对齐方式”发生了变化。

更令人不安的是,当我向发送到 ./formatstring 的参数添加字节时,偏移量似乎发生了变化。如果我跑

for((i=0; i<1000; i++)); do echo -n "$i " && ./formatstring "AAAAAAAA%32x%$i\$x"; done | grep 4141

我明白了

136 Sortie format string =>  AAAAAAAA                        b7ff103041414141
137 Sortie format string => AAAAAAAA b7ff103025414141

或者运行

for((i=0; i<1000; i++)); do echo -n "$i " && ./formatstring "AAAAAAAA%320x%$i\$x"; done | grep 4141

我明白了

139 Sortie format string =>  AAAAAAAA                                                                                                                                                                                                                                                                                                                        b7ff103041410067
140 Sortie format string => AAAAAAAA b7ff103041414141
141 Sortie format string => AAAAAAAA b7ff103033254141

如您所见,偏移量发生变化并遵循我无法理解的逻辑。根据这本书,这一切都不应该发生。你知道它来自哪里吗?它是一种堆栈保护机制吗?我可以在 gcc formatstring.c 时删除它吗?

最佳答案

好吧,我想通了。这本书没有解释的东西(或者我误解了,因为你可以看到英语不是我的母语)是你只能在你的论点中添加 16 个字符(字节)的集合,如果你想让它在堆。

因此,如果您将“%320x”添加到您的论点中,您还必须以 (16-5=11) 'A'(或任何其他字符)作为结尾,因为 strlen("%320x")=5。

关于c - 堆栈处理函数参数的方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12918224/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com