pwnable.kr---lotto

pwnable.kr—lotto

解题思路

万万没想到这个题目的解题思路竟然是这样的!

这个思路真的与我擦肩而过!

根据下边的代码逻辑漏洞:

    // calculate lotto score
    int match = 0, j = 0;
    for(i=0; i<6; i++){
        for(j=0; j<6; j++){
            if(lotto[i] == submit[j]){
                match++;
            }
        }
    }

按照下述规则输入submit,多次输入,直至拿到flag:

1.submit的6个字符相同

2.该字符的ascii值在1~46

遇到的问题

我的思路:

之前也注意到了代码里边的逻辑问题:

    // calculate lotto score
    int match = 0, j = 0;
    for(i=0; i<6; i++){
        for(j=0; j<6; j++){
            if(lotto[i] == submit[j]){
                match++;
            }
        }
    }

注意在两层循环中,这个逻辑判断的并不仅仅是两个字符串完全相等。如果submit字符串是6个相同的字符,并且该字符在lotto中只出现了一次,也可以实现match=6。于是我尝试是否能通过这个方式来使match=6,利用python代码,我找到了ascii值1~46的所有字符:

python:
for i in range(1,46):
    print(chr(i))

发现几乎2/3都是不可见字符,结合之前input的经验,我认为不可见字符是不能通过标准输入进而与lotto进行比较的,而且这个逻辑错误的要求也比较高(要求某1~46的可见字符在lotto字符串中出现且出现了一次)。于是我认为需要写一个脚本程序,实现通过管道(pipe)向该程序输入不可见以及可见字符,同时还需要执行循环和交互(听起来很麻烦)。

我还是尝试去做了,但是做到使用管道进行两个进程的通信时,父子进程的设置以及管道与标准输入输出的重定向的关系无法理清,导致写出来的脚本是废品。。。虽然简单的复习了一下管道和父子进程。。。最终还是去学习了别人的Write-up.

收获

1.fork()函数:返回值小于0(-1)为fork()函数调用失败;返回值大于0为父进程;返回值等于0为子进程。

2.difference between “0x” and “\x”:

for a character, both are equal

only one can be mixed into a string with other normal characters, “ABC\x5A”

only one can be used to initialize a large integer type, long long x=0x1234567812345678LL

3.字符串逐位比较时,可以将字符直接与对应的ascii值进行比较。字符也可直接与int类型计算,认为是ascii值参与计算。

仍存在的疑惑

1.题目难道真的不会使用不可见字符吗?难道是因为从urandom文件里读取的,所以默认 了不会是不可见字符吗?

2.从dev/urandom文件里读取的随机字符串为什么每次都不一样?难道是因为urandom其实是一个可执行文件?每次调用的时候都会重新生成吗?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值