babymips(XCTF 4th-QCTF-2018)

babymips(XCTF 4th-QCTF-2018)

一月 11, 2020

mips的题,对mips指令不了解,边查边做弄了好久才弄出来。

32位mips架构elf文件无壳,ida打开查字符串找到主函数sub4009A8,先输入一个长度为32的字符串放在0x48+var_2C后将0x48+var_30置零:

之后用置零的0x48+var_30作为下标i遍历整个字符串进行加密,加密后取前5位与已知字符串比较:

加密部分逻辑如下:

1
2
for i in range(0x20):
input[i]^=0x20-i

判断前5位之后再调用sub_4007F0函数继续判断,逻辑与上层函数相似,下标遍历从第6位到最后一位,分奇偶数进行不同的加密,最后与已知字符串比较:

加密部分逻辑如下:

1
2
3
4
5
for i in range(5,0x20):
if(i%2):
input[i]=(input[i]>>2)|(input[i]<<6)#循环右移2位
else:
input[i]=(input[i]>>6)|(input[i]<<2)#循环左移2位

最后脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
key = [0x51, 0x7c, 0x6a, 0x7b, 0x67, 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(5, 32):
if(i % 2):
key[i] = (key[i] << 2) | (key[i] >> 6) # 循环左移2位
else:
key[i] = (key[i] >> 2) | (key[i] << 6) # 循环右移2位
for i in range(32):
key[i] ^= 32-i
for i in key:
flag += chr(i & 0xff)
print(flag)
#qctf{ReA11y_4_B@89_mlp5_4_XmAn_}