拿到题目
先连上去。
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