我正在尝试使用基本的XOR函数,我试图将用户输入的十六进制字符串x 0x43424143
替换为0x41
的键。
我编写的代码可以使用,但我对一些奇怪的结果有点好奇。下面编写的代码适用于NASM,它将在Windows上编译和运行(我正在使用外部C库函数scanf
和printf
)。
我有几个版本,一个是十六进制字符串作为输入,另一个是硬编码的版本,第二个版本只是为了让事情变得简单,同时找出其他一些东西。
两个版本都提供了相同的奇怪输出,我确信这是错误的。我很好奇,如果我错过了关于我如何做事的任何明显的事情,我仍然是一个非常大的组装和逆向工程的菜鸟。这有点模糊,所以如果没有明显的地方我会出错,那么我会高兴地继续戳它,直到我发现什么是错的。
section .data ;Constant Variable declared here
msg db "Prompt: ", 0
msg2: db 'RESULT: %x : %x ,10,0
fmt db "%s", 0
section .bss ;Reserve data for modifiable variables declared here, i.e. resb in NASM = reserve bytes
inpt resb 155
section .text ;Executable code here
extern _printf ;Calling external C lib function printf, scanf
extern _scanf
global _main ;Main function
_main:
push ebp
mov ebp, esp ;Set up the stack frame to set up the main function
push msg ;The initial prompt
call _printf
add esp, 4
push inpt ;Get user input
push fmt
call _scanf
add esp, 8
xor eax, eax ;Clean things up, ensure that there is no garbage in eax before we start to XOR things
push eax
;push DWORD(0x70757573) ;An old local variable when I was hard coding what I was xoring.
push inpt
push esp
pop esi
mov edi,esi
mov edx,edi
cld ;Clearing th3e direction flag
mov ecx,0x80
mov ebx,0x41 ;hardcoded our key to XOR the input with
mov eax, inpt
xor eax,ebx ;XOR the value in EAX with the x41 Value in EBX
stosb ;Store the result in EDI.
push edi ;Push EDI to be printed, Result shoudl be stored here via the stosb instruction
push msg2 ;Push the result print message
call _printf ;call the print function
add esp, 20 ;This cleans up the stack. We pushed 5 things onto the stack each were 4 bytes long.
mov esp, ebp ;Destroy the stack frame after the function has finished
pop ebp
ret
简化版和较短版本的代码,没有提示:
section .data ;Constant Variable declared here
msg: db 'RESULT: %x ',10,0
var1: dw 0x70757573 ;hex string to be XOR'd
var2: db 0x41 ;Xor key to use
section .text ;Executable code here
extern _printf ;Calling external C lib function printf
global _main ;Main function
_main:
push ebp ;Set up the stack frame to set up the main function
mov ebp, esp ;
sub esp, 4 ;Reserve space for a 32 bit variable. [4 bytes = 8*4=32]
mov eax, [var1] ;Variable 1 to be XOR'd
mov ebx, [var2] ;Variable 2, The key to xor var1 with
xor eax, ebx ;The XOR function
push eax ;Push eax which should contain the result
push msg ;push the result message
call _printf ;call the print function
add esp, 8 ;clean up the stack
mov esp, ebp ;Destroy the stack frame after the function has finished
pop ebp
ret
答案 0 :(得分:3)
mov eax, inpt xor eax,ebx
您实际上并未使用call _scanf
所获得的输入!使用NASM,您需要使用方括号来获取内存内容。没有它们,您只需在EAX
寄存器中获取 inpt 的地址。
mov eax, [inpt]
xor eax, ebx
push esp pop esi
这真的只是mov esi, esp
。
add esp, 20 ;This cleans up the stack. We pushed 5 things onto the stack each were 4 bytes long.
错误!您的代码在堆栈上只有16个字节。您使用push esp
后立即删除了第五件事 pop esi
。
最后要显示单个数字结果,请相应地更改格式字符串并使用:
msg2: db 'RESULT: %x ',10,0
...
mov eax, [inpt]
xor eax, ebx
push eax ;Push EAX to be printed
push msg2 ;Push the result print message
call _printf ;call the print function
add esp, 4
最后一条建议:不要在程序中留下旧代码!您首先尝试使用硬编码(0x70757573),然后切换到输入,但您没有删除一些先前相关的说明。这样做产生了一个难以阅读的程序,有多个错误。
xor eax, eax ???
push eax ???
;push DWORD(0x70757573) ???
push inpt ???
push esp ???
pop esi ???
mov edi,esi ???
mov edx,edi ???
cld ???
mov ecx,0x80 ???
mov ebx,0x41
mov eax, inpt
xor eax,ebx
stosb ???
答案 1 :(得分:2)
指令
stosb ;Store the result in EDI.
将AL的内容存储到EDI中包含的内存地址中。
然后显示EDI的值。所以你要显示地址;大概你想看到XOR操作的内容看起来像是32位。而不是
xor eax,ebx ;XOR the value in EAX with the x41 Value in EBX
stosb ;Store the result in EDI.
push edi ;Push EDI to be printed, Result shoudl be stored here via the stosb instruction
push msg2 ;Push the result print message
call _printf ;call the print function
相反,你可能想要
xor eax,ebx ;XOR the value in EAX with the x41 Value in EBX
push eax ;Push result to be printed
push msg2 ;Push the result print message
call _printf ;call the print function
但是,这也存在问题。 msg2
可能是RESULT: %x : %x \n
(程序集中缺少结束引号)。更重要的是,它需要格式化两个整数值。因此,应该推送一个额外的值:
xor eax,ebx ;XOR the value in EAX with the x41 Value in EBX
push eax ;Push result to be printed
push (something else)
push msg2 ;Push the result print message
答案 2 :(得分:2)
var1: dw 0x70757573 ;hex string to be XOR'd var2: db 0x41 ;Xor key to use
您将这些变量用作 dword ,但您已将其定义为 word 和 byte !
要么将它们重新定义为dwords:
var1: dd 0x70757573 ;hex string to be XOR'd
var2: dd 0x41 ;Xor key to use
或更改使用它们的代码:
movzx eax, word [var1] ;Variable 1 to be XOR'd
movzx ebx, byte [var2] ;Variable 2, The key to xor var1 with
或同时做两件事:
var1: dd 0x70757573 ;hex string to be XOR'd
var2: db 0x41 ;Xor key to use
...
mov eax, [var1] ;Variable 1 to be XOR'd
movzx ebx, byte [var2] ;Variable 2, The key to xor var1 with