我对Stack Guard和SSP保护有一些疑问。如果我正确的话,第一个问题是关于Stack Guard及其三种类型的Canary-终止符,随机和随机XOR。
我想知道,如何在x86 Linux系统上禁用Stack Guard?在我读过的某个地方,可以使用此命令进行操作,同时使用gcc'-disable-stackguard-randomization ' 进行编译,就像使用该命令启用' -enable-stackguard-randomization '一样,两者均无效。如果需要,我的gcc版本是4.8.2。
关于Stack Guard的下一个问题,何时可以启用/禁用它,如何设置,要使用哪种类型的金丝雀?我读到的内容是,默认情况下使用终结器金丝雀,对于随机性,我必须使用' -enable-stackguard-randomization ' 进行编译,但是随机XOR又如何呢?(或为空0x00000000)
现在关于SSP(ProPolice),我知道,对于随机的金丝雀,我必须使用' fstack-protector-all ' 进行编译,但是终止符如何呢?默认情况下,它与Stack Guard中的一样吗?
最后一个,如果你们中的任何一个都可以告诉我,我在哪里可以找到内存中的随机金丝雀。例如,我有这种情况-编译的C程序,例如' gcc -g example.c -o example -fstack-protector-all ',因此具有随机金丝雀。假设,每次执行后,我都能获得金丝雀的地址。因此,我有:Canary = 0x1ae3f900。从不同的论文中,我得到了一些信息,即金丝雀位于.bss段中。因此,我使用readelf获取.bss段的地址:' readelf -a ./example | grep bss '。是080456c9。在gdb中,我设置了一些断点,以获取金丝雀的地址,但是当我检查.bss地址x / 20x 0x080456c9时,我看到的只是0x00000000地址,而金丝雀却无处可寻。另外,我检查了__stack_chk_fail如果它不存在,但是结果相同,我看不到它。我从PLT / GOT获取stack_chk_fail的地址。
预先感谢您的答复和时间。
比方说,我有两个程序--input.c&output.c我想做的就是使用execl()函数将一些"半金字塔"格式的有效载荷/字符发送到另一个.
Input.c中
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#define SIZE 1024
int length;
int main(int argc, char *argv[])
{
pid_t pid;
char *target;
//char payload[length+1];
char payload[SIZE + 1];
int status;
int i = 0;
if(argc < 2)
{
printf("Usage %s <length> <target>\n", argv[0]);
exit(EXIT_FAILURE);
}
length = atoi(argv[1]);
target = argv[2];
while(i < length)
{
pid = fork();
if(pid != 0)
{
waitpid(-1, &status, 0);
//exit(0);
}
if(pid == 0)
{
payload[i] = 'A';
payload[i …
Run Code Online (Sandbox Code Playgroud)