需要创建一个脚本来检查内核是否处于PAE模式.当然,仅检查/ proc/cpuinfo标志是否具有此"pae"设置是不够的.
我们必须知道PAE机制是否实际上不仅实现了,而且还被激活.
因为PAE内核现在是新的默认值,如果你需要一个非PAE内核,那么现在必须创建另一个内核.
换句话说,我们如何判断内核在具有PAE的CPU上是否是非PAE(是测试的两个可能条件之一).
另一个是,如何在没有PAE支持的CPU上判断内核是否为PAE.
并且没有办法判断在典型的安全内核中是否使用了CONFIG_HIGHMEM或CONFIG_PAE内核配置选项.
memory kernel memory-management cpu-architecture linux-kernel
我有以下汇编函数(已用 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) 错误
我正在学习汇编和低级编程,并阅读有关它的书.据说我们可以将任何数据放在elf文件的.text部分中,但当然我们不能因为页面/段的不同权限而改变它.但是没有告诉那里,因为在.text部分内部有数据的原因是什么.许多C++程序员也告诉我g ++编译器
static const char DATA[] = "SOME DATA";
Run Code Online (Sandbox Code Playgroud)
也在.text部分内.我想知道,为什么不将这些数据放在.rodata部分,目的是什么?如果使用.text,那么.rodata中应该存储什么?
主要问题是在长模式下的这种行为.
我正在创建有关缓冲区溢出和堆栈/堆攻击的培训。我正在 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) 我这里有一些示例代码,用于理解初学者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将指针推入堆栈,关于内存的哪些部分可执行的还有其他一些规则?我阅读了联机帮助页,但是我无法确切了解规则是什么以及如何执行它们。
另一个问题是,我认为我确实也缺少在调试时可视化内存的好工具,因此很难弄清楚这一点。任何建议将不胜感激。
#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 项目上,我试图用 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)