字符串处理
例题 Cr0ssfun
放入64ida,发现check函数就是不断判断读入的字符

这边直接手搓一个代码,得到flag
exp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| a1=[0]*48 a1[10] = 112 a1[13] = 64 a1[3] = 102 a1[26] = 114 a1[20] = 101 a1[7] = 48 a1[16] = 95 a1[11] = 112 a1[23] = 101 a1[30] = 117 a1[0] = 119 a1[6] = 50 a1[22] = 115 a1[31] =110 a1[12] = 95 a1[15] = 100 a1[8] = 123 a1[18] = 51 a1[28] = 95 a1[21] = 114 a1[2] = 116 a1[9] = 99 a1[32] = 125 a1[19] = 118 a1[5] = 48 a1[14] = 110 a1[4] = 50 a1[17] = 114 a1[29] = 102 a1[17] = 114 a1[24] = 95 a1[1] = 99 a1[25] = 64 a1[27] = 101 for i in range(48): if(a1[i]!=0): print(chr(a1[i]),end='')
|

大佬的exp
复制ida中的判断条件,注意复制的格式尽量一致,例如每一次都给后面留一个空格,便于之后进行字符串处理,结果为:

得到这个字符串后就可以开始处理了。首先我们把文件保存为”.examp.txt”,注意直接赋值给python字符串是不行的,因为有很多换行符:
1 2 3
| file=open(".examp.txt") mystr=file.read() print(mystr.replace("\n",""))
|
结果为
1
| a1[10] == 112 && a1[13] == 64 && a1[3] == 102 && a1[26] == 114 && a1[20] == 101 && a1[7] == 48 && a1[16] == 95 && a1[11] == 112 && a1[23] == 101 && a1[30] == 117 && *a1 == 119 && a1[6] == 50 && a1[22] == 115 && a1[31] == 110 && a1[12] == 95 && a1[15] == 100 && a1[8] == 123 && a1[18] == 51 && a1[28] == 95 && a1[21] == 114 && a1[2] == 116 && a1[9] == 99 && a1[32] == 125 && a1[19] == 118 && a1[5] == 48 && a1[14] == 110 && a1[4] == 50 && a1[17] == 114 && a1[29] == 102 && a1[17] == 114 && a1[24] == 95 && a1[1] == 99 && a1[25] == 64 && a1[27] == 101
|
可以看到还不太对齐,由于我们之前复制的格式比较一致,其实我们看到的缩进都是由六个空格所组成,直接使用replace把缩进改成单个空格,保持格式一致:
1 2 3 4
| file=open(".examp.txt") mystr=file.read() mystr=mystr.replace("\n","") print(mystr.replace(" "," "))
|
结果为
1
| a1[10] == 112 && a1[13] == 64 && a1[3] == 102 && a1[26] == 114 && a1[20] == 101 && a1[7] == 48 && a1[16] == 95 && a1[11] == 112 && a1[23] == 101 && a1[30] == 117 && *a1 == 119 && a1[6] == 50 && a1[22] == 115 && a1[31] == 110 && a1[12] == 95 && a1[15] == 100 && a1[8] == 123 && a1[18] == 51 && a1[28] == 95 && a1[21] == 114 && a1[2] == 116 && a1[9] == 99 && a1[32] == 125 && a1[19] == 118 && a1[5] == 48 && a1[14] == 110 && a1[4] == 50 && a1[17] == 114 && a1[29] == 102 && a1[17] == 114 && a1[24] == 95 && a1[1] == 99 && a1[25] == 64 && a1[27] == 101
|
结果已经比较适合进行字符串处理了,但在此之前我们还能进行一步小小的处理,将” == “全部换为”=“,将” && “全部换为”&”,避免进行split分割的时候多出来一部分难处理的地方。替换的函数也是replace,过程同上。替换完毕后可以进行字符串处理,得到最后的flag。**
**最后一部处理之后,字符串如下:
1
| a1[10]=112&a1[13]=64&a1[3]=102&a1[26]=114&a1[20]=101&a1[7]=48&a1[16]=95&a1[11]=112&a1[23]=101&a1[30]=117&*a1=119&a1[6]=50&a1[22]=115&a1[31]=110&a1[12]=95&a1[15]=100&a1[8]=123&a1[18]=51&a1[28]=95&a1[21]=114&a1[2]=116&a1[9]=99&a1[32]=125&a1[19]=118&a1[5]=48&a1[14]=110&a1[4]=50&a1[17]=114&a1[29]=102&a1[17]=114&a1[24]=95&a1[1]=99&a1[25]=64&a1[27]=101
|
本来用mystr.count(“=”)数了,有34个元素,结果a1[17]被赋了两次值,我们用in可以判断是否已经存在
综上,代码如下:
更新: 2024-07-29 14:40:21
原文: https://www.yuque.com/chaye-apqbl/vsc85q/ew2yuwbyt38kgz2d