Tag: 汇编

在解释C代码时定义了什么数值?

我正在理解程序集和C代码。 我有以下C程序,编译后只生成Object文件。 #include int main() { int i = 10; int j = 22 + i; return 0; } 我执行了以下命令 objdump -S myprogram.o 上述命令的输出是: objdump -S testelf.o testelf.o: file format elf32-i386 Disassembly of section .text: 00000000 : #include int main() { 0: 55 push %ebp 1: 89 e5 mov %esp,%ebp 3: 83 ec 10 sub […]

在程序集中调用C函数

尽管我到处搜索,但我找不到解决问题的方法。问题是我在C文件“hello.c”中定义了一个函数“hello_world()”,我想在汇编文件中调用此函数。 “hello_assembly.asm”。任何人都可以帮帮我吗? 谢谢。

x86_64程序集约定保存参数寄存器

我正在编写一些x86_64程序集来调用C函数。 我的C函数接受1个参数,因此程序集将参数放在%rdi 。 ABI pdf(下面链接)表示其他6个参数寄存器(rsi,rdx,rcx,r8,r9)不会在函数调用中保留。 但是,由于我的C函数只需要一个long参数,我是否可以保证C函数是否会破坏其他5个寄存器? 我的假设是,如果参数的值发生了变化,那么参数寄存器只会被破坏: void foo(int a, int b) { a++; /* %rdi will be changed, but %rsi won’t be changed when control returns. */ } 我问,因为我想在我的C函数调用中保留其他5个参数寄存器的值(无需手动显式地从堆栈中推送/弹出它们)。 x86_64 ABI – http://www.x86-64.org/documentation/abi-0.99.pdf

Shellcode:执行2次execve()调用

我试图在汇编中编写shellcode。 我需要执行/usr/bin/killall命令和/usr/bin/wget命令。 我有两个命令在shellcode中使用execve()系统调用完美运行。 但是现在我想要将这两个结合起来,但这是不可能的,因为程序在执行第一个execve()调用时退出。 (来自execve()的手册页: execve()在成功时不返回)。 如何执行2次execve()调用? 或者是否有另一种方法可以从同一个shell代码中调用/usr/bin/killall和/usr/bin/wget ? 提前致谢并表示感谢!

如何在AT&T语法中引用gcc内联汇编中的文字寄存器?

我试图引用寄存器文字; 我需要这个,因为我想使用像mulx这样的指令,这些指令要求其中一个输入位于rdx 。 我试过这个: #include int main() { uint64_t x = 15, y = 3, z, w; asm (“mov %[x], rdx\t\n” “mulx %[y], %[z], %[w]\t\n” : [z] “=&r” (z), [w] “=&r” (w) : [x] “r” (x), [y] “r” (y) : “rdx” ); return z + w; } 只适用于-masm=intel ,否则给出 $ gcc foo.c /tmp/ccGealWM.o:在函数`main’中: foo.c :(。text […]

为什么ICC在x86上的汇编中产生“inc”而不是“add”?

在摆弄简单的C代码的同时,我发现了一些奇怪的东西。 为什么ICC在为增量生成的汇编代码中生成incl %eax而不是addl $1, %eax ? GCC的行为与预期的一样,使用add 。 示例代码(GCC和ICC上使用的-O3 ) int A, B, C, D, E; void foo() { A = B + 1; B = 0; C++; D++; D++; E += 2; } ICC的结果 L__routine_start_foo_0: foo: movl B(%rip), %eax #5.13 movl D(%rip), %edx #8.9 incl %eax #5.17 movl E(%rip), %ecx #10.9 addl $2, %edx […]

是否有可能在没有暴力强迫的情况下解决这个等式?

是的,所以我试图从crackmes.de http://crackmes.de/users/lutio/keygenme1_by_lutio/尝试keygen这个程序 我不是要求某人为我做这件事,我只是问它是否可能没有暴力强迫。 我通常不会遇到这类问题,但由于某种原因,该用户不使用用户名中的任何变量,只使用序列号。 他还说强盗不允许解决他的关键因素。 我相信没有暴力强迫就无法解决。 有人真的知道它是否可以在没有强制执行的情况下解决? 这基本上就是我的代码: unsigned int key = 0x1FE339E4; //compute == this for success unsigned int serialvar = unknown; //gennerated according to serial unsigned int magic1 = 0x1FE339E7; for( int i = 0; i < 0x10; i++ ) { serialvar = (((magic1 * i + serialvar) <> 0x10) ^ serialvar) + […]

我的(AT&T)程序集(x86-x64)代码应该增加但不增加

我正在尝试组装一个小程序(AT&T)。 我试图以整数的forms从用户那里获得一个输入,然后在它之后递增,然后输出递增的值。 但是,该值不会增加。 我花了最后几个小时尝试我能想到的一切,但它仍然不起作用,所以我有一个想法,我可能不太了解汇编中的概念,导致我没有发现错误。 这是我的代码: 1 hiString: .asciz “Hi\n” 2 formatstr: .asciz “%ld” 3 4 .global main 5 6 main: 7 movq $0, %rax #no vector registers printf 8 movq $hiString, %rdi #load hiString 9 call printf #printf 10 call inout #inout 11 movq $0, %rdi #loading exit value into register rdi 12 call exit […]

为什么main在没有变量时初始化堆栈帧

为什么这个代码: #include “stdio.h” int main(void) { puts(“Hello, World!”); } 决定初始化堆栈帧? 这是汇编代码: .LC0: .string “Hello, World!” main: push rbp mov rbp, rsp mov edi, OFFSET FLAT:.LC0 call puts mov eax, 0 pop rbp ret 为什么编译器初始化一个堆栈帧只是为了以后它被销毁,而它是否曾经被使用过? 这肯定不会导致主函数外部的任何错误,因为我从不使用堆栈,所以我不会导致任何错误。 为什么这样编译?

Nokogiri编译错误 – 找不到库/标题

尝试安装gem,但无法找到标题,尽管指定了它们: sudo gem install nokogiri — –with-xml2-lib=/usr/local/lib –with-xml2-include=/usr/local/include/libxml2 –with-xml2-include=/usr/local/include/libxml2 –with-xslt-include=/usr/local/include/libxslt Building native extensions. This could take a while… ERROR: Error installing nokogiri: ERROR: Failed to build gem native extension. /usr/bin/ruby extconf.rb –with-xml2-lib=/usr/local/lib –with-xml2-include=/usr/local/include/libxml2 –with-xml2-include=/usr/local/include/libxml2 –with-xslt-include=/usr/local/include/libxslt checking for #include … no —– libxml2 is missing. please visit http://nokogiri.org/tutorials/installing_nokogiri.html for help with installing dependencies. /usr/local/include/libxml2/libxml/parser.h文件确实存在,所以我不明白为什么这不起作用。 编辑:我在Centos 5.4上