안드로이드에서 스크립트 작성
안드로이드에서는 기본적으로 vi 명령어가 없기 때문에 외부에서 쉘스크립트를 작성 후 adb push 로 올려야 한다.
외부에서 작성 후 업로드하고 스크립트를 실행하려하면 쉘이 파일이나 디렉터리를 찾을 수 없다고 하는 경우가 있다.
1) 외부에서 작성 후 push
에러를 발생시켜보면 sh 프로그램이 /system/bin/sh 위치에 있는걸 확인할 수 있는데
그에 맞춰서 첫줄을 #!/system/bin/sh 로 작성해야 한다.
또한 윈도우(CRLF)와 리눅스(LF)의 개행문자가 다르기 때문에 에디터에서 작성할 때 변경해줘야 한다. (맥은 CR)
2) 내부에서 작성
cat 명령어와 Redirect를 통해 vi처럼 사용할 수 있다.
# cat > test.sh 명령어를 사용하면 test.sh 파일에 앞으로 입력할 데이터를 넣을 수 있다.
# cat >> test.sh 처럼 >>를 사용한다면 append모드로 입력할 수 있다.
입력이 끝나면 Ctrl+C 키를 이용해서 종료하면 된다.
문법
변수 및 특수기호
$# : 입력받은 인자의 수 (=argc)
$0 : 실행한 스크립트의 경로 (=argv[0])
$1~$9 : 첫번째 인자~9번째 인자 (최신 쉘에서는 그 이상도 가능 ${10}으로 중괄호 사용 필수)
~ : 홈 디렉터리를 나타냄
$ : 변수의 값을 표출
${변수명} : 변수의 값을 표출
& : 백그라운드 작업을 실행
# : 주석
*, ? : 와일드카드 문자 (전체, 한자리)
\ : 다음문자 일반문자화
( ) : 하위쉘 시작, 끝
! : NOT
/ : 디렉터리 경로 구분자
; : 쉘 명령 구분자
< : 입력 리다이렉션
> : 출력 리다이렉션 (덮어쓰기)
>> : 출력 리다이렉션 (이어쓰기)
`cmd` : 명령 내 명령을 실행하는 경우
| : 명령의 출력값을 다음명령의 입력값으로 사용
[ ] : 문자집합의 시작과 끝 ex) #ls [a-i]*.sh : a~i로 시작하는 .sh 파일
' ' : 싱글쿼터로 감싸진 모든 특수문자는 일반문자화 된다.
" " : 더블쿼터로 감싸진 $, `, \를 제외한 특수문자는 일반문자화 된다.
i=100 # 선언하고 대입할땐 $를 붙이지 않는다.
echo $i # 변수에 접근할 땐 $를 붙여서 접근하고 출력
echo "Args: $i" # 더블쿼터 문자열 안에 있어도 $로 접근할 수 있다.
echo 'Args: $i' # 싱글쿼터 문자열 안에 있으면 $로 접근할 수 없다.
echo "Args: \$i" # \문자는 다음문자를 일반문자로 변경한다.
echo "Pwd: `pwd`" # 명령 속 명령 실행
echo "test${i}"
# 100
# Args: 100
# args: $i
# args: $i
# Pwd: /data/local/tmp
# test100
조건문
if else문. 물론 if문만 사용해도 된다.
if [ $# eq 0 ]
then
exit
elif [ $# eq 3 ]
then
exit $0
else
exit $1
fi
case문. $arg 변수에 들어가 있는게 -a 인지, -b인지에 따라 분기가 나눠진다.
case $arg in
-a) aflag=1 ;;
-b) bflag=1 ;;
*) echo "Usage test.sh [-a|-b]
esac
반복문
전달받은 인자를 모두 출력.
shift는 가장 앞에있는인자($1)를 인자스택에서 pop 하는 명령어이다.
while문 안에서는 $1만 출력하고 있지만, shift 명령으로 $2 -> $1 로 이동되었기 때문에 다음 while에서 $1을 출력하면 두번째 인자가 출력된다. 인자의 수($#) 이 0이 될때까지 반복된다.
#!/system/bin/sh
echo Argument number: $#
while [ $# -gt 0 ]
do
echo $1
shift
done
while은 조건이 참일동안, until은 참이 될때까지 (거짓인동안) 이다.
for i in [문자열 목록]
do
명령들
done
반복문은 전부 break, continue 사용가능
'모바일 > 보안' 카테고리의 다른 글
안드로이드 네이티브 라이브러리 분석 (0) | 2019.12.10 |
---|---|
Frida : 쓸만한 스크립트 모음 (0) | 2019.12.08 |
Frida : 앱에 정의된 클래스, 호출된 메소드 출력 (0) | 2019.12.06 |
smali : 변조 시 삽입할 수 있는 간단한 코드 (0) | 2019.11.26 |
Frida : 기본 사용법 (0) | 2019.08.14 |