2012-02-27 13 views
-1

ですから、バッファオーバーフローに関するいくつかの調査を行っています。私はjavaに変換しようとしている可変的な攻撃に対して脆弱なCプログラムを持っています。誰も彼らが私を助けることができると思いますか?これまで私はまだJavaコードをコンパイルすることができませんでした。JAVAのバッファオーバーフロー

Cコード

#include <stdio.h> 
#include <string.h> 

/* 
A routine that checks whether the password is correct or not 
Standard library call "gets()" does not check for buffer overflow 
*/ 
int checkPassword(){ 
    char passwordFlag = 'F'; 
    char inputPwd[10]; 
    memset(inputPwd, 0, 10); 

    gets(inputPwd); 
    if (!strcmp(inputPwd, "goodpass")){ 
     passwordFlag = 'T'; 
    } 
    if (passwordFlag == 'T'){ 
     return 1; 
    } 
    else{ 
     return 0; 
    } 
} 

int main() 
{ 
    printf("Please enter a password\n"); 
    if (checkPassword() == 1) 
    { 
     printf("Successful\n"); 
     return 0; 
    } 
    else{ 
     printf("Access Denied.\n"); 
     return -1; 
    } 
} 

Javaコード(現在はコンパイルしない)バッファオーバーフローの種類は、Javaに存在しない

import java.io.*; 
class Numbers { 
    public static void main(String[] args) { 
      BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
      System.out.println("Please enter a password"); 
       if (checkPassword() == 1) 
       { 
        System.out.println("Successful"); 
        System.exit(1); //you wouldn't exit here but its not like i'm doing anything important 
       } 
       else{ 
        System.out.println("Access Denied."); 
        System.exit(1); 
       } 


    } 
    public static Integer checkPassword(){ 
       char passwordFlag = 'F'; 
       char inputPwd[10]; 
       memset(inputPwd, 0, 10); 

       gets(inputPwd); 
       if (!strcmp(inputPwd, "goodpass")){ 
        passwordFlag = 'T'; 
       } 
       if (passwordFlag == 'T'){ 
        return 1; 
       } 
       else{ 
        return 0; 
       } 
      } 
} 
+2

Javaでは、memsetのは、取得しstrcmpのは未定義です。 – Alanmars

+4

あなたのJavaコードについて多くのことがありますが...それはJavaではありません。 –

+2

Cライブラリの関数名をJavaで使用するだけではありません。これらのタスクを達成するには、Javaの方法を学ぶ必要があります。 – Nayuki

答えて

3

。 JVMレベルでは、IndexOutOfBoundsExceptionが発生します。

+0

これは、出力の 'スレッド内の例外"メイン "java.lang.ArrayIndexOutOfBoundsException:10 \t at variable.main(variable_attacke.java:6)'であるはずですが、私はその点に到達しようとしています。 – atrueresistance

+0

In Javaの一般的な文字列は、問題を回避して読み込まれ、処理されます。あなたは、FileInputStream 'int ch = in.read()'からループ内の文字を読み込んで配列に配置することができます。しかし例外として、これは脆弱性の感覚ではありません。 –

2

あなたのコードは、いくつかの問題を抱えている、私はカップルを指摘します:

char inputPwd[10]; 
memset(inputPwd, 0, 10); 

は次のようになります。

char[] inputPwd = new char[10]; 
// no need to set to 0, since arrays are initialised to zero. 

また、gets()あなたはおそらくたいと思う、ジャワに存在しません:

br.readLine(); 

(また、BufferedReaderを関数に渡す必要があります。また、eit彼女はそれを生成する可能性のある例外をキャッチまたはスローします)。これは単なる文字列ではなく行全体を読み込むことに注意してください。 バッファオーバーフローが本当に、Javaのでこのように動作し表示されていないので、

しかし、私は、それを変換する心配はないでしょう:Does Java have buffer overflows?

関連する問題