日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/3/21 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 babymips(下) 寒假逆向生涯(14/100) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

babymips上

主要核心代碼

var_10= -0x10 var_8= -8 var_4= -4 arg_0= 0addiu $sp, -0x28 sw $ra, 0x28+var_4($sp) sw $fp, 0x28+var_8($sp) move $fp, $sp sw $a0, 0x28+arg_0($fp) li $v0, 5 sw $v0, 0x28+var_10($fp) b loc_400910 nop loc_400910: # s lw $a0, 0x28+arg_0($fp) jal strlen nop move $v1, $v0 lw $v0, 0x28+var_10($fp) nop sltu $v0, $v1 bnez $v0, loc_400814 nop

第六行代碼:

li $v0, 5 sw $v0, 0x28+var_10($fp)

把5塞到v0寄存器里面,然后v0里面的值塞到0x28+var_10($fp)這個內存單元

jal strlen

這個函數調用完成后,返回值直接放在v0寄存器中,緊接著

move $v1, $v0

v0賦值給v1,即把返回值放在v1里面,

lw $v0, 0x28+var_10($fp)

取出內存單元中的5放在v0里面。然后來兩個比較

sltu $v0, $v1 bnez $v0, loc_400814


BENZ R1,NAME;//R1!=0,程序跳轉,以NAME為偏移地址
v1即是字符串長度。
v1>5則跳,v1<=5則不跳(因為前面已經判斷"Q|j{g"這五個的原因吧)即選擇跳

loc_400814: lw $v0, 0x28+var_10($fp) nop andi $v0, 1 beqz $v0, loc_400898 nop

把5取出來,然后和1進行與操作
重點:和1進行與操作,這樣是為了判斷這個字符的位置是奇數還是偶數,奇數的話與操作也就是非0,偶數的話,與操作后為0),
BEQZ R1,NAME;//R1=0,程序跳轉到,以NAME為偏移地址

這里兩處都應該看,因為奇偶數位都在變,得分析他們的變化。

偶數位

loc_400898: lw $v0, 0x28+var_10($fp) lw $v1, 0x28+arg_0($fp) nop addu $v0, $v1, $v0 lb $v0, 0($v0) nop sll $v0, 2 sll $a0, $v0, 24 sra $a0, 24 lw $v0, 0x28+var_10($fp) lw $v1, 0x28+arg_0($fp) nop addu $v0, $v1, $v0 lb $v0, 0($v0) nop sra $v0, 6 sll $v1, $v0, 24 sra $v1, 24 lw $v0, 0x28+var_10($fp) lw $a1, 0x28+arg_0($fp) nop addu $v0, $a1, $v0 or $v1, $a0, $v1 sll $v1, 24 sra $v1, 24 sb $v1, 0($v0) lw $v0, 0x28+var_10($fp) lw $v1, 0x28+arg_0($fp)

第一行把位數取出來,第二行把參數取出來,因為我們前面傳參的時候傳的時字符串的地址。
所以v0里面是位數,v1里面是字符串首地址。

addu $v0, $v1, $v0 lb $v0, 0($v0)

取出相應字節的字符,然后進行下面一系列操作。

sll $v0, 2 sll $a0, $v0, 24 sra $a0, 24 lw $v0, 0x28+var_10($fp) lw $v1, 0x28+arg_0($fp) nop addu $v0, $v1, $v0 lb $v0, 0($v0)

首先左移兩位,再左移24位,再進行右移24位(絕對不是簡簡單單的左移兩位。。。別搞錯。。
然后取出位數放在v0中,取出數組首地址放在v1中,緊接著也取出相應位數字節的字符放在v0里面。
總結:也就是取出一字節字符的低6位放在a0寄存器

sra $v0, 6 sll $v1, $v0, 24 sra $v1, 24 lw $v0, 0x28+var_10($fp) lw $a1, 0x28+arg_0($fp) nop

右移6位,再左移24位,再進行右移24位(絕對不是簡簡單單的右移6位。。。別搞錯。。
取出位數放在v0中,取出數組首地址放在v1中。
總結:也就是取出一字節字符的高2位放在v1寄存器

addu $v0, $a1, $v0 or $v1, $a0, $v1 sll $v1, 24 sra $v1, 24 sb $v1, 0($v0)

第一行,把相應字節的字符地址取出放在v0寄存器中,
然后把v1寄存器(取出一字節字符的高2位)和a0寄存器(取出一字節字符的低6位)進行或運算放在v1寄存器中,
緊接著進行左移24,右移24,保留低八位(即一字節),然后把運算結果塞入上面取出的地址處的內存單元
即一字節循環左移2位

奇數位

lw $v0, 0x28+var_10($fp) lw $v1, 0x28+arg_0($fp) nop addu $v0, $v1, $v0 lb $v0, 0($v0) nop sra $v0, 2 sll $a0, $v0, 24 sra $a0, 24 lw $v0, 0x28+var_10($fp) lw $v1, 0x28+arg_0($fp) nop addu $v0, $v1, $v0 lb $v0, 0($v0) nop sll $v0, 6 sll $v1, $v0, 24 sra $v1, 24 lw $v0, 0x28+var_10($fp) lw $a1, 0x28+arg_0($fp) nop addu $v0, $a1, $v0 or $v1, $a0, $v1 sll $v1, 24 sra $v1, 24 sb $v1, 0($v0) b loc_400900 nop

同樣的方法,來分析奇數位字符

lw $v0, 0x28+var_10($fp) lw $v1, 0x28+arg_0($fp)

第一行把位數取出來,第二行把參數取出來,因為我們前面傳參的時候傳的時字符串的地址。
所以v0里面是位數,v1里面是字符串首地址。

addu $v0, $v1, $v0 lb $v0, 0($v0)

取出相應字節的字符,然后進行下面一系列操作。

sra $v0, 2 sll $a0, $v0, 24 sra $a0, 24 lw $v0, 0x28+var_10($fp) lw $v1, 0x28+arg_0($fp) nop addu $v0, $v1, $v0 lb $v0, 0($v0)

首先右移兩位,再左移24位,再進行右移24位(絕對不是簡簡單單的右移兩位。。。別搞錯。。
然后取出位數放在v0中,取出數組首地址放在v1中,緊接著也取出相應位數字節的字符放在v0里面。
總結:也就是取出一字節字符的高6位放在a0寄存器

sll $v0, 6 sll $v1, $v0, 24 sra $v1, 24 lw $v0, 0x28+var_10($fp) lw $a1, 0x28+arg_0($fp) nop

左移6位,再左移24位,再進行右移24位(絕對不是簡簡單單的左移6位。。。別搞錯。。
取出位數放在v0中,取出數組首地址放在v1中。
總結:也就是取出一字節字符的低2位放在v1寄存器

addu $v0, $a1, $v0 or $v1, $a0, $v1 sll $v1, 24 sra $v1, 24 sb $v1, 0($v0)

第一行,把相應字節的字符地址取出放在v0寄存器中,
然后把v1寄存器(取出一字節字符的高6位)和a0寄存器(取出一字節字符的低2位)進行或運算放在v1寄存器中,
緊接著進行左移24,右移24,保留低八位(即一字節),然后把運算結果塞入上面取出的地址處的內存單元
即一字節循環右移2位

尾聲

loc_400900: lw $v0, 0x28+var_10($fp) nop addiu $v0, 1 sw $v0, 0x28+var_10($fp)

取出位數,進行加1操作

loc_400910: # s lw $a0, 0x28+arg_0($fp) jal strlen nop move $v1, $v0 lw $v0, 0x28+var_10($fp) nop sltu $v0, $v1 bnez $v0, loc_400814 nop

當操作到最后一個時

sltu $v0, $v1 bnez $v0, loc_400814


BENZ R1,NAME;//R1!=0,程序跳轉,以NAME為偏移地址,當移動到最后一個字符的下一個時,v0=v1相等。條件跳轉不成立,緊接著進行一系列比較

lw $v0, 0x28+arg_0($fp) nop addiu $v1, $v0, 5 lw $v0, off_410D04 li $a2, 0x1B # n move $a1, $v0 # s2 move $a0, $v1 # s1 jal strncmp nop bnez $v0, loc_40097C nop

off_410D04地址處

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 751F

比較結束后,返回值為1,則不跳,即

lui $v0, 0x40 addiu $a0, $v0, (aRight - 0x400000) # "Right!" jal puts nop b loc_40098C nop

成功嘍!!!!!!!!

GAMEOVER

part1=b'Q|j{g' 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' part2=list(bytes.fromhex(part2)) for i in range(5,len(part2)+5):t = part2[i-5]if i&1==0: #偶數時&1 為0part2[i-5]=(t&0x3)<<6|(t&0xfc)>>2 #低2位左移6位,高6位右移2位 相當于循環右移2位else:part2[i-5]=(t&0x3f)<<2|(t&0xc0)>>6 #低6位左移2位,高2位右移6位 相當于循環左移2位temp=list(part1)+part2 flag='' for i in range(len(temp)):flag+=chr(temp[i]^0x20 -i) print(flag)

qctf{ReA11y_4_B@89_mlp5_4_XmAn_}

總結

以上是生活随笔為你收集整理的babymips(下) 寒假逆向生涯(14/100)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。