1. 程式人生 > >pwnable.kr 2.collision writeup

pwnable.kr 2.collision writeup

拿到題目
在這裡插入圖片描述
先連上去。
在這裡插入圖片描述
ls檢視目錄得到
在這裡插入圖片描述
cat 檢視下col.c的原始碼

#include <stdio.h>
#include <string.h>
unsigned long hashcode = 0x21DD09EC;
unsigned long check_password(const char* p){ 
	int* ip = (int*)p;  //這裡將char型強制轉化為int型指標。
	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]\n", argv[0]);
		return 0;
	}
	if(strlen(argv[1]) != 20){  //第二個字串長度得是20。
		printf("passcode length should be 20 bytes\n");
		return 0;
	}

	if(hashcode == check_password( argv[1] )){ //成立,取得flag
		system("/bin/cat flag");   
		return 0;
	}
	else
		printf("wrong passcode.\n");
	return 0;
}

check_password函式將命令列輸入的第二個字串強制轉化為int型陣列。

一個char型佔一個位元組,一個int型佔4個位元組,則4個char對應一個int ,正好和字串的長度20,以及check_password函式裡迴圈次數5對應。

函式的返回值即是將長度為20的字串拆分為5個數相加後的結果。

想要判斷結果為true,則需要最後相加的結果等於hashcode,即0x21DD09EC,
可以先將0x21DD09EC這個值拆分為4個相同的數,再加一個數。
例如將0x21DD09EC -四倍的0x01010101,通過計算器得到在這裡插入圖片描述
則只需輸入:(因為little-endian的緣故需要倒著寫0x1dd905e8。
用linux自帶的printf命令將shellcode編碼轉義為字元。)
即可得到flag
在這裡插入圖片描述