FTZ level7 암호화

2017. 5. 23. 14:32SystemHacking/FTZ

 

 

 

아주아주 간단한 문제입니다


< 그림 7.1 >


비밀번호를 입력했더니 나온 이상한 문자가 보이시나요 ?

" --_--_- --____- ---_-__ --__-_- " 힌트에서 2진수를 10진수로 바꿀 수 있는지 물어보았습니다

이 이상한 문자들은 2진수일까요 ? " 1101101 1100001 1110100 1100101 " 로 볼 수 있습니다 !

친절하게 띄어쓰기가 되어있어서 구분하기가 쉽습니다


아스키 테이블을 보고 해당 2진수를 바꿔보도록 합시다


< 그림 7.2 > 

< 그림 7.3 >

mate ... 정답입니다 level8의 패스워드가 나왔습니다


문제는 쉽게 풀었고 해당 파일을 gdb로 분석해봅시다 !!


< 그림 7.4 >


[1] <main+21>:    call    0x8048344 <malloc>

malloc(0x64)    100byte의 메모리공간을 할당해주는 함수


[2] <main+40>:    call    0x8048384 <printf>

printf( "Insert The Passord : " );


[3] <main+51> ~ <main+62>:    call    <fgets>

fgets( 입력받은 값을 저장할 공간 , 얼마나 입력할 지 크기 , STDIN );

fgets( input , $0x64 , STDIN );    input변수에 100byte크기 만큼 문자열을 입력하는 함수


[4] <main+73> ~ <main+83>:       call <strncmp>

scrncmp( str1 , str2 , n )    => 문자열 str1과 str2를 길이 n 만큼 서로 비교한다

strncmp( input , "mate" , 0x4 )    => 사용자가 입력한 값과 "mate"를 비교한다


[5] <main+91>,<main+93>    strncmp의 결과에 따라 jump한다

mate와 일치한다면 코드가 그대로 진행되며 printf함수가 호출된다

printf( "\nCongratulation! next password is \n"break the world\".\n\n" );

그리고 exit(0) 함수가 호출되어 함수는 종료 된다    ㅡ 그림 7.5


jne : 사용자가 입력한 값 input이 mate와 일치하지 않으면 main+121로 점프한다    ㅡ 그림 7.5



< 그림 7.5 >


[6]<main+121 ~ 129 >

system("cat /bin/wrong.txt");     cat 명령어가 실행된다



gdb분석은 완료했고 소스코드를 복원해보면 다음과 같습니다



< 복원된 소스코드( tn ) >



#include<stdio.h>

#include<malloc.h>

int main(){

char *input = null;

char *str = "mate";


input = (char *)malloc(0x64);            // 동적으로 input변수에 100byte공간을 할당한다


printf("Insert The Password : ");


fgets( input , 0x64 , stdin );            // 사용자로부터 문자열을 입력받는다

if ( strncmp( input, str, 0x4 ) == 0 ){                                    // 입력받은 문자열이 "mate"와 일치하는지 확인

printf("\nCongratulation! next password is \"reak the world\".\n\n");

exit(0);

}else {

system("cat /bin/wrong.txt");

}

free(input);                // malloc으로 공간할당시 항상 닫아주어야한다 ( 오류방지 )

return 0;

}




* 참고 strncmp( str1, str2, n )의 리턴값

1. str1 < str2        음수 반환

2. str1 > str2        양수 반환

3. str1 == str2       0을 리턴한다


level7 문제풀이와 메모리분석이 끝났습니다 이상한점이나 부족한부분 댓글로 알려주세요 ^^