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
nop

lui $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, $v0

0x20和0(这里虽然是0,但是下一次循环就会变成1,即for循环里面的i值)相减(提示:异或操作的优先级低于减法)然后放在v0里面

andi    $v0, 0xFF

然后进行与操作,即把高位灭掉,只保留低八位(即一个字节)

sll     $v0, 24
sra     $v0, 24

左移24,然后右移24,即保留低八位(一字节)

xor     $v0, $v1, $v0

然后v0v1异或之后放在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寄存器里面的值放进去。

lw      $v0, 0x48+var_30($fp)

然后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)相关推荐

  1. babymips(下) 寒假逆向生涯(14/100)

    babymips上 主要核心代码 var_10= -0x10 var_8= -8 var_4= -4 arg_0= 0addiu $sp, -0x28 sw $ra, 0x28+var_4($sp) ...

  2. notsequence 寒假逆向生涯(9/100)

    notsequence 这题目,挺简单的,首先无壳,直接拖进ida,然后查看了一下伪代码 轻易发现只需要满足三点就行 sub_80486CD((int)&unk_8049BE0) (unsig ...

  3. secret-galaxy-300 Replace(印象深刻) 寒假逆向生涯(8/100)

    secret-galaxy-300 脑洞题,直接没说法,就以后别碰这种脑洞题就行,,,,没任何帮助 显示界面 OD打开后,显示这个鬼东西.然后就没了. ida静态分析 看到上方输出框有字符串,所以我们 ...

  4. IgniteMe debug 寒假逆向生涯(2/100)

    IgniteMe 声明 这是道超级简单的题目,就不重复啰嗦了,找到需要加密的关键代码后,直接一步到位. memset(&v4, 0xCCu, 0xF4u);if ( strlen(a1) &g ...

  5. easy_Maze 梅津美治郎 寒假逆向生涯(16/100)

    easy_Maze 这个题简单,迷宫题目,需要动调,或者不用动调也行,可以自己算出地图,我用的是动调. 生成地图的两个函数 只需要动调到这两个函数的下一步后,找到储存矩阵的空间的地址, 把这个地址转到 ...

  6. easyre-153 testre寒假逆向生涯(13/100)

    easyre-153 简单题目,流程走起,首先查壳, 脱壳 upx壳,利用工具把它脱掉 ida静态分析 int __cdecl main(int argc, const char **argv, co ...

  7. deedeedee crazy 寒假逆向生涯(11/100)

    deedeedee 这题没说法...直接用notepad++打开第二个文件,然后就看到了flag....人傻了... flag{t3mplat3_met4pr0gramming_is_gr8_4_3v ...

  8. EasyRE 寒假逆向生涯(5/100)

    EasyRE 声明 挺简单的一道题目,流程不必注意太多,直接上核心伪代码 首先注意一点 v2 = (char *)&v8 + 7;这行代码属于编译出错,我们需要直接 查看它的汇编代码, 这行代 ...

  9. hackme Guess-the-Number 寒假逆向生涯(4/100)

    hackme 声明 简单题目,没必要查壳,动调. 话不多说,上核心伪代码 大致思路: 一个for循环,外加一个while循环 while循环是找出相应条件下v12的值 for循环作用: 1.制造whi ...

最新文章

  1. pandas使用groupby函数计算dataframe数据中每个分组的N个数值的滚动最大值(rolling max)、例如,计算某公司的多个店铺每N天(5天)的滚动销售额最大值
  2. 灾备知识总结:容灾与备份区别、灾备技术、容灾体系规划
  3. java中怎样计算个人所得税计算器,个人所得税计算器
  4. Service Request Account field in CRM and C4C
  5. 关于国内部分电子病历编辑器的评价
  6. 剑指 Offer 15. 二进制中1的个数 and leetcode 1905. 统计子岛屿
  7. 2048游戏c语言实验报告,2048游戏语言实验报告.doc
  8. java 关闭dos_java批处理启动 关闭
  9. 大话IT职场之-办公室政治
  10. 用matlab求三重积分格式,matlab求三重积分
  11. 解决微信插件wxparse图片大小不能改变的问题
  12. android 倒计时类,Android倒计时工具类
  13. 四十四 老李来了 我在软件园的那些日子里
  14. python运行环境怎么配置_python配置环境 菜鸟教程,python的运行环境怎么配置
  15. Tesseract学习(三)
  16. iPhone 导入照片显示时间不是拍摄时间
  17. 梆梆加固之防内存dump分析
  18. 2012_WOW_Designing Steganographic Distortion Using Directional Filters
  19. Android LogCat使用详解
  20. 方舟编译器将开源!华为邀广大开发者助力鸿蒙系统

热门文章

  1. AI:2020年6月23日北京智源大会演讲分享之智能信息检索与挖掘专题论坛——09:55-10:40刘兵教授《Open-World AI and Continual Learning》
  2. BigData/Cloud Computing:购买并登录Windows弹性云服务器之详细攻略(图文教程)—更优惠、更贴心!
  3. Applications模块解析(一)
  4. 【十问十答】粒子群算法(PSO)
  5. C/C++调试:gdbserver的简单使用
  6. 循序渐进Java Socket网络编程(多客户端、信息共享、文件传输)
  7. 深入学习jQuery鼠标事件
  8. 3、构建bass服务及model
  9. hdu 4614 Vases and Flowers
  10. SQL:使用 CASE