2013-03-05 1 views
1

GDB를 사용하여 보안 클래스에 버퍼 오버 플로우가 발생하는 것을 배우고 있습니다.입력을 검사하는 gdb의 버퍼를 끌 수있는 방법이 있습니까?

sh myFile.txt | ./myProgram 

가 지금은 GDB를 사용하여 무단 기능을 검사 할 : 나는 성공적으로이 같은 입력으로 공급하면 프로그램이 버퍼 오버 플로우를 작성하여 권한이없는 기능으로 이동됩니다 입력 파일이 있습니다. 그러나 어느 한쪽을 사용하여 GDB에 myFile을 입력 할 때 tty command or using < GDB는 20 바이트 버퍼를 채우기 위해 입력의 중간 20 바이트 만 가져옵니다. GDB가 입력 버퍼 크기를 "확인"하고있는 것처럼 보입니다.

  1. 무엇 GDB를하고있다인가요?
  2. 그렇다면 해제 할 방법이 있습니까?

C 코드는 다음과 같습니다

char one[20]; 
    char two[20]; 

    printf("..."); fflush(stdout); 
    gets(one); //only takes 20 bytes from the middle of printf "morethan20bytes..." from input file 
    printf("..."); fflush(stdout); 
    gets(two); //only takes 20 bytes from the middle of printf "morethan20bytes..." from input file 
+1

어떻게 그 행동을 결정합니까? –

+0

@OliCharlesworth x 명령을 사용하여 버퍼 1과 2의 비트 수준 내용을 검사합니다. 나는 그 다음 16 진수를 ascii로 변환하고 그것이 입력의 중간에서 20 개의 문자만을 취하는 것이라고 말할 수있다. – bernie2436

+0

메모리 내용을 덮어 썼을 수도 있지만, GDB는 배열 크기를 알고 있기 때문에 표시 할 것입니다. 범위를 벗어난 인덱스를 사용하여 배열 외부를 검사하거나 포인터로 캐스트하고 오프셋을 추가 할 수 있습니다. –

답변

2

GDB 아무것도 "복용"되지 않습니다. 단지 "하나"의 내용과 더 많은 내용을보고 싶다고 가정합니다.

디버거에서 변수를 인쇄 할 때 {type} expr @ num 표기법을 알고 있습니까? 위

(gdb) next 
...10  gets(one); //only takes last 20 bytes of printf "morethan20bytes..." from input file 
(gdb) next 
BLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAH # <== simulating input 
11 printf("..."); fflush(stdout); 

(gdb) print one 
$2 = "BLAHBLAHBLAHBLAHBLAH" 

, "하나"만 20 개 문자를 가지고 나타납니다 예를 들어, "하나"버퍼 20 인덱스 과거의 내용을 볼 수 있습니다. 하지만 그것은 gdb가 20 바이트 만보고 싶어한다고 가정하기 때문입니다.

은의 지금은

(gdb) print two 
$4 = "BLAHBLAHBLAH\000\000\000\000\000\000\000" 

버퍼 길이지나가는 것을 당신은 분명히 알 수 있습니다 "한"

(gdb) print {char}[email protected] 
$3 = "BLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAH" 

의 메모리 주소에서 시작 처음 40 개 문자를 인쇄 보자 그리고 당신은 할 수 범람이 "두"로 기록 된 것을보십시오.

(gdb) x one 
0x7fffffffe750: 0x48414c42 
(gdb) print {char}[email protected] 
$6 = "BLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAH" 

위와 같이 메모리 주소를 사용하여 동일한 작업을 수행 할 수 있습니다.

관련 문제