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
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
然后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
寄存器里面的值放进去。
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)相关推荐
- babymips(下) 寒假逆向生涯(14/100)
babymips上 主要核心代码 var_10= -0x10 var_8= -8 var_4= -4 arg_0= 0addiu $sp, -0x28 sw $ra, 0x28+var_4($sp) ...
- notsequence 寒假逆向生涯(9/100)
notsequence 这题目,挺简单的,首先无壳,直接拖进ida,然后查看了一下伪代码 轻易发现只需要满足三点就行 sub_80486CD((int)&unk_8049BE0) (unsig ...
- secret-galaxy-300 Replace(印象深刻) 寒假逆向生涯(8/100)
secret-galaxy-300 脑洞题,直接没说法,就以后别碰这种脑洞题就行,,,,没任何帮助 显示界面 OD打开后,显示这个鬼东西.然后就没了. ida静态分析 看到上方输出框有字符串,所以我们 ...
- IgniteMe debug 寒假逆向生涯(2/100)
IgniteMe 声明 这是道超级简单的题目,就不重复啰嗦了,找到需要加密的关键代码后,直接一步到位. memset(&v4, 0xCCu, 0xF4u);if ( strlen(a1) &g ...
- easy_Maze 梅津美治郎 寒假逆向生涯(16/100)
easy_Maze 这个题简单,迷宫题目,需要动调,或者不用动调也行,可以自己算出地图,我用的是动调. 生成地图的两个函数 只需要动调到这两个函数的下一步后,找到储存矩阵的空间的地址, 把这个地址转到 ...
- easyre-153 testre寒假逆向生涯(13/100)
easyre-153 简单题目,流程走起,首先查壳, 脱壳 upx壳,利用工具把它脱掉 ida静态分析 int __cdecl main(int argc, const char **argv, co ...
- deedeedee crazy 寒假逆向生涯(11/100)
deedeedee 这题没说法...直接用notepad++打开第二个文件,然后就看到了flag....人傻了... flag{t3mplat3_met4pr0gramming_is_gr8_4_3v ...
- EasyRE 寒假逆向生涯(5/100)
EasyRE 声明 挺简单的一道题目,流程不必注意太多,直接上核心伪代码 首先注意一点 v2 = (char *)&v8 + 7;这行代码属于编译出错,我们需要直接 查看它的汇编代码, 这行代 ...
- hackme Guess-the-Number 寒假逆向生涯(4/100)
hackme 声明 简单题目,没必要查壳,动调. 话不多说,上核心伪代码 大致思路: 一个for循环,外加一个while循环 while循环是找出相应条件下v12的值 for循环作用: 1.制造whi ...
最新文章
- pandas使用groupby函数计算dataframe数据中每个分组的N个数值的滚动最大值(rolling max)、例如,计算某公司的多个店铺每N天(5天)的滚动销售额最大值
- 灾备知识总结:容灾与备份区别、灾备技术、容灾体系规划
- java中怎样计算个人所得税计算器,个人所得税计算器
- Service Request Account field in CRM and C4C
- 关于国内部分电子病历编辑器的评价
- 剑指 Offer 15. 二进制中1的个数 and leetcode 1905. 统计子岛屿
- 2048游戏c语言实验报告,2048游戏语言实验报告.doc
- java 关闭dos_java批处理启动 关闭
- 大话IT职场之-办公室政治
- 用matlab求三重积分格式,matlab求三重积分
- 解决微信插件wxparse图片大小不能改变的问题
- android 倒计时类,Android倒计时工具类
- 四十四 老李来了 我在软件园的那些日子里
- python运行环境怎么配置_python配置环境 菜鸟教程,python的运行环境怎么配置
- Tesseract学习(三)
- iPhone 导入照片显示时间不是拍摄时间
- 梆梆加固之防内存dump分析
- 2012_WOW_Designing Steganographic Distortion Using Directional Filters
- Android LogCat使用详解
- 方舟编译器将开源!华为邀广大开发者助力鸿蒙系统
热门文章
- AI:2020年6月23日北京智源大会演讲分享之智能信息检索与挖掘专题论坛——09:55-10:40刘兵教授《Open-World AI and Continual Learning》
- BigData/Cloud Computing:购买并登录Windows弹性云服务器之详细攻略(图文教程)—更优惠、更贴心!
- Applications模块解析(一)
- 【十问十答】粒子群算法(PSO)
- C/C++调试:gdbserver的简单使用
- 循序渐进Java Socket网络编程(多客户端、信息共享、文件传输)
- 深入学习jQuery鼠标事件
- 3、构建bass服务及model
- hdu 4614 Vases and Flowers
- SQL:使用 CASE