2013-06-04 1 views
3

64 비트 정수를 푸시하려고하는데 NASM을 어셈블 할 때 이것을 QWORD가 아닌 DWORD로보고 싶을 것 같습니다.NASM에서 64 비트 int를 푸시하는 방법은 무엇입니까?

쉘 코드를 작성하는 데 ASM을 사용하고 있습니다. 64 비트 DLL을 64 비트 프로세스에 삽입해야합니다. 첫 번째 QWORD는 오래된 명령 포인터이고 두 번째는 DLL의 주소를 포함하는 주소이고 세 번째는 LoadLibrary의 주소입니다. 자리 표시자는 런타임에 채워집니다.

section .text 
global _start 

_start: 
BITS 64 
PUSH QWORD 0xACEACEACACEACEAC 
PUSHFQ 
push rax 
PUSH QWORD 0xACEACEACACEACEAC 
MOV RAX, 0xACEACEACACEACEAC 
CALL RAX 
pop RAX 
POPFQ 
RETN 
+0

관련 정보 [64 비트 레지스터에 64 비트 상수를 추가 할 수 있습니까?] (https://stackoverflow.com/questions/20020589/can-i-add-64bit-constants-to-64bit- 레지스터)를 참조하십시오. ['mov r64, imm64'와 메모리에서로드하는 것에 대해서도 참조하십시오.] (https://stackoverflow.com/questions/46433208/which-is-faster-imm64-oror -m64-for-x86-64). –

답변

11

push imm64 명령이 없습니다. mov rax, 0xACEACEACACEACEAC; push rax

  • 메모리를 통해 이동 :
    1. 이 레지스터를 통해 이동 : 해결 방법으로 다음 중 하나를 수행 할 수 있습니다 push dword low32; mov dword [rsp+4], high32 또는 sub rsp,8; mov dword [rsp], low32; mov dword [rsp+4], high32
    2. 사용 부호 확장 : 두 부분으로 push qword [rel foo]
    3. 쓰기를 즉시 허용하는 경우
  • +1

    두 개의 푸시 명령을 사용할 수 있습니다. 첫 번째는 하단 32를 밀고 두 번째는 상단을 밀기위한 명령입니다. 이것은 유일한 실현 가능한 해결책 인 것처럼 보인다. – user2272296

    +0

    # 3과 크게 다르지 않은 이유는 무엇입니까? – Jester

    +0

    오, 그래, 그걸 몰랐어. 도와 주셔서 감사합니다. – user2272296

    관련 문제