首页 > 代码库 > 【pwnable.kr】col
【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]\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; }
发现就限定了字符串长度为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")
运行一下
【pwnable.kr】col
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。