pwnable.kr collision

4129 ワード

タイトル:
タイトルリンク:http://pwnable.kr/play.php -->接続ログインソースコードは以下の通りです.
#include <stdio.h>
#include <string.h>
unsigned long hashcode = 0x21DD09EC;
unsigned long check_password(const char* p){
        int* ip = (int*)p;
        int i;
        int res=0;
        for(i=0; i<5; i++){
                res += ip[i];
        }
        return res;
}

int main(int argc, char* argv[]){
        if(argc<2){
                printf("usage : %s [passcode]
"
, argv[0]); return 0; } if(strlen(argv[1]) != 20){ printf("passcode length should be 20 bytes
"
); return 0; } if(hashcode == check_password( argv[1] )){ system("/bin/cat flag"); return 0; } else printf("wrong passcode.
"
); return 0; }

に従って
if(strlen(argv[1]) != 20){
        printf("passcode length should be 20 bytes
"
); return 0; }

入力される長さは20です.
if(hashcode == check_password( argv[1] )){
        system("/bin/cat flag");
        return 0;
}

要check_password[argv[1]==hashcode,すなわちcheck_password[argv[1]==0 x 21 DD 09 EC,check_passwordの役割は,入力したデータを整数変換し,求め,返すことである.入力されたデータが12345678の場合、整数変換時のメモリは次のようになります.
20バイトに対して、入力した整数変換後の5つの整数和==0 x 21 DD 09 ECを構築するには、最初のアイデアは、最初の16バイトにx 00を割り当て、最後の4バイトは0 xEC 09 DD 21であるが、x 09はHTabであり、入力が遮断される.2つ目のアイデア:最初の16バイトはx 01を割り当て、最後の4バイトはxE 8x 05xD 9x 1 Dで、うん、そうします.
./col `python -c "print '\x01' * 16 + '\xE8\x05\xD9\x1D'"`

这里写图片描述
flag:daddy! I just managed to create a hash collision :)