攻防世界 reverse babymips
阅读原文时间:2023年07月10日阅读:1

babymips   XCTF 4th-QCTF-2018

mips,ida中想要反编译的化需要安装插件,这题并不复杂直接看mips汇编也没什么难度,这里我用了ghidra,直接可以查看反编译。

1 void FUN_004009a8(void)
2
3 {
4 int iVar1;
5 int i;
6 byte input [36];
7
8 setbuf(stdout,(char *)0x0);
9 setbuf(stdin,(char *)0x0);
10 printf("Give me your flag:");
11 scanf("%32s",input);
12 i = 0;
13 while (i < 0x20) {
14 input[i] = input[i] ^ 0x20U - (char)i; //这里将输入进行异或(0x20-i)
15 i = i + 1;
16 }
17 iVar1 = strncmp((char *)input,_fdata,5); //前5字节输入转换后为 "Q|j{g"
18 if (iVar1 == 0) {
19   f_5-end_004007f0((char *)input); //转换后的结果进行下一步处理
20 }
21 else {
22   puts("Wrong");
23 }
24 return;
25 }

[5:]部分处理:

1 void f_5-end_004007f0(char *op_str)
2
3 {
4 size_t lens;
5 int iVar1;
6 uint i;
7
8 i = 5;
9 while (lens = strlen(op_str), i < lens) { 10 if ((i & 1) == 0) { //偶数时 11 op_str[i] = (byte)((uint)((int)op_str[i] << 0x1a) >> 0x18) | op_str[i] >> 6;//高2位右移6位成为低2位,低6位左移2位成为高6位 相当于一字节循环左移2位
12 }
13 else {//奇数时
14 op_str[i] = op_str[i] >> 2 | (byte)((uint)((int)op_str[i] << 0x1e) >> 0x18);//高6位右移2位成为低6位,低2位左移6位成为高2位 相当于循环右移2位
15 }
16 i = i + 1;
17 }
18 iVar1 = strncmp(op_str + 5,PTR_ARRAY_00410d04,0x1b);
19 if (iVar1 == 0) {
20 puts("Right!");
21 }
22 else {
23 puts("Wrong!");
24 }
25 return;
26 }

wp:

1 part1=b'Q|j{g'
2 part2='52 fd 16 a4 89 bd 92 80 13 41 54 a0 8d 45 18 81 de fc 95 f0 16 79 1a 15 5b 75 1f'
3 part2=list(bytes.fromhex(part2))
4 for i in range(5,len(part2)+5):
5 t = part2[i-5]
6 if i&1==0: #偶数时&1 为0
7 part2[i-5]=(t&0x3)<<6|(t&0xfc)>>2 #低2位左移6位,高6位右移2位 相当于循环右移2位
8 else:
9 part2[i-5]=(t&0x3f)<<2|(t&0xc0)>>6 #低6位左移2位,高2位右移6位 相当于循环左移2位
10
11 temp=list(part1)+part2
12 flag=''
13 for i in range(len(temp)):
14 flag+=chr(temp[i]^0x20 -i)
15 print(flag)

qctf{ReA11y_4_B@89_mlp5_4_XmAn_}

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章