gpt4 book ai didi

c - 写入以空字节开头的内存

转载 作者:太空狗 更新时间:2023-10-29 15:06:58 27 4
gpt4 key购买 nike

假设这段代码:

    #include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char** argv){
char fonction[50] = "/usr/bin/passwd ";
char messageAccueil[100] = "changement du mot de passe de : ";
if(argc == 1){
printf("vous devez passer un username en parametre \n");
return 1;
}
printf(messageAccueil);
printf(argv[1]); //<-- format string vulnerability here !!
if(strcmp(argv[1], "root")==0){
printf("vous ne pensiez quand meme pas pouvoir changer le mot de passe de root si facilement ?\n");
return 1;
}
printf("\n");
strncat(fonction,argv[1],38);
system(fonction);
return 0;
}

我想利用格式化字符串漏洞来执行shell,因此,我想通过存储在环境变量中的 shellcode 地址重写来自 GOT 的 strcmp 函数地址。

gdb 给了我:

(gdb) info functions
0x0000000000400570 strcmp@plt
(gdb) disas 0x400570
Dump of assembler code for function strcmp@plt:
0x0000000000400570 <+0>: jmp QWORD PTR [rip+0x20070a]#0x600c80 <strcmp@got.plt>
0x0000000000400576 <+6>: push 0x6
0x000000000040057b <+11>: jmp 0x400500
End of assembler dump.

所以我想把我的shellcode地址写到0x00600c80

我如何将 nullbyte 传递到我的 ./changepasswd 文件?

我实际上正在尝试这个漏洞:

/changepasswd $(echo -e '\x80\x0c\x60\x00____\x84\x0c\x60\x00')%65527d%136\$x%59017d%137\$x

这给我地址 600c845f

但是 \x00 没有影响,没有存储到堆栈中。

我发现地址以 00 开头的事实可能是 ascii 装甲问题,但我的系统中完全没有 exec-shield 选项。

所以我正在寻找一种方法将 00 写入我的堆栈让我的 GOT 地址以 00 之外的其他内容开始...

最佳答案

这里有两个问题。或者,更好地说,两种不可能。

首先,有一个 shell 问题:如何将包含 NUL 的字符串作为命令行参数传递给实用程序。

Shell 变量不能包含NUL s,因此无法构造参数字符串并将其作为参数传递。 [注意 1] 但是,您可以构造一个包含 NUL 的流并将其通过管道传输到 stdin一些效用。剩下的只是找到一个实用程序,将其输入转换为其他实用程序的命令行参数;那将是 xargs .因此,您可以尝试以下操作:

printf '\0This is an argument' | xargs -I{} ./victim {}

但是,由于第二个问题:xargs,这不会起作用(大多数 argv 的实现甚至不允许您尝试 [注 2])参数 main NUL 的数组-terminated 字符串,因此每个命令行参数都由第一个 NUL 终止.因此,即使您设法找到一种方法将所有字节传递到 argv数组,该实用程序将处理 NUL作为结束争论,而不是作为争论的一部分。 (例如,printf(argv[1]) 将打印第一个参数中的字节,直到它到达 NULNUL 表示格式字符串结束。)

但是你找不到办法做到这一点,因为 exec*系统库函数(其中一个是将参数传递给另一个可执行文件所必需的)也将处理 NUL作为终止相应的论点。自 exec*函数需要将参数复制到新的可执行镜像的地址空间中,当到达参数末尾时,复制将终止,即NUL之后的任何字节。将不被复制。


注意事项:

  1. Shell 有不同的方式来处理尝试插入 NUL使用命令替换。例如,Bash 只是删除了 NUL。 s,但其他 shell 可能会在第一个 NUL 处终止替换.

  2. 作为记录,xargs 的 Gnu 实现将产生以下有用的消息:

    xargs: Warning: a NUL character occurred in the input. It cannot be passed through in the argument list. Did you mean to use the --null option?

关于c - 写入以空字节开头的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35341379/

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