zoukankan      html  css  js  c++  java
  • 【pwnable.kr】col

    pwnable从入门到放弃第二题,

    ssh col@pwnable.kr -p2222 (pw:guest)

    同样是登录,然后看到了col.c、col、flag三个文件,读一下col.c

    #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]
    ", argv[0]);
            return 0;
        }
        if(strlen(argv[1]) != 20){
            printf("passcode length should be 20 bytes
    ");
            return 0;
        }
    
        if(hashcode == check_password( argv[1] )){
            system("/bin/cat flag");
            return 0;
        }
        else
            printf("wrong passcode.
    ");
        return 0;
    }

    发现就限定了字符串长度为20,然后做了一次check函数,函数中就是把输入参数的字符串指针当做整数指针进行解析然后把结果相加,所以碰撞还是很简单的。

    没想到= = 找轮子是永远的痛,吐口血再写。

    可以把hash分解成 b*4+c的形式,我先猜测了c,当c=0x01010104时,(hash-c)mod 4 = 0,因此b存在。

    接下来肯定得编码然后就直接调用就好了,结果是找不到能转换的轮子。struct.pack不会用QAQ。

    最后迫不得已用了pwn.p32,pwntools大法好,先膜一发。

    那干脆就直接调用子线程就好了。

    需要找到一个可写的目录,我用了winscp图形化界面去找,找到/tmp下程序可写可执行,恩。

    把脚本放到下面,就好了

    import struct
    import pwn
    a = 0x21DD09EC
    c = 0x01010104
    b = (a-c)/4
    
    col = pwn.p32(c)+pwn.p32(b)*4
    print (col)
    
    import subprocess
    child = subprocess.Popen(args= ['/home/col/col',str(col)])
    child.wait()
    print("over")

    运行一下

  • 相关阅读:
    vue 虚拟列表
    图片验证
    md5 文件上传
    js中apply方法的使用
    js通过replace()方法配合正则去除空格
    使用bind()方法扩充作用域
    取数组最大最小值得方法
    css穿透点击
    为什么选择器li#id名/li.类名的写法
    子元素与父元素等高
  • 原文地址:https://www.cnblogs.com/p4nda/p/7097948.html
Copyright © 2011-2022 走看看