0

NASMを使用してLinuxの端末に基本的な入出力コードを書き込もうとしています。ユーザーがデータを入力できるようにしたいのですが、ユーザーがバッファ長よりも多くのデータを入力すると、バッファオーバーフローが発生するという問題があります。入力されたデータがバッファ長よりも大きいかどうかを確認しようとしています。そうであれば、ユーザーに「データを入力してください:」をもう一度尋ねます。

これが私の現在のコードです:

SECTION .bss
        BUFFLENGTH equ 8 ;The max length of our Buffer
        Buff: resb BUFFLENGTH ;The buffer itself 
SECTION .data
 Prompt: db "Enter Data: ",10
 PromptLen: equ $-Prompt
SECTION .text 



    global _start
_start:

DisplayPrompt:
       mov eax, 4
       mov ebx, 1
       mov ecx, Prompt 
       mov edx, PromptLen
       int 80h
Read:
       mov eax, 3 ;Specify sys_read call
       mov ebx, 0; Specify File Descriptor 0 : STDIN (Default to keyboard input)
       mov ecx, Buff; pass offset of the buffer to read to
       mov edx, BUFFLENGTH ; Tell sys_read to read BUFFLEN 
       int 80h ;make kernel call
       mov esi, eax
       cmp byte[ecx+esi], BUFFLENGTH ;compare the returned bufferSize to BUFFLENGTH
       jnbe DisplayPrompt ;Jump If Not Below or Equal To BUFFLENGTH


Write:
       mov edx, eax ;grab the size of the buffer that was used (charachter length)
       mov eax, 4 ;specify sys_write
       mov ebx, 1 ; specify File Descriptor 1: STDOUT 
       mov ecx, Buff ;pass the offset of the Buffer 
       int 80h ;make kernel call

Exit:
       mov eax, 1 ; Code for Exit syscall
       mov ebx, 0 ; Exit code { = 0; Program ran OK }
       int 80h ; make kernel call

ここで、データを比較する方法にエラーがあると思います:

 mov esi, eax
       cmp byte[ecx+esi], BUFFLENGTH ;compare the returned bufferSize to BUFFLENGTH
       jnbe DisplayPrompt ;Jump If Not Below or Equal To BUFFLENGTH

どんな助けでも大歓迎です。ありがとう。

4

1 に答える 1

0

ここで「バッファ オーバーフロー」と呼んでいるものは、バッファ オーバーフローの一般的な定義ではありません。私が正しく理解している場合、このシナリオで「バッファオーバーフロー」を考慮しているのは、「ユーザーがバッファ長よりも多くのデータを入力しないように制限するのではなく、データが端末に溢れ出る」ことです。しかし実際には、ユーザーはバッファー長よりも多くのデータを入力することはできません。何が起こっているかというと、read() は stdin から 8 バイトを読み取り、残りのバイトは、プログラムが終了したときに bash が読み取る stdin に「まだ」あり、「\n」は「こぼれているバイト」を実行しようとします。あなたが彼らを呼ぶように。これはセキュリティ上の問題ではないため、これを変更する理由はありません。ユーザーは、そのようにプログラムの所有者としてコマンドを実行できません。本当にこれを取り除きたい場合は、malloc() を使用して「十分な大きさ」のバッファを割り当てることができます。そうすれば、ユーザーがどれだけ入力しても、バッファーは十分に大きくなり (RAM の量などによって異なります)、これらの「こぼれたバイト」は表示されなくなります。

于 2012-07-05T20:03:33.443 に答える