相关疑难解决方法(0)

如何以编程方式告诉Linux处于PAE或非PAE模式?

需要创建一个脚本来检查内核是否处于PAE模式.当然,仅检查/ proc/cpuinfo标志是否具有此"pae"设置是不够的.

我们必须知道PAE机制是否实际上不仅实现了,而且还被激活.

因为PAE内核现在是新的默认值,如果你需要一个非PAE内核,那么现在必须创建另一个内核.

  1. 换句话说,我们如何判断内核在具有PAE的CPU上是否是非PAE(是测试的两个可能条件之一).

  2. 另一个是,如何在没有PAE支持的CPU上判断内核是否为PAE.

并且没有办法判断在典型的安全内核中是否使用了CONFIG_HIGHMEM或CONFIG_PAE内核配置选项.

memory kernel memory-management cpu-architecture linux-kernel

5
推荐指数
1
解决办法
1998
查看次数

如何从 C / 汇编中的内存地址执行函数?

我有以下汇编函数(已用 objdump 显示)

0000000000000000 <add>:
   0:   b8 06 00 00 00          mov    $0x6,%eax
   5:   c3                      retq  
Run Code Online (Sandbox Code Playgroud)

现在在 CI 中做了以下代码:

#include <stdio.h>

typedef int (*funcp) (int x);

unsigned char foo[] = {0xb8,0x06,0x00,0x00,0x00,0xc3};

int main(void)
{
  int i;
  funcp f = (funcp)foo;
  i = (*f);
  
  printf("exit = %d\n", i);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

在全局变量 foo 中,我在汇编中输入了我的函数的内存地址并尝试执行它,但它没有按预期返回 6。如何为它们的内存地址执行函数?此外,我可以在哪里研究更多关于该主题的信息?

obs:有时我会遇到 Segmentation fault (core dumped) 错误

c linux x86 assembly disassembly

5
推荐指数
1
解决办法
105
查看次数

在.text部分中定义只读数据的原因是什么?

我正在学习汇编和低级编程,并阅读有关它.据说我们可以将任何数据放在elf文件的.text部分中,但当然我们不能因为页面/段的不同权限而改变它.但是没有告诉那里,因为在.text部分内部有数据的原因是什么.许多C++程序员也告诉我g ++编译器

static const char DATA[] = "SOME DATA";
Run Code Online (Sandbox Code Playgroud)

也在.text部分内.我想知道,为什么不将这些数据放在.rodata部分,目的是什么?如果使用.text,那么.rodata中应该存储什么?

主要问题是在长模式下的这种行为.

c++ assembly

4
推荐指数
1
解决办法
341
查看次数

在 Linux 机器上创建并测试 x86-64 ELF 可执行 shellcode

我正在创建有关缓冲区溢出和堆栈/堆攻击的培训。我正在 Ubuntu 12.04 x86_64机器上工作,想要展示一些有错误的程序示例以及利用这些漏洞的方法。

我试图从迄今为止找到的最基本的 shellcode 开始,即简单的 exit 调用,它应该退出溢出的程序。

因此exitcall.asm

;exitcall.asm

[SECTION .text]

global _start

_start:
    xor ebx,ebx     ; zero out ebx, same function as mov ebx,0
    mov al, 1       ; exit command to kernel
    int 0x80
Run Code Online (Sandbox Code Playgroud)

我从其他教程中得到了这个 asm 文件,但它是为i386架构编写的。接下来要做的是生成一个目标文件并将其设为二进制可执行文件:

# nasm -f elf64 exitcall.asm

# ld -o exitcall exitcall.o 

# file exitcall

        exitcall: ELF 64-bit LSB  executable, x86-64, version 1 (SYSV), statically linked, not stripped

# strace ./exitcall

        execve("./exitcall", ["./exitcall"], [/* 73 vars */]) …
Run Code Online (Sandbox Code Playgroud)

linux x86-64 nasm elf shellcode

3
推荐指数
1
解决办法
6372
查看次数

gcc execstack标志究竟允许在什么情况下使用,以及如何执行呢?

我这里有一些示例代码,用于理解初学者CTF的某些C行为:

// example.c

#include <stdio.h>


void main() {
        void (*print)();

        print = getenv("EGG");
        print();
}
Run Code Online (Sandbox Code Playgroud)

编译: gcc -z execstack -g -m32 -o example example.c

用法: EGG=$(echo -ne '\x90\xc3) ./example

如果我用execstack标志编译代码,则程序将执行我在上面注入的操作码。没有该标志,该程序将由于分段错误而崩溃。

为什么会这样呢?是因为getenv将实际的操作码存储在堆栈上,而execstack标志允许跳转到堆栈吗?还是getenv将指针推入堆栈,关于内存的哪些部分可执行的还有其他一些规则?我阅读了联机帮助页,但是我无法确切了解规则是什么以及如何执行它们。

另一个问题是,我认为我确实也缺少在调试时可视化内存的好工具,因此很难弄清楚这一点。任何建议将不胜感激。

c x86 gcc

3
推荐指数
1
解决办法
242
查看次数

在c中执行字符串的内容

#include<stdio.h>
#include<stdlib.h>

char code[] ="\x52\x56\x57\x50\xB8\x41\x00\x00\x00\x50\xB8\x01\x00\x00\x00\xBF\x01\x00\x00\x00\x48\x89\xE6\xBA\x01\x00\x00\x00\x0F\x05\x58\x58\x5F\x5E\x5A\xC3";

int main(){
    void(*func)() = (void (*)())code;
    (*func)();
    return 0 ;
    
}
Run Code Online (Sandbox Code Playgroud)

我这里有一个字符串,它存储一个二进制代码来打印一个字符 ('A') ,我将它作为函数指针传递给 func ,而不是我尝试执行它。输出 :

$ ./test
Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)

这是汇编代码:

0:  52                      push   rdx
1:  56                      push   rsi
2:  57                      push   rdi
3:  50                      push   rax
4:  b8 41 00 00 00          mov    eax,0x41
9:  50                      push   rax
a:  b8 01 00 00 00          mov    eax,0x1
f:  bf 01 00 00 00          mov    edi,0x1
14: 48 89 e6                mov    rsi,rsp
17: …
Run Code Online (Sandbox Code Playgroud)

c linux string assembly segmentation-fault

3
推荐指数
1
解决办法
96
查看次数

用c在内存二进制文件中执行

我目前被困在我的 c 项目上,我试图用 C 语言在内存中运行一个程序,但我一直都有分段错误。

首先我有一个简单的hello_worl.c,我编译它,我有输出hello_world

第二,我hello_world像这样转换为 C 标头:

xxd -i hello_world > hello.h

(hello.h 的内容)

unsigned char hello[] = {
...
}
unsigned int hello_len = 16696;
Run Code Online (Sandbox Code Playgroud)

最后,我创建了程序main.c,看起来像这样:

#include <stdio.h>
#include <string.h>
#include <sys/mman.h>
#include "hello.h"

int main ()
{
    int (*my_hello) () = NULL;

    // allocate executable buffer
    my_hello = mmap (0, sizeof(hello), PROT_READ|PROT_WRITE|PROT_EXEC,
                MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);

    // copy code to buffer
    memcpy (my_hello, hello, sizeof(hello));
    __builtin___clear_cache (my_hello, my_hello + …
Run Code Online (Sandbox Code Playgroud)

c linux x86-64 dynamic-memory-allocation

1
推荐指数
1
解决办法
228
查看次数