본문 바로가기

HACK/Pwnable

ROP 기법

ROP(Return Oriented Programming)

프로그램 내부에 있는 가젯을 이용해  BOF 공격 시 특정 명령을 실행 시키는 방법


들어가기에 앞서 보호기법 4가지를 소개하겠다


NX: 쓰기와 실행 권한을 동시에 가지지 않는다 

코드영역에 쓰기를 할 수 없고 데이터 영역에 실행을 할 수 없다

환경변수에 쉘코드와 NOP를 넣고 브루트 포싱 해결 가능


ASLR: 스택, 힙, 라이브러리 주소가 랜덤화된다 

ulimit -s unlimited으로 해결할 수 있다

스택의 크기를 최대로 늘리는 명령어


PIE: 바이너리 영역을 랜덤화


SSP: 변수 순서 재배치

카나리(BOF가 발생할 때 카나리를 덮으면 강제 종료) 추가


그럼 ROP 기법을 사용해 우회 해보자!

여기서 우회란 보호기법이 제한하고 있는 사항을 넘어서 제한하지 않는 곳을 찾아서 공격하는 것



소스


컴파일을 할 때 

gcc -o test test.c -fno-stack-protector -z execstack -fno-builtin -mpreferred-stack-boundary=2

이렇게 하고 시작하자!


-fno-stack-protector: 카나리 해제

-z execstack -fno-builtin: 스택 실행 DEP

-mpreferred-stack-boundary=2: 스택 더미 없애기


지금 목표는 strcpy를 사용해 bss영역에 "/bin/sh"를 복사하고

system함수를 사용해 bss를 호출하는 것이다


데이터 영역은 변수와 배열 구조체 등이 저장되는 곳인데

여기서 초기화된 데이터는 데이터 영역에 저장되고

초기화 되지 않은 데이터는 bss에 저장된다

이 영역은 ASLR이 걸려있지 않아 사용하기 안성맞춤이다



strcpy주소와 system주소를 찾고


PPR을 주소를 찾는다

PPR이 필요한 이유는


strcpy strcpy_ret bss+0 "/" 이렇게 있다 치면

stcpy함수가 끝나고 strcpy_ret으로 eip가 설정되는데

뒤에 bss+0 "/"이걸 인자로 넘어가게 해줘야한다

그래서 PPR 주소를 strcpy_ret대신 넣어주면

리턴하고 나서 bss+0과 "/"를 넘고

다시 strcpy가 실행될 수 있다


bss 영역주소


이제 가젯들을 모은다







다 구하면



strcpy ppr bss+0 "/"

strcpy ppr bss+1 "b"

strcpy ppr bss+2 "i"

strcpy ppr bss+3 "n"

strcpy ppr bss+4 "/"

strcpy ppr bss+5 "s"

strcpy ppr bss+6 "h"

strcpy ppr bss+7 "\x00"

system AAAA bss


system함수 다음 AAAA를 넣는 이유는

system 함수를 호출하고나면 쉘이 따지는데 그후에 어디로 리턴하던 상관없기 때문


그래서 쉘을 딴후 exit를 해보면 세그멘테이션 오류가 뜬다


제대로 쓴건지는 모르겠지만 틀린부분은 알려주세요!!!!!!!!!!!