BUU[QCTF2018]Xman-babymips

分析

首先查壳,32位无壳,放入IDA分析。先shift+F12去看一下关键的string

image-20220705141915441

然后交叉引用去找到它在干嘛

image-20220705142038149

去看一下fdata是什么image-20220705142112436

不难猜出这个是用来弄flag前缀的,接着去看一下sub_4007F0函数

image-20220705142241729

其实就是简单的判断i是否为偶数(i&1是用来判断奇偶的),这里for循环中i=5和后面strncmp函数中a1+5都是因为前面的前缀占了5个字节,然后看一下 off_410D04里面是什么

image-20220705142411408

这些都知道后就开始写脚本(因为是BUU下载的题就直接舍弃第一个那个前缀,就不写那一部分脚本了)

脚本

a = [0x52, 0xFD, 0x16, 0xA4, 0x89, 0xBD, 0x92, 0x80, 0x13, 0x41, 0x54, 0xA0, 0x8D, 0x45, 0x18, 0x81, 0xDE, 0xFC, 0x95, 0xF0, 0x16, 0x79, 0x1A, 0x15, 0x5B, 0x75, 0x1F]
flag = " "
for i in range(0, len(a)):
if i & 1 == 0:
a[i] = (a[i] << 2) % 0x100 | (a[i] >> 6)#%0x100是为了防止爆破的时候溢出
flag += chr(a[i] ^ 32-i-5)
else:
a[i] = (a[i] >> 2) | (a[i] << 6) % 0x100
flag += chr(a[i] ^ 32-i-5)
print('flag{'+flag)
#flag{ReA11y_4_B@89_mlp5_4_XmAn_}

总结

第一次知道有%0x100是用来防止溢出的,涨知识了,但还是不太懂原理/(ㄒoㄒ)/~~