下载查看:
ida打开分析:
不能f5,编码方式表示看不太懂,貌似143c处判断是否成功:
在kali下运行gdb也运行不了:
查了一下是mips指令集:
MIPS常用指令集
lb/lh/lw: 从存储器中读取一个byte/half word/word的数据到寄存器中.如lb $1, 0($2)
sb/sh/sw: 把一个byte/half word/word的数据从寄存器存储到存储器中.如 sb $1, 0($2)
add/addu:把两个定点寄存器的内容相加add $1,$2,$3($1=$2+$3);u为不带符号加。
addi/addiu:把一个寄存器的内容加上一个立即数add $1,$2,#3($1=$2+3);u为不带符号加。
sub/subu:把两个定点寄存器的内容相减。
div/divu:两个定点寄存器的内容相除。
mul/mulu:两个定点寄存器的内容相乘。
and/andi:与运算,两个寄存器中的内容相与and $1,$2,$3($1=$2 & $3);i为立即数。
or/ori:或运算。
xor/xori:异或运算。
beq/beqz/benz/bne:条件转移eq相等,z零,ne不等。
j/jr/jal/jalr:j直接跳转;jr使用寄存器跳转;
lui:把一个16位的立即数填入到寄存器的高16位,低16位补零。
sll/srl:逻辑左移/右移sll $1,$2,#2。
slt/slti/sltui:如果$2的值小于$3,那么设置$1的值为1,否则设置$1的值为0。slt $1,$2,$3。
mov/movz/movn:复制,n为负,z为零。mov $1,$2; movz $1,$2,$3($3为零则复制$2到$1)。
trap:根据地址向量转入管态。
eret:从异常中返回到用户态。
把关键段函数解释下看看:
.text:004013C8
.text:004013C8 loc_4013C8:
.text:004013C8 lui $v0, 0x4A
.text:004013CC addiu $v1, $v0, (meow - 0x4A0000) # 把这个字符串的地址赋给v1"cbtcqLUBChERV[[Nh@_X^D]X_YPV[CJ"
.text:004013D0 lw $v0, 0x28+var_10($fp) #
.text:004013D4 addu $v0, $v1, $v0
.text:004013D8 lb $v1, 0($v0)
.text:004013DC lw $v0, 0x28+arg_4($fp)
.text:004013E0 addiu $v0, 4
.text:004013E4 lw $a0, 0($v0)
.text:004013E8 lw $v0, 0x28+var_10($fp)
.text:004013EC addu $v0, $a0, $v0
.text:004013F0 lb $v0, 0($v0)
.text:004013F4 xori $v0, 0x37
.text:004013F8 sll $v0, 24
.text:004013FC sra $v0, 24
.text:00401400 beq $v1, $v0, loc_401428
.text:00401404 move $a
看到有异或操作,猜测应该是字符串与0x37异或,那么试试吧:
str_one = "cbtcqLUBChERV[[Nh@_X^D]X_YPV[CJ"
str_two = 0x37
flag = ''
for i in str_one:
flag+=chr(ord(i)^str_two)
print(flag)