gpt4 book ai didi

c - 将十六进制传递给 C 中的 bash 命令

转载 作者:太空狗 更新时间:2023-10-29 12:14:11 24 4
gpt4 key购买 nike

我正在尝试将 bash 脚本移植到 c。我在将十六进制字符串传递给 bash 命令时遇到问题。这是我到目前为止所拥有的。

char buffer[512];
char mp_fmt[] = "\x00\x00\x00\x00\x00\x09\x01\x10\x00\x00\x00\x01\02\x00\x01";
sprintf(buffer,"echo -e \"\x00\x00\x00\x00\x00\x09\x01\x10\x00\x00\x00\x01\02\x00\x01\" | nc 192.168.01.22 500");
//sprintf(buffer,"echo -e \"%s\" | nc 192.168.01.22 500");
system((char *)buffer);

当我运行它时,编译器返回这个

test.c:7:5: warning: embedded ‘\0’ in format [-Wformat-contains-nul]
sprintf(buffer,"echo \"\x00\x00\x00\x00\x00\x09\x01\x10\x00\x00\x00\x01\02\x00\x01\" | nc 192.168.01.22 500");

但是当我用另一个被注释掉的 sprintf 运行它时,它不会提示但它不工作,因为设备没有响应。

同样在 bash 脚本中,它是这样完成的,我从设备得到响应。

echo -e "\0\0\0\0\0\x9\x1\x10\0\0\0\01\02\0\x01" | nc 192.168.01.22 500

感谢您阅读我的长篇文章。

最佳答案

这样做,您不需要 0 字节,而是文字字符串 \0。所以,

sprintf(buffer, "echo \"\\0\\0\\0\\0\\0\\x9\\x10 [...]

会起作用。

话虽这么说,但还有一些其他问题

最简单的是:缓冲区有什么用?您没有任何格式,因此只需按字面意思使用您的命令字符串!

下一步:使用 C 中的 echo?真的吗?你像这样 fork 3(!) 个进程。至少,对 nc 使用 popen() 并在那里输入字符串 fwrite()

更好的是:您只需将一些数据发送到套接字。有一个非常好的 bsd sockets API,不需要调用任何外部工具。

[编辑]:通过自己使用套接字,您可以发送原始 0 字节。

[edit2]:一些sketchup代码

#include <sys/socket.h>
#include <netinet/in.h>

[...]

int fd;
struct sockaddr_in sin;
char mp_fmt[] = "\x00\x00\x00\x00\x00\x09\x01\x10\x00\x00\x00\x01\x02\x00\x01";

fd = socket(AF_INET, SOCK_STREAM, 0);
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = inet_addr("192.168.1.22");
sin.sin_port = htons(500);

connect(fd, (struct sockaddr *)&sin,sizeof(struct sockaddr_in));

write(fd, mp_fmt, 15);

shutdown(fd, SHUT_RDWR);
close(fd);

关于c - 将十六进制传递给 C 中的 bash 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31570029/

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