이 어셈블리 코드가 자체적으로 수정되지 않는 이유

앨리스 라일

.text읽기 전용 이므로 어셈블리에서 자체 수정 코드가 가능한지 확인하고 싶었 습니다. .data대신 코드를 넣을 수 있다고 생각 했기 때문에 아래 코드를 시도했습니다.

section     .text
global      _start                            ;must be declared for linker (ld)

_start:                                       ;tell linker entry point

    mov al,3
    mov rbx,cont1                             ;store label cont1 in rbx so we can continue there
    mov cl,byte [dec_op]                      ;put the opcode of the dec instruction in cl
    mov byte [code],cl                        ;replace the inc instruction with a dec instruction
    jmp code                                  ;run the modified code
cont1:
    mov byte [dat1],al                        ;store away the changed value
    add byte [dat1],0x30                      ;turn the internal numeric value into an ascii digit
    mov eax,4                                 ;system call number (sys_write)
    mov ebx,1                                 ;stdout
    mov ecx,dat1                              ;location of data
    mov edx,2                                 ;length of data
    int 0x80                                  ;call kernel

    mov     eax,1                             ;system call number (sys_exit)
    int     0x80                              ;call kernel

section     .data

dat1        db 0,0xa                          ;location to store output
dec_op      dec al                            ;the dec instruction
code        inc al                            ;code to modify
            jmp rbx

위의 출력은

4

내가 예상했지만 2, 자체 수정 후 증가 명령 대신 감소 명령이 있어야합니다. 내가 무엇을 잘못하고 있지?

데비안 sid 64 비트를 실행하고 있으며 다음과 같이 컴파일하고 있습니다.

nasm -f elf64 sm.s
ld -s -o sm sm.o
금연 건강 증진 협회

DEC AL2 바이트가 필요 하기 때문입니다.

nasm에 의해 생성 된 "listfile"에서 (열이 약간 압축 됨) :

 26 00000000 000A     dat1        db 0,0xa                ;location to store output
 27 00000002 FEC8     dec_op      dec al                  ;the dec instruction
 28 00000004 FEC0     code        inc al                  ;code to modify
 29 00000006 FFE3                 jmp rbx

두 연산 코드의 첫 번째 바이트가 동일하므로 혼동이 있음을 알 수 있습니다.

그리고 이것은 수정입니다.

    mov cx,word [dec_op]                      ;put the opcode of the dec instruction in cl
    mov word [code],cx                        ;replace the inc instruction with a dec instruction

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

인터럽트가 C 코드로 생성되지 않고 어셈블리 명령으로 쉽게 생성되는 이유는 무엇입니까?

분류에서Dev

이 어셈블리 코드가 VGA 텍스트 모드 비디오 메모리로 인쇄하는 데 작동하지 않는 이유는 무엇입니까?

분류에서Dev

Asp.net Core 소스 코드가 어셈블리로 변환되는 이유는 무엇입니까?

분류에서Dev

생성자 / 소멸자가 g ++ 생성 어셈블리 코드에서 이와 같이 정의되는 이유는 무엇입니까?

분류에서Dev

'어셈블리를로드 할 수 없음'이지만 어셈블리가 이미로드되었습니다.

분류에서Dev

로컬 변수를 사용할 때 mov 산술이있는 유효한 어셈블리가 컴파일되지 않는 이유는 무엇입니까?

분류에서Dev

다음 어셈블리 코드가 새 줄 (0xa) 문자를 인쇄하지 않는 이유는 무엇입니까?

분류에서Dev

함수 내부에 명시 적 생성자가있는 정적 객체 선언으로 인해 코드가 끊어지는 이유는 무엇입니까?

분류에서Dev

이 어셈블리가 작동하지 않는 이유는 무엇입니까?

분류에서Dev

내 C ++ 프로그램의 어셈블리 출력이 어셈블리 코드없이 .ascii로 가득 찬 이유는 무엇입니까?

분류에서Dev

어셈블리 위의 C 코드에 정의 된 변수로 이동하려고 할 때 정의되지 않은 기호 오류

분류에서Dev

이 어셈블리 코드는 숫자를 오름차순으로 정렬합니까?

분류에서Dev

.type 매크로 없이는 ARM 어셈블리가 작동하지 않음

분류에서Dev

c 컴파일러는 부호없는 정수와 부호있는 정수를 어떻게 처리합니까? 서명되지 않은 산술 연산의 어셈블리 코드가 동일한 이유는 무엇입니까?

분류에서Dev

어셈블리 코드 :이 코드가 시작부터 끝점까지 실행되는 경우

분류에서Dev

이 16 비트 메모리 감지 어셈블리 코드가 작동하지 않는 것 같습니다.

분류에서Dev

서로 다른 디버거가 동일한 함수에 대해 서로 다른 어셈블리 코드를 출력하는 이유는 무엇입니까?

분류에서Dev

이 PIC 어셈블러 코드에서 비트가 이동하지 않는 이유는 무엇입니까?

분류에서Dev

ContractFor가 다른 어셈블리에있는 경우 C # 용 코드 계약이 작동하지 않습니다.

분류에서Dev

어셈블리를로드 한 후 PowerShell 출력이 변경되는 이유는 무엇입니까?

분류에서Dev

내 컴파일러가 중복 어셈블리 함수를 만드는 이유

분류에서Dev

이 스레드가 자체적으로 완료되지 않는 이유는 무엇입니까?

분류에서Dev

릴리스 모드에서 Visual Studio "파일 또는 어셈블리를로드 할 수 없습니다. 작업이 지원되지 않습니다."오류

분류에서Dev

x86-64 어셈블리에서 16 바이트로 정렬 된 주소로 루프가 입력되고 있는지 어떻게 알 수 있습니까?

분류에서Dev

Azure-기본 페이지로 리디렉션되지 않고 "파일 또는 어셈블리 'DotNetOpenAuth.Core'를로드 할 수 없습니다."오류 표시

분류에서Dev

이 어셈블리 프로그램이 출력을 생성하지 않는 이유는 무엇입니까?

분류에서Dev

이 어셈블리 프로그램이 출력을 생성하지 않는 이유는 무엇입니까?

분류에서Dev

스택 정리 코드가 필요한 이유는 무엇이며 어떻게 작동합니까? (어셈블리 언어)

분류에서Dev

어셈블리를로드하지 않고 참조 된 형식의 전체 이름 가져 오기

Related 관련 기사

  1. 1

    인터럽트가 C 코드로 생성되지 않고 어셈블리 명령으로 쉽게 생성되는 이유는 무엇입니까?

  2. 2

    이 어셈블리 코드가 VGA 텍스트 모드 비디오 메모리로 인쇄하는 데 작동하지 않는 이유는 무엇입니까?

  3. 3

    Asp.net Core 소스 코드가 어셈블리로 변환되는 이유는 무엇입니까?

  4. 4

    생성자 / 소멸자가 g ++ 생성 어셈블리 코드에서 이와 같이 정의되는 이유는 무엇입니까?

  5. 5

    '어셈블리를로드 할 수 없음'이지만 어셈블리가 이미로드되었습니다.

  6. 6

    로컬 변수를 사용할 때 mov 산술이있는 유효한 어셈블리가 컴파일되지 않는 이유는 무엇입니까?

  7. 7

    다음 어셈블리 코드가 새 줄 (0xa) 문자를 인쇄하지 않는 이유는 무엇입니까?

  8. 8

    함수 내부에 명시 적 생성자가있는 정적 객체 선언으로 인해 코드가 끊어지는 이유는 무엇입니까?

  9. 9

    이 어셈블리가 작동하지 않는 이유는 무엇입니까?

  10. 10

    내 C ++ 프로그램의 어셈블리 출력이 어셈블리 코드없이 .ascii로 가득 찬 이유는 무엇입니까?

  11. 11

    어셈블리 위의 C 코드에 정의 된 변수로 이동하려고 할 때 정의되지 않은 기호 오류

  12. 12

    이 어셈블리 코드는 숫자를 오름차순으로 정렬합니까?

  13. 13

    .type 매크로 없이는 ARM 어셈블리가 작동하지 않음

  14. 14

    c 컴파일러는 부호없는 정수와 부호있는 정수를 어떻게 처리합니까? 서명되지 않은 산술 연산의 어셈블리 코드가 동일한 이유는 무엇입니까?

  15. 15

    어셈블리 코드 :이 코드가 시작부터 끝점까지 실행되는 경우

  16. 16

    이 16 비트 메모리 감지 어셈블리 코드가 작동하지 않는 것 같습니다.

  17. 17

    서로 다른 디버거가 동일한 함수에 대해 서로 다른 어셈블리 코드를 출력하는 이유는 무엇입니까?

  18. 18

    이 PIC 어셈블러 코드에서 비트가 이동하지 않는 이유는 무엇입니까?

  19. 19

    ContractFor가 다른 어셈블리에있는 경우 C # 용 코드 계약이 작동하지 않습니다.

  20. 20

    어셈블리를로드 한 후 PowerShell 출력이 변경되는 이유는 무엇입니까?

  21. 21

    내 컴파일러가 중복 어셈블리 함수를 만드는 이유

  22. 22

    이 스레드가 자체적으로 완료되지 않는 이유는 무엇입니까?

  23. 23

    릴리스 모드에서 Visual Studio "파일 또는 어셈블리를로드 할 수 없습니다. 작업이 지원되지 않습니다."오류

  24. 24

    x86-64 어셈블리에서 16 바이트로 정렬 된 주소로 루프가 입력되고 있는지 어떻게 알 수 있습니까?

  25. 25

    Azure-기본 페이지로 리디렉션되지 않고 "파일 또는 어셈블리 'DotNetOpenAuth.Core'를로드 할 수 없습니다."오류 표시

  26. 26

    이 어셈블리 프로그램이 출력을 생성하지 않는 이유는 무엇입니까?

  27. 27

    이 어셈블리 프로그램이 출력을 생성하지 않는 이유는 무엇입니까?

  28. 28

    스택 정리 코드가 필요한 이유는 무엇이며 어떻게 작동합니까? (어셈블리 언어)

  29. 29

    어셈블리를로드하지 않고 참조 된 형식의 전체 이름 가져 오기

뜨겁다태그

보관