ropexploit - s0ngsari

Download Report

Transcript ropexploit - s0ngsari

RETURN ORIENTED
P RO G R A M M I N G
송상준
[email protected]
RETURN ORIENTED
PROGRAMMING
코드섹션에있는 가젯을 하나하나 모아서 공격하는 기법
- 가젯
- 문자, pop … ret 등등
RETURN ORIENTED
PROGRAMMING
 ASLR, DEP/NX Bit등의 보호기법 우회가능
 RTL, Chaining RTL, GOT Overwrite 모든 기법을 사용함,
이 강의에서는 그냥 Chaining RTL임(GOT Overwrite안함)
RETURN ORIENTED
PROGRAMMING
 기본구조
- func@plt + pop..ret + 담을주소 + 문자
이것을 하나하나 체이닝하면 문자열이 완성되고 공격이
가능해짐~
- popret, poppopret, poppoppopret 의 용도가 각각 존재함
RETURN ORIENTED
PROGRAMMING
 인자가 하나일때 (pop ret)
EX) gets
 인자가 두개일때(pop pop ret)
EX) strcpy
 인자가 세개일때(pop pop pop ret)
EX) fgets
** pop 하나당 4바이트를 빼주어 우리가 담을공간을 마련해줌
인자를 담고 그 함수를 리턴시켜 최종적으로 bss주소에
문자열을담음
FIND GADGET
 Objdump, ropshell …
 둘다 사용하는경우도있지만 objdump를 사용하는 경우가
많음
OBJDUMP
 Object dump로, pop ..ret과 문자열, data,bss주소등을
알아낼수있음
 리눅스에서 기본으로 제공하는 아주 좋은 유틸리티
 아쉽게도 맥에서는 기본으로 제공안함 ㅠㅠㅠ
EXPLOIT SCENARIO
 Find gadget(popret,char(/bin/sh) etc…
 문자열 담을공간이 필요하기에 bss주소 등을 구함
 문자열을 담고 system@plt가 있을시 bss주소를 인자로주
어 실행
 쉘이 뿅!
EXPLOIT
gets함수로 입력받고, 그것을 어떠한 함수로 넘겨줌
그냥 strcpy에 입력받은값을 넘겨주는 함수
버퍼는 0x108로, 264니까 272바이트에서 RET가 덮힘
EXPLOIT
-s 옵션을 사용해 /가 어디있는지 확인할수 있음
/ - 8048154주소에 존재함!
-s옵션으로 grep “b”로 바꿔 하나하나 찾아서
/bin/sh\00 각각 문자의 주소를 찾으면됨
EXPLOIT
 Bss주소를 찾아야지!
objdump –h filename 으로 알아낼수있음
Bss주소가 0x0804a040, 크기는 1030바이트인것을 알수있음
Bss처음공간에 더미가있을수있어 8BYTE 떨어진곳을 씁시당
/bin/sh\00담기는 충분한 크기
EXPLOIT
 Pop pop ret을 쓰자!! ( objdump –d filename)
원하는거 쓰면됨, pop pop pop pop ret을 쓰려면 맨위의 주소를 씀
pop pop ret은 0x804862e를 사용하면됨
EXPLOIT
 System,strcpy 함수의 plt가 필요함
0x080483a0 – strcpy@plt (시스템도 똑같이 구합시당)
옆에있는 jmp ds:주소는 got 주소
실제로 gdb에서 disas 0x080483a0하면 got가 나옴(검색시 자세히나옴)
EXPLOIT
 우왕 가젯 다모음!
/bin/sh\00이지만 /주소는 하나로 씀!
EXPLOIT
 strcpy@plt + ppr + bss + (/bin/sh) …… system + AAAA + bss
 각각의 문자를 bss[0], bss[1],bss[2]에 하나하나 담아야함
리스트로 넣어도되지만 이해를 돕기위해!!
각각 /,b,i,n,/,s,h,\x00, 8개가 들어감
\x00을통해 system이 bss첫주소를 인자로주면
/bin/sh까지 실행되고 뒤에 더미들은 실행 X
EXPLOIT
 Payload를 작성하고 서버에 날려보자~!
 *가젯들을 로컬에서 구했지만 전부 IDA에서 구할수있음
혹은 바이너리가 주어지니 자신의 리눅스에 업로드하고
하면됨
/BIN/SH
쉘이 정상적으로 따이고 flag.txt까지 읽어냄
EXPLOIT
Poppopret은 2개의 인자 넣을공간을확보하고
함수를 리턴시켜 문자복사가 되는 원리
요약
 Pop..ret사용은 무엇을 체이닝할건지에 따라 달라짐
 Bss + 8주소가아닌 읽기쓰기실행권한이 있는 주소면 모두
사용가능, 단, 주소값이 변하지않는
주소를이용해야함(ASLR주의)
 문자하나하나를 구해 BSS[0], BSS[1]…에 하나하나 넣음
 SYSTEM함수를 호출시켜 인자를 BSS[0]주소값으로주면
된다.
수고하셨습니다.
 email : [email protected]
 blog : s0ngsari.tistory.com
 Facebook: 송상준(검색)
기나긴 발표를 들어주셔서 감사합니다. 따로
질문거리가 있으시면 위 메일이나, 페이스북
메신저로 연락주시면감사하겠습니다