草庐IT

ASSEMBLY

全部标签

c++ - 使用 Intel Quark 的 Linux 共享库中的非法指令

我有一个linux“.a”库,它被编译用于x86。我没有这个库的源代码,程序员也不给我。我在具有这种架构的PC上运行我的程序没有问题,但是最近我买了一个带有IntelQuark处理器的嵌入式系统。该处理器具有精简的指令集,因此当我编译我的程序并尝试运行它时,我收到了一条明确的消息:“非法指令”。我知道这不是内存违规问题,因为当我使用GDB对其进行调试时,它在带有操作码(如CMOVE)的指令中完全失败,它属于PentiumPro处理器中引入的CMOVxx指令集。在我的嵌入式linux系统(Ubuntu14.04)/proc/cpuinfo"flags"字段中没有显示"cmov",所以这是

linux - 小数值相减(汇编)

如何在程序集中减去十进制值。IA32(Linux)1:movedx,1/2subecx,ebxsubecx,edxmovbal2,ecx我试过了,但它有些跳过小数点的减法。如果我输入.5,它会给我一个错误。error:junk`.5'afterexpression 最佳答案 正如lightbulbone在他的回答中正确指出的那样,在使用通用寄存器(eax等)时,您不能处理浮点值。您可以使用FPU,正如灯泡所建议的那样,但这相对乏味。或者-除非您的代码需要在古老的CPU上运行-您可以使用SSE指令来完成此任务,这要简单得多。与您所展示

linux - 小数值相减(汇编)

如何在程序集中减去十进制值。IA32(Linux)1:movedx,1/2subecx,ebxsubecx,edxmovbal2,ecx我试过了,但它有些跳过小数点的减法。如果我输入.5,它会给我一个错误。error:junk`.5'afterexpression 最佳答案 正如lightbulbone在他的回答中正确指出的那样,在使用通用寄存器(eax等)时,您不能处理浮点值。您可以使用FPU,正如灯泡所建议的那样,但这相对乏味。或者-除非您的代码需要在古老的CPU上运行-您可以使用SSE指令来完成此任务,这要简单得多。与您所展示

linux - 如何在 x86 汇编中调用 fgets?

根据thedocumentationforfgets(),该函数接受三个参数:char*-将保存输入的字符串int-一个整数,表示要读取的最大字符数FILE*-要读取的流的FILE*我调用这个函数没有问题。我只是将三个参数压入堆栈,调用函数,并将ESP增加12。我的问题是参数#3。什么应该作为标准输入的FILE*传递?在C中,我只能使用stdin,但我不知道x86汇编中的等价物是什么。更新:我在Linux上使用NASM。 最佳答案 stdin的问题在于,它是一个宏,不仅可以扩展为特定于平台的内容,而且很可能难以从汇编中手动访问。如果

linux - 如何在 x86 汇编中调用 fgets?

根据thedocumentationforfgets(),该函数接受三个参数:char*-将保存输入的字符串int-一个整数,表示要读取的最大字符数FILE*-要读取的流的FILE*我调用这个函数没有问题。我只是将三个参数压入堆栈,调用函数,并将ESP增加12。我的问题是参数#3。什么应该作为标准输入的FILE*传递?在C中,我只能使用stdin,但我不知道x86汇编中的等价物是什么。更新:我在Linux上使用NASM。 最佳答案 stdin的问题在于,它是一个宏,不仅可以扩展为特定于平台的内容,而且很可能难以从汇编中手动访问。如果

linux - 如何避免不适合缓冲区的标准输入被发送到 Linux 64 位 Intel (x86-64) 程序集中的 shell

编辑:标题已更改,因为@Gunner指出这不是缓冲区溢出。在Linux64位Intel汇编中使用NR_read从stdin读取用户输入时,我想知道如何避免不适合输入缓冲区的输入被发送到Linuxshell例如。庆典?例如,在这个示例程序中,我定义了一个255字节的输入缓冲区(缓冲区的大小可以是>=1)。超过255字节的输入的其余部分被发送到bash(如果从bash运行),这显然是一个严重的漏洞。在Linux64位程序集中应如何读取输入以避免此漏洞?这是我的代码:[bits64]section.textglobal_start;canbecompiledeg.withnasmoryasm

linux - 如何避免不适合缓冲区的标准输入被发送到 Linux 64 位 Intel (x86-64) 程序集中的 shell

编辑:标题已更改,因为@Gunner指出这不是缓冲区溢出。在Linux64位Intel汇编中使用NR_read从stdin读取用户输入时,我想知道如何避免不适合输入缓冲区的输入被发送到Linuxshell例如。庆典?例如,在这个示例程序中,我定义了一个255字节的输入缓冲区(缓冲区的大小可以是>=1)。超过255字节的输入的其余部分被发送到bash(如果从bash运行),这显然是一个严重的漏洞。在Linux64位程序集中应如何读取输入以避免此漏洞?这是我的代码:[bits64]section.textglobal_start;canbecompiledeg.withnasmoryasm

导致缓冲区溢出,段错误

我试图在以下非常简单的程序中引起缓冲区溢出:#include#includevoidbadf(intn,charc,char*buffer){charmycode[]={0xeb,0x0f,0xb8,0x0b,0x00,0x00,0x00,0x8b,0x1c,0x24,0x8d,0x0c,0x24,0x31,0xd2,0xcd,0x80,0xe8,0xec,0xff,0xff,0xff,0x2f,0x62,0x69,0x6e,0x2f,0x6c,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//37bytes//OverwriteBaseP

导致缓冲区溢出,段错误

我试图在以下非常简单的程序中引起缓冲区溢出:#include#includevoidbadf(intn,charc,char*buffer){charmycode[]={0xeb,0x0f,0xb8,0x0b,0x00,0x00,0x00,0x8b,0x1c,0x24,0x8d,0x0c,0x24,0x31,0xd2,0xcd,0x80,0xe8,0xec,0xff,0xff,0xff,0x2f,0x62,0x69,0x6e,0x2f,0x6c,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//37bytes//OverwriteBaseP

c - 有什么办法可以分析x86汇编源码中寄存器 "type"吗?

所以基本上我要做的是在我对汇编代码的分析任务中区分数据和内存地址。这是一个我很难处理的例子。假设我们在.data部分声明了一个变量val。0x0804805401000000这里是反汇编ELF文件的一行汇编代码。mov$0x08048054,%eax所以这可能是变量val的间接引用,如下所示:mov$0x8048054,%eaxmov%edx,0x4(%esp)mov%eax,(%esp)callprintf然后我会将$0x8048054转换为变量名val,如下所示:movval,%eaxmov%edx,0x4(%esp)mov%eax,(%esp)callprintf但还有另一种情况