BUUCTF strangecpp

这题f12定位关键字符串,交叉引用到
BUUCTF strangecpp_第1张图片
看到假flag天真的我以为假flag判定条件不对的下一个函数就是关键,点进去摆置半天啥都没出来,后来又回到这,仔细看发现在now system cup num is前面有个函数sub_140011127然后看BUUCTF strangecpp_第2张图片
这个页面,发现了一个分支,猜测另一个分支就是上面说的函数那个地方,点进去看。。。。我还是啥都没鼓捣出来,然后看被人题解才发现上面一堆putchar字符那有个字符被跳过去了,为什么说被跳过去呢,因为
BUUCTF strangecpp_第3张图片
在这个界面。。。和那个人的界面不一样,看不出来被跳过,那就一个一个看交叉引用,全选点击转换字符串,之后点击交叉引用,就看到所有的引用,发现一个和别的引用不同的函数,相同的那个是之前定位到的那个大的函数,点进去单独那个发现
BUUCTF strangecpp_第4张图片
f5之后就是真正的关键函数,分析一下就是result是一个数字经函数变换后的值,且值为
BUUCTF strangecpp_第5张图片
607052314然后还要就是未经函数变换的值是小于等于14549743那个函数变换按理说应该只有一个数是合法的,我猜的,因为答案应该不会有俩,再说如果变换不是一 一映射的那那么大的范围,保证结果个数在可控范围内也不是容易的事,点近去看到变换内容,从0到那个范围都模拟一遍,找到的值就是那个起初的值,然后那个值要和byte_140021000[2]做异或,从前面截图那可以看出是从"开始的,然后就把这个开始17个字符选中用shift+e来做成ascii数组表,然后写脚本,最后结果不对,出不来结果,看了别人题解才发现因为python不会因为数据过长就截断,所以要自己手动截断,不然超出ascii的范围怎么会有结果,不过用c/c++就不需要了,以后看到c++题就用c++写脚本试试

from hashlib import md5
result=607052314   #细心看清哪个数据漏了
n=0
flag=''
pcbBuffer=[  0x26, 0x2C, 0x21, 0x27, 0x3B, 0x0D, 0x04, 0x75, 0x68, 0x34, 
0x28, 0x25, 0x0E, 0x35, 0x2D, 0x69, 0x3D]
for i in range(14549743):
    m=(((i<<8)^(i>>12))*291)&0xffffffff
    if m==result:
        print(i)
        n=i
        break

for i in range(17):
    flag+=chr((123456^pcbBuffer[i])&0xff)   #注意数据截断!!!c不用
print(flag)

m=md5()  #md5加密步骤
m.update('123456'.encode('utf-8'))
print(m.hexdigest()) #返回16进制字符串

因为上面得出的结果提醒用md5加密之后才是答案所以加密了一下。
记住以后看到可疑数据一定要留意,没看到可疑数据被用到就是自己不够认真,一定要找到用到这个可疑数据的地方,因为有的题真的会在这上挖坑,把可疑数据藏起来,中间可疑通过看是否有跳过数据或者没看到出现在哪判断,细心细心细心!!!!

你可能感兴趣的:(BUUCTF strangecpp)