pwnable.kr input最新解题
以前的分析还是很详细的
具体链接:https://werewblog.wordpress.com/2016/01/11/pwnable-kr-input/
但是有些细节变了;
解题源代码如下:
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<stdlib.h>
#include<sys/wait.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#include<netinet/in.h>
int main()
{
char *argv[101]={"/home/input2/input",[1 … 99]=“A”,NULL};//改变了目录名字
argv[‘A’]="\x00";
argv[‘B’]="\x20\x0a\x0d"; //改变了数值
argv[‘C’]=“55555”;
// execve(argv[0],argv,NULL);
int pipe2stdin[2]={-1,-1};
int pipe2stderr[2]={-1,-1};
pid_t childpid;
if(pipe(pipe2stdin)<0||pipe(pipe2stderr)<0)
{
perror("cannot create the pipe");
exit(1);
}
FILE* fp =fopen("\x0a","w");
fwrite("\x00\x00\x00\x00",4,1,fp);
fclose(fp);
if((childpid=fork())<0)
{
perror("cannot fork");
exit(1);
}
if(childpid==0)
{
close(pipe2stdin[0]); //关闭读
close(pipe2stderr[0]);
write(pipe2stdin[1],"\x00\x0a\x00\xff",4);
write(pipe2stderr[1],"\x00\x0a\x02\xff",4);
}
else
{
close(pipe2stdin[1]); //关闭写
close(pipe2stderr[1]);
dup2(pipe2stdin[0],0); //重定向到标准输入
dup2(pipe2stderr[0],2);//重定向到标准错误
close(pipe2stdin[0]);
close(pipe2stderr[0]);
char *env[2]={"\xde\xad\xbe\xef=\xca\xfe\xba\xbe",NULL};
execve("/home/input2/input",argv,env);
perror("Fail to execute the program");
exit(1);
}
sleep(5);
int sockfd;
struct sockaddr_in server;
sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd<0)
{
perror("problem connecting");
exit(1);
}
server.sin_family=AF_INET;
server.sin_addr.s_addr=inet_addr("127.0.0.1");
server.sin_port=htons(55555);
if(connect(sockfd,(struct sockaddr*)&server,sizeof(server))<0)
{
perror("problem connecting");
exit(1);
}
printf("connected\n");
char buf[4]="\xde\xad\xbe\xef";
write(sockfd,buf,4);
close(sockfd);
return 0;
}
具体步骤为:
1.在pwnable.kr的tmp目录下创建一个文件夹比如 input,因为我们在input2中没有写权 限,所以我们只好到tmp文件夹下,哪里有写权限
2.在我们自己的linux中上传上面代码编译后的可执行文件(假如为a.out)到 /tmp/input
(就是scp -P 2222 -p a.out input2@pwnable.kr:/tmp/input )
3.上传成功后,我们./input执行,会发现没有flag出现,因为我们的flag是相对路径,我们现在在/tmp/input目录下,因此我们需要创建一个连接,网上很多人都说用ln /home/input/flag flag,但是我没有成功,因为不允许,所以我试了一下软连接,成功了,就是
ln -s /home/input/flag flag就成功了得到了flag;
Mommy! I learned how to pass various input in Linux ?
因为我也是一个新手,所以搞了很久,有很多不懂,希望各位大佬指点;
希望有相同兴趣的我们交流一起进步