Articles of 程序集

将在linux中运行汇编代码的结果redirect到文本文件

我正在尝试编写一个Python脚本来testing我编写的一些代码的输出与预期的输出。 但是,我很难将输出redirect到一个文件。 我写了以下内容: extern printf LINUX equ 80H ; interupt number for entering Linux kernel EXIT equ 1 ; Linux system call 1 ie exit () section .data intfmt: db "%ld", 10, 0 segment .text global main main: push rax push rsi push rdi mov rsi, 10 mov rdi, intfmt xor rax, rax call printf […]

一种不知道签名的C函数调用方法?

给定一个带有C绑定和任意签名的函数,创build一个指向该函数的指针,传递它,包装并调用它是一件简单的事情。 int fun(int x, int y) { return x + y; } void* funptr() { return (void*)&fun; } int wrapfun(int x, int y) { // inject additional wrapper logic return ((int (*)(int, int))funptr())(x, y); } 只要呼叫者和被呼叫者遵循相同的呼叫约定并签名,一切正常。 现在让我们说我想包装一个有数千个函数的库。 我可以使用nm或readelf来获取所有要封装的函数的名字,但我宁愿不必关心签名,甚至不需要包含库的相关头文件。 在某些情况下,考虑到在版本和平台之间发生的外观变化,干净地包括标题可能不是一个选项。 例如: // from openssl/ssl.h v0.9.8 SSL_CTX* SSL_CTX_new(SSL_METHOD* meth); // from openssl/ssl.h v1.0.0 SSL_CTX* SSL_CTX_new(const SSL_METHOD* meth); […]

保存寄存器?

好的,所以在C代码中,我将它循环遍历命令行参数并打印出来。 我编译它,并在GDB中打开它,看看主函数是什么样子,因为我试图在汇编中做同样的事情。 我结束了搞清楚我的问题是什么 – 我的打印function是使用相同的寄存器作为主要function。 我最终在函数调用之前将每个元素都推入堆栈,并在之后将其popup。 唯一不明白的是为什么这段代码似乎没有这样做,为什么它不会像我一样遇到同样的问题。 0x000000000040052d <+0>: push %rbp 0x000000000040052e <+1>: mov %rsp,%rbp 0x0000000000400531 <+4>: sub $0x20,%rsp 0x0000000000400535 <+8>: mov %edi,-0x14(%rbp) 0x0000000000400538 <+11>: mov %rsi,-0x20(%rbp) 0x000000000040053c <+15>: jmp 0x400561 <main+52> 0x000000000040053e <+17>: mov -0x4(%rbp),%eax 0x0000000000400541 <+20>: cltq 0x0000000000400543 <+22>: lea 0x0(,%rax,8),%rdx 0x000000000040054b <+30>: mov -0x20(%rbp),%rax 0x000000000040054f <+34>: add %rdx,%rax 0x0000000000400552 <+37>: mov (%rax),%rax […]

为什么nasm说我在g ++创build的程序集中有错误?

我有这个c + +代码: #include <iostream> using namespace std; int main () { char chr[] = "111111111111"; int pop = 9999; cout << chr << (pop+1) << endl; } 当我在shell(64位Linux)中执行g++ -S hello.cpp我得到汇编代码: 当我用它nasm hello.s它说它包含了很多的错误,如: instruction needed expression syntax error symbol `popq' redefined 也许这是因为它是64位? 我怎样才能编译我用g ++创build的.s?

内联assembly可以closures保护模式吗?

如果用户没有root权限,该用户是否还可以使用内联汇编编写用户空间程序,以closures计算机上的保护模式,以覆盖其他段中的内存(假定操作系统是Linux)?

汇编函数整数本地variables

我正在学习基本的汇编。 我用C编写了一个简单的程序来翻译成汇编: void myFunc(int x, int y) { int z; } int main() { myFunc(20, 10); return 0; } 这是我认为这个函数的正确翻译是: .text .globl _start .type myFunc, @function myFunc: pushl %ebp #Push old ebp register on to stack movl %esp, %ebp #Move esp into ebp so we can reference vars sub $4, %esp #Subtract 4 bytes from […]

debugging对于Linux

现在,我正在扩展更多的x86汇编知识,而学习的最佳工具之一就是DEBUG 。 当我学习Assembly(过去4年)时,我在Windows上,但现在我在Linux Ubuntu上,而DEBUG工具只适用于Windows。 然后我想知道是否有任何端口或等效的Linux。 请记住,我不想debugging我的代码,但要做的事情,如命令 -r , -t , -e …

什么语言允许我与操作系统的内核进行交互

我希望在内核编程方面有所作为,主要是为了更好地理解它,而不是试图创build自己的操作系统或任何东西。 但我很困惑,即使我需要编程什么语言来做到这一点,更不用说什么IDE(如果有一个),我可以使用编译器? 我想尝试与Unix内核进行交互(因此Linux内核是正确的,这是一个混合内核?)还是Windows 7内核(这是一个混合内核是不是?,旧版本的Windows是Monolithic? )。 如果我想与上面提到的内核进行交互,我应该使用哪种语言?我可以下载哪些编译器(&IDE)来运行我的代码? 我会考虑使用c(我已经做了很多的win32编程,所以我习惯c&c ++)或程序集? 你也知道有任何与其中一个内核交互的教程吗?

内核崩溃导致的Linux系统调用(奇怪的偏移量)

我试图调用一个内核模块的系统调用,我有这样的代码: set_fs( get_ds() ); // lets our module do the system-calls // Save everything before systemcalling asm (" push %rax "); asm (" push %rdi "); asm (" push %rcx "); asm (" push %rsi "); asm (" push %rdx "); asm (" push %r10 "); asm (" push %r8 "); asm (" push %r9 […]

ROT13密码组装

所以我有我的ROT13密码做我想做的事情,但最后命令提示符显示在最后一行输出的同一行。 这是我在大会的第一个项目,所以我很不确定我做错了什么。