pwnable.kr 2.collision writeup
阿新 • • 發佈:2018-12-26
拿到題目
先連上去。
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