본문 바로가기

reversing/reversing

MIPS Instruction[Assembly]

SMALL

MIPS Instruction


MIPS Instruction.hwp

 

정리한 문서에 분석하면서 설명되어있지 않던 명령어

[http://www.mrc.uidaho.edu/mrc/people/jff/digital/MIPSir.html] --> 명령어 설명 좋음


lui    :    Load upper immediate

syntex :     lui $t, imm

값 : $t = imm << 16 

ex)

lui $v0, 40 --> $v0 = 0x40 << 16 = 0x400000



lwl    :  To load the most-significant part of a word as a signed value from an unaligned memory address.

lwr     : To load the least-significant part of a word from an unaligned memory address as a signed value.


   0x00400830 <+80>: addiu v1,v1,2976

   0x00400834 <+84>: lwl a0,3(v1)

   0x00400838 <+88>: lwr a0,0(v1)

   0x0040083c <+92>: lwl a1,7(v1)



여기서 v1+3 의 값은 0x68의 주소인 0x400ba3이다. 저기서 a0로 데이터를 68 63 69 72 차례로 데이터를 가져온다.

또, v1은 지금 0x400ba0인데 여기서 lwr은 메모리 주소에서부터 작은 순서대로 값을 가져온다. 

(gdb) x/32x $v1
0x400ba0: 0x72 0x69 0x63 0x68 0x6f 0x6e 0x67 0x00
0x400ba8: 0x30 0x31 0x30 0x38 0x35 0x34 0x39 0x33
0x400bb0: 0x38 0x34 0x32 0x00 0x61 0x67 0x65 0x20
0x400bb8: 0x3a 0x20 0x25 0x64 0x0a 0x00 0x00 0x00


+84 번지와 +88 번지의 결과 값은 같다.


결과 값이 같으니 헷갈려서 좀더 보면 +92 를 확인한다.


v1+ 7 은 0x00 을 나타내는 주소이다. 그리고 lwl $a1, 7($v1)을 하면 a1을 값은 0x676e6f이다.


그러니가.. lwl dst, src 라고 한다면,,,,,

src 주소에서 <- 방향으로 차례로 4바이트 읽어 저장하는 것이고

  |<-- - - - - - - - -  [ src ]

0x400ba0: 0x72 0x69 0x63 0x68 0x6f 0x6e 0x67 0x00

lwr dst, src라고 한다면.....

src 주소에서 -> 방향으로 차례로 4바이트 읽어 저장하는 것으로 해석.

    [ src ]- - - - - - - - - - ->

0x400ba0: 0x72 0x69 0x63 0x68 0x6f 0x6e 0x67 0x00


jalr 명령어

jalr r     # $ra <— PC+4  $ra <— return address 
           # PC  <— $r    load the PC with the address in $r




bltzal 명령어

-----------------------------------------------------------------------------------------------------------------------------------------------

0x00400090 <_ftext+0>: li a1,1

0x00400094 <_ftext+4>: bltzal a1,0x4000a8 <_ftext+24>

0x00400098 <_ftext+8>: nop

0x0040009c <_ftext+12>: li t0,0xabcd


위와 같은 명령어는 bltzal의 경우  실행하면서 $pc+4는 mips 특징으로 자동적으로 수행됨.

그리고 pc 명령어는 pc+8로 셋팅됨


(gdb) x/32i $pc

0x400094 <_ftext+4>: bltzal a1,0x4000a8 <_ftext+24>

0x400098 <_ftext+8>: nop

0x40009c <_ftext+12>: li t0,0xabcd

0x4000a0 <_ftext+16>: j 0x4000b0 <_ftext+32>


(gdb) si

0x0040009c in _ftext ()

(gdb) x/32i $pc

0x40009c <_ftext+12>: li t0,0xabcd

0x4000a0 <_ftext+16>: j 0x4000b0 <_ftext+32>

0x4000a4 <_ftext+20>: nop


branch나 jmp의 l이 붙으면 link 여서 pc pc+4는 동일하게 실행

----------------------------------------------------------------------------------------------------------------------------------





LIST

'reversing > reversing' 카테고리의 다른 글

[Project] 디버거 만들기 [Python]  (0) 2017.03.30
MIPS Disassemble  (0) 2017.03.30
ARM Handray  (0) 2016.12.06
C++ 리버싱 연습  (0) 2016.11.29
get physical address  (0) 2016.11.29