欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

mips64逆向新手入门(从jarvisoj一道mips64题目说起)

来源:本站整理 作者:佚名 时间:2019-01-16 TAG: 我要投稿
.text:0000000120003C20 loc_120003C20:
.text:0000000120003C20                 c.lt.s  $fcc6, $f1, $f0
.text:0000000120003C24                 bc1f    $fcc6, loc_120003B24
.text:0000000120003C28                 ld      $t9, -0x7F68($gp)
.text:0000000120003C2C                 ld      $a0, -0x7F78($gp)
.text:0000000120003C30                 ld      $a1, -0x7F58($gp)
3.本程序涉及大量的fpu操作(浮点运算单元),可在gdb中使用i fl(info float)指令查看fpu,下文的f0、f12等都是fpu。

4.fpu会有single(单精度)和double(双精度)表示,以上图f0为例,其单精度值(flt)为4,双精度值(dbl)为13.000001922249794。如果汇编指令是 c.lt.s (最后的s表示以单精度的计算),会判断 $f1(flt)
.text:0000000120003BA8                 c.lt.s  $f1, $f0        
.text:0000000120003BAC                 bc1f    loc_120003BCC   
.text:0000000120003BB0                 ld      $v0, -0x7F78($gp) 
.text:0000000120003BB4                 lwc1    $f1, -0x116C($v0)
c.lt.s 意思大概是 compare less than in single ( c.lt.d 则是在double,即双精度范围计算)bc1f : jump if compare result is false (f表示false,bc1t 表示 true才跳)
5.程序中多次出现以下片段,多次出现的-0x7f78是程序里面一个基地址,将基地址赋值给$v0寄存器,第二句再根据这个基地址($v0),取一个常量到寄存器或fpu($f1 = [$v0-0x1164])。
ld      $v0, -0x7F78($gp)
lwc1    $f1, -0x1164($v0)
 
逆向过程
qemu使用-strace参数,让程序输出更多的调试信息

可以看到系统使用了write(1,0x200b97d0,40)来输出“Welcome to QWB, Please input your flag:”这40个字符,联想到x64架构1表示stdout,0x200b97d0表示字符串地址,40表示输出长度
从write(1,0x200b97d0,40)到write(1,0x200b97d0,12)之间,有一个Linux(0,4832599008,1024,0,4832599008,4),猜测就是一个read函数系统调用了,要逆向就要知道read函数到输出Wrong Flag!之间发生什么,调用了哪些函数。
 
定位输入点
由于gdbserver调试不能用ctrl+c中断再下断点,所以从IDA将所有可能是函数的地址复制出来

编辑成为gdb断点的格式,并粘贴到gdb中,大约600多个断点


用qemu-mips64 -strace -g 9999 ./mips64启动程序,在gdb侧链接gdbserver后不停的按c,直至程序堵塞等待输入,这是看到最后一个触发的断点是:0x0000000120022404,说明输入在这里附近

然后在程序随便输入内容,如1234回车,让程序继续执行。在gdb一路c,直到看到程序输出Wrong Flag!,记录这段时间的断点。

0x0000000120014740 in ?? ()
0x0000000120014740 in ?? ()
0x000000012001f110 in ?? ()
0x000000012000d6b0 in ?? ()
0x000000012001f110 in ?? ()
0x00000001200206e0 in ?? ()
0x00000001200138a0 in ?? ()
0x0000000120012978 in ?? ()
0x0000000120012120 in ?? ()
0x000000012000ffc8 in ?? ()
0x00000001200112f0 in ?? ()
0x0000000120022504 in ?? ()
gdb中按d清理所有断点,重新设置断点为上述函数
b* 0x0000000120014740
b* 0x0000000120014740
b* 0x000000012001f110

上一页  [1] [2] [3] [4] [5]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载