babymips(上) 寒假逆向生涯(14/100)
babymips
这题呢,看名字就知道,不出所料,还是mips指令,挺简单的,懒得找插件,直接分析吧,锻炼锻炼自己
开战
lui $v0, 0x40 addiu $a0, $v0, (aGiveMeYourFlag - 0x400000) # "Give me your flag:" jal printf nop addiu $v0, $fp, 0x48+var_2C move $a1, $v0 lui $v0, 0x40 addiu $a0, $v0, (a32s - 0x400000) # "%32s" jal scanf nop sw $zero, 0x48+var_30($fp) b loc_400A78 noplui $v0, 0x40这行是把0x40放在v0寄存器的高16位,低16位填零处理。
addiu $a0, $v0, (aGiveMeYourFlag - 0x400000) # "Give me your flag:"这行的话,也就是把aGiveMeYourFlag输出字符串地址放在寄存器a0寄存器里面
紧接着跳到输出函数去,很正常,也就是通过寄存器传参,然后调用一个函数
addiu $v0, $fp, 0x48+var_2C这个的话我猜是输入的东西的地址,放在v0寄存器里面
move $a1, $v0然后把v0寄存器里面的东西放在,a1寄存器,也就是调用scanf函数的时候需要传参,下面几行代码道理和printf一样,只不过所传参数不一样而已
lui $v0, 0x40 addiu $a0, $v0, (a32s - 0x400000) # "%32s" jal scanf无条件跳转
sw $zero, 0x48+var_30($fp) b loc_400A78用0初始化0x48+var_30($fp),接着跳转到loc_400A78
lw $v0, 0x48+var_30($fp) nop slti $v0, 0x20 bnez $v0, loc_400A1C第一行把0x48+var_30($fp)放在v0寄存器,第二行对齐,
第三行用这个数去和36比较,比较后的关系用1和0放在v0里面
解释一下,v0<20的话,那么v0会被赋值为1,v0>=20的话,那么v0会被赋值为0
而BENZ R1,NAME;//R1!=0,程序跳转,以NAME为偏移地址
BEQZ R1,NAME;//R1=0,程序跳转到,以NAME为偏移地址
所以的话,这里将会跳转到loc_400A1C:
循环
loc_400A1C: lw $v0, 0x48+var_30($fp) addiu $v1, $fp, 0x48+var_30 addu $v0, $v1, $v0 lb $v1, 4($v0) lw $v0, 0x48+var_30($fp) nop andi $v0, 0xFF li $a0, 0x20 subu $v0, $a0, $v0 andi $v0, 0xFF sll $v0, 24 sra $v0, 24 xor $v0, $v1, $v0 sll $v1, $v0, 24 sra $v1, 24 lw $v0, 0x48+var_30($fp) addiu $a0, $fp, 0x48+var_30 addu $v0, $a0, $v0 sb $v1, 4($v0) lw $v0, 0x48+var_30($fp) nop addiu $v0, 1 sw $v0, 0x48+var_30($fp) lw $v0, 0x48+var_30($fp)第一行代码,也就是把0放在v0寄存器里面
addiu $v1, $fp, 0x48+var_30紧接着,把0的地址放在v1寄存器里面
addu $v0, $v1, $v0这个把长度存放的地址加上一个偏移(这里偏移第一次为0,数组偏移那种意思)得到一个地址放在v0寄存器里面,用法未知
lb $v1, 4($v0)把v0+4地址处的内容取出放在v1(也就是我们输入字符的第一个字节)
lw $v0, 0x48+var_30($fp)把0(这里虽然是0,但是下一次循环就会变成1,即for循环里面的i值)再次放在v0寄存器里面
andi $v0, 0xFF进行与操作,即把高位灭掉,只保留低八位
li $a0, 0x20把0x20加载到a0寄存器里面
subu $v0, $a0, $v00x20和0(这里虽然是0,但是下一次循环就会变成1,即for循环里面的i值)相减(提示:异或操作的优先级低于减法)然后放在v0里面
andi $v0, 0xFF然后进行与操作,即把高位灭掉,只保留低八位(即一个字节)
sll $v0, 24 sra $v0, 24左移24,然后右移24,即保留低八位(一字节)
xor $v0, $v1, $v0然后v0和v1异或之后放在v0寄存器里面
sll $v1, $v0, 24 sra $v1, 24把v0里面的值,左移24之后,有右移24,同样道理,保留低八位。。
lw $v0, 0x48+var_30($fp)取出0值(i值,第一次为0而已)
lw $v0, 0x48+var_30($fp) addiu $a0, $fp, 0x48+var_30 addu $v0, $a0, $v0 sb $v1, 4($v0)这四行和上面一样,即找出我们输入字符的
地址,然后把v1寄存器里面的值放进去。
然后0值(即i值)
nop addiu $v0, 1 sw $v0, 0x48+var_30($fp)加1之后,又塞回去,然后进行判断,是否跳出循环,不跳出的话,继续进行以上循环代码
比较
slti $v0, 0x20 bnez $v0, loc_400A1C当这里,v0一直增,然后等于32后,即不跳转,然后来到
lui $v0, 0x41 lw $v1, _fdata addiu $v0, $fp, 0x48+var_2C li $a2, 5 # n move $a1, $v1 # s2 move $a0, $v0 # s1 jal strncmp nop bnez $v0, loc_400ACC nop
然后判断一下,转换后的字符前五个是不是"Q|j{g",如果不是的话直接wrong,在这里呢,我们必须选择是,否则下一步就没了。。
过渡
addiu $v0, $fp, 0x48+var_2C move $a0, $v0 jal judge nop b loc_400ADC nop紧接着,把我们输入的字符串的地址放在v0里面,然后v0放在a0寄存器,当做参数传过去,即寄存器传参。。
jal跳转这里,就不用说了,都能看懂。
接下来还有个核心函数:
babymips下
https://blog.csdn.net/CSNN2019/article/details/112788619
总结
以上是生活随笔为你收集整理的babymips(上) 寒假逆向生涯(14/100)的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: *CTF MineGame
- 下一篇: babymips(下) 寒假逆向生涯(1