在运行Valgrind的memcheck工具时,我经常会得到数十万(或更多,因为Valgrind切断100K)的小的无效读取语句,例如:
==32027== Invalid read of size 1
==32027== at 0x3AB426E26A: _IO_default_xsputn (in /lib64/libc-2.5.so)
==32027== by 0x3AB426CF70: _IO_file_xsputn@@GLIBC_2.2.5 (in /lib64/libc-2.5.so)
==32027== by 0x3AB42621FA: fwrite (in /lib64/libc-2.5.so)
==32027== by 0x4018CA: STARCH_gzip_deflate (in /home/areynolds/trunk/utility/applications/bed/starch/bin/starch)
==32027== by 0x401F48: compressFileWithGzip (in /home/areynolds/trunk/utility/applications/bed/starch/bin/starch)
==32027== by 0x4028B5: transformInput (in /home/areynolds/trunk/utility/applications/bed/starch/bin/starch)
==32027== by 0x402F12: main (in /home/areynolds/trunk/utility/applications/bed/starch/bin/starch)
==32027== Address 0x7febb9b3c is on thread 1's stack
Run Code Online (Sandbox Code Playgroud)
这些语句指的是对我的应用程序之外的函数(" starch")的调用,它们似乎是其中的一部分libc.这是我需要关注的吗?
编辑
如果我修改fwrite调用以删除一个字节,那么我的gzip流会被破坏.这是原始代码:
int STARCH_gzip_deflate(FILE *source, FILE *dest, int level) {
int ret, flush;
unsigned …Run Code Online (Sandbox Code Playgroud) 在直接绑定(-B direct)出现之前,libc提供了许多具有两个名称的函数.例如,getpwent()和_getpwent().这两个名称在libc中引用了完全相同的功能.
libc如何使两个函数名指向同一个实现?
我认为这不应该像写两次相同的代码那么容易.
我正在为我的系统安全类编写一个返回libc攻击.首先,易受攻击的代码:
//vuln.c
#include <stdio.h>
#include <stdlib.h>
int loadconfig(void){
char buf[1024];
sprintf(buf, "%s/.config", getenv("HOME"));
return 0;
}
int main(int argc, char **argv){
loadconfig();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我想使用返回libc攻击.编译和调试程序:
$ gcc -g -fno-stack-protector -o vuln vuln.c
$ gdb vuln
(gdb) break loadconfig
(gdb) run
Reached breakpoint blah blah blah.
(gdb) p $ebp
$1 = (void *) 0xbfffefb0
(gdb) p system
$2 = {<text variable, no debug info>} 0x0016db20 <system>
(gdb) p exit
$3 = {<text variable, no debug info>} 0x001639e0 <exit>
(gdb) x/2000s …Run Code Online (Sandbox Code Playgroud) 这是第一次(在我的新开发环境中)我看到valgrind抱怨mktime,但我不确定这是否是libc库,valgrind或我的代码中的错误.我将从错误(下面)开始 - 这是否足以解释原因?
==3682== at 0x38ACE9A505: __mktime_internal (in /lib64/libc-2.12.so)
==3682== by 0x4D66F7: ???
==3682== by 0x4D7611: ???
==3682== by 0x4D23CD: ???
==3682== by 0x4D175B: ???
==3682== by 0x38ACE1ECDC: (below main) (in /lib64/libc-2.12.so)
==3682== Uninitialised value was created by a stack allocation
==3682== at 0x4D64BE: ???
==3682==
==3682== Conditional jump or move depends on uninitialised value(s)
==3682== at 0x38ACE9A505: __mktime_internal (in /lib64/libc-2.12.so)
==3682== by 0x4D67DA: ???
==3682== by 0x4D7611: ???
==3682== by 0x4D23CD: ???
==3682== by 0x4D175B: ???
==3682== by 0x38ACE1ECDC: …Run Code Online (Sandbox Code Playgroud) 我想知道是否有不调用任何syscall()的libc函数?例如,对于libc函数“ strcpy()”,是否需要任何syscall调用(让我们考虑所有可能的linux系统)。
据我所知,使用超大字符串,您可以打印出前几个字符:
printf(".5s\n",string);
Run Code Online (Sandbox Code Playgroud)
并且使用小尺寸字符串,您可以用空格填充它:
printf("% 5s\n",string);
Run Code Online (Sandbox Code Playgroud)
有没有办法同时实现这两个目标?即如果它很短,请用0或空格填充它,如果它很长则截断它?
我正在一个在嵌入式设备上使用Rust的项目上进行工作,在这里我试图在Rust中编写可以从C调用的函数。我在没有标准库的情况下编译了该项目,或多或少地遵循了本教程:Embedded Rust Right现在!
我的Rust代码可以很好地编译为.o文件,但是在尝试使用arm-none-eabi-ld将C和Rust对象文件链接在一起时遇到了麻烦。我收到类似以下错误:
rustfunc.o: In function `func':
rustfunc.0.rs:(.text.hash+0x18): undefined reference to `__aeabi_memclr8'
...
/rust/src/libcore/slice.rs:1446: undefined reference to `__aeabi_memcpy'
/rust/src/libcore/fmt/num.rs:196: undefined reference to `__aeabi_memclr4'
Run Code Online (Sandbox Code Playgroud)
最让我困惑的是,即使我只是将目标文件链接在一起,但这些错误同时引用了我的Rust代码和libcore中的代码。
是否有人知道这些错误是什么意思,以及链接器为何无法解决这些问题?谢谢!
我的最终目标是使用DSM 6.0.1-7393 Update 1在我的Synology DiskStation DS1813 +上安装Nagios.但我甚至无法开始编译软件包......
当我尝试在Synology DiskStation上使用gcc时,我总是收到以下错误消息:
$ gcc hello.c -o hello.o
/lib/libc.so.6: file not recognized: File format not recognized
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
这是我的shell环境.我已尝试使用不同的LD_LIBRARY_PATH设置,但即使省略它也没有什么区别.
$ env
TERM=xterm-256color
SHELL=/bin/sh
SSH_CLIENT=192.168.2.110 51079 22
OLDPWD=/var/services/homes/egi
SSH_TTY=/dev/pts/7
LC_ALL=en_US.utf8
USER=egi
LD_LIBRARY_PATH=/opt/lib:
PAGER=more
MAIL=/var/mail/egi
PATH=/opt/sbin:/opt/bin:/sbin:/bin:/usr/sbin:/usr/bin
PWD=/var/services/homes/egi/exer
LANG=en_US.utf8
PS1=[\u@\h \W]$
SHLVL=1
HOME=/var/services/homes/egi
TERMINFO=/usr/share/terminfo
LOGNAME=shunyam
SSH_CONNECTION=xxx.xxx.xxx.xxx 51079 yyy.yyy.yyy.yyy 22
PGDATA=/var/services/pgsql
CC=gcc
_=/opt/bin/env
Run Code Online (Sandbox Code Playgroud)
编译器已经安装了ipkg,其规格如下所示:
$ gcc --verbose
Using built-in specs.
Target: i686-linux-gnu
Configured with: ../gcc-4.2.1/configure --build=i386-pc-linux-gnu --host=i686-linux-gnu --target=i686-linux-gnu --prefix=/opt --disable-nls …Run Code Online (Sandbox Code Playgroud) 如果我包含time.h,请更改“源类型参数”并重新包含该标头,它是否不应该在这些新定义中添加?我了解这是由于包括警卫而发生的。我的问题是:这是libc中的错误吗?它不应该能够处理吗?
#include <time.h>
#define _XOPEN_SOURCE 600
#include <time.h>
static struct timespec t;
Run Code Online (Sandbox Code Playgroud)
错误信息:
example.c:5:24: error: storage size of ‘t’ isn’t known
5 | static struct timespec t;
| ^
Run Code Online (Sandbox Code Playgroud)
我发现这种行为在使用编译时构建了Python扩展-std=c99。如果在包含标准库之前包含标准库,Python.h由于缺少POSIX功能的定义,将会出现编译错误。如果我将Python.hinclude 放在所有其他内容之前,那么一切都很好。当然也可以进行编译-std=gnu99。但是我想深入了解为什么发生错误,并将其提炼为上述代码示例。
这就引出了另一个问题。如果上述行为不是错误,那么_XOPEN_SOURCE在标头中设置和类似的源类型参数是否被视为不良做法?Python是否应该在其标头中删除该参数的设置,而是要求用户在编译期间进行定义或使用std=gnu99?