我正在尝试解决这个问题:
假设您在eax,ebx,ecx中获得了值.编写在所有寄存器中添加值的代码,并将最终结果存储在edx中.
我的代码:
mov eax,3
mov ebx,4
mov ecx,1
add edx,eax
add edx,ebx
add edx,ecx
Run Code Online (Sandbox Code Playgroud)
我是否必须初始化寄存器edx(mov edx,0)?
我编译了一个基本的漏洞利用(基本上,C中的源代码没有任何用处,只需执行执行Bash的操作码).问题是当我执行二进制文件时:"分段错误".
在这里我做了什么:
executeBash.asm(NASM)
section .text
global _start
_start:
xor EAX, EAX ; EAX = 0
push EAX ; "\0\0\0\0"
push DWORD 0x68732F2F ; "//sh"
push DWORD 0x6E69622F ; "/bin"
mov EBX, ESP ; arg1 = "/bin//sh\0"
push EAX ; NULL -> args[1]
push EBX ; "/bin//sh\0" -> args[0]
mov ECX, ESP ; arg2 = args[]
mov AL, 0X0B ; syscall 11
int 0x80 ; excve("/bin//sh", args["/bin//sh", NULL], NULL)
Run Code Online (Sandbox Code Playgroud)
在终端:
prompt$ nasm -f elf32 executeBash.asm
prompt$ ld -m elf_i386 executeBash.o -o …Run Code Online (Sandbox Code Playgroud) .model small
.stack 100h
.Data
count word 0
.code
main proc
mov cx,5
mov al,40h
mov ah,2
mov bx,0
first :
mov count,cx
inc bx
inc al
mov cx,bx
second :
mov dl,al
int 21h
loop second
mov cx ,count
mov dx,13
mov ah,2
int 21h
mov dl,10
mov ah,2
int 21h
loop first
mov ax,4c00h
int 21h
main endp
end main
Run Code Online (Sandbox Code Playgroud)
我写了这段代码并期待像这样的输出
一个
BB
CCC
DDDD
EEEEE
但得到这个输出
一个
00
000
0000
00000
任何人都可以解决这个代码中的问题,当我删除行代码行提供输出
ABBCCCDDDDEEEE
我想问为什么我们要处理R8到R15中的低字节,为什么不使用高字节?我们可以使用低字节但不可以使用高字节
我的CS课程中有一个以缓冲区溢出攻击为中心的项目.
我很难完全理解这个话题.
说我有以下功能:
08048cc5 <getbuf>:
8048cc5: 55 push %ebp
8048cc6: 89 e5 mov %esp,%ebp
8048cc8: 83 ec 38 sub $0x38,%esp
8048ccb: 8d 45 d8 lea -0x28(%ebp),%eax
8048cce: 89 04 24 mov %eax,(%esp)
8048cd1: e8 32 01 00 00 call 8048e08 <Gets>
8048cd6: b8 01 00 00 00 mov $0x1,%eax
8048cdb: c9 leave
8048cdc: c3 ret
Run Code Online (Sandbox Code Playgroud)
目前它返回此功能:
08048c53 <test>:
8048c53: 55 push %ebp
8048c54: 89 e5 mov %esp,%ebp
8048c56: 83 ec 28 sub $0x28,%esp
8048c59: e8 63 04 00 00 call …Run Code Online (Sandbox Code Playgroud) 在Intel x64手册中,它表示在32位SSE2模式下XMM寄存器为0-7.为什么95%使用这些寄存器的指令跳过0并使用1-4?
我正在尝试通过GNU在IDA的帮助下创建的逆向工程汇编代码来学习汇编(Intel语法).我很难理解汇编中对内存地址的引用,如果有人可以评论下面的代码并解释实际发生的事情,我将非常感激.
这是以下C程序:
#include <stdio.h>
int main(void)
{
char *input[20];
scanf("%s", &input);
printf("%s", input);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用Intel语法进行汇编:
push ebp
mov ebp, esp
and esp, -16
sub esp, 96 ; char *input[20]
; scanf("%s", &input)
lea eax, [esp+16] ; move the effective address of [esp+16] into EAX
mov [esp+4], eax ; &input
mov dword ptr [esp], offset aS ; %s
call _scanf
; printf("%s", input)
lea eax, [esp+10] ; move the effective address of [esp+10] into EAX
mov [esp+4], eax ; …Run Code Online (Sandbox Code Playgroud)