상세 컨텐츠

본문 제목

01.ROP(Return Oriented Programming)-x86

본문

  • ROP( Return-oriented programming )는 공격자가 실행 공간 보호(NXbit) 및 코드 서명(Code signing)과 같은 보안 방어가있는 상태에서 코드를 실행할 수있게 해주는 기술이다.
    • RTL + Gadgets
  • 이 기법에서 공격자는 프로그램의 흐름을 변경하기 위해 Stack Overflow 취약성이 필요하고"가젯(Gadgets)"이라고 하는 해당 프로그램이 사용하는 메모리에 이미 있는 기계 명령어가 필요하다.
    • 각 가젯은 일반적으로 반환 명령어(ret)로 끝이나며, 기존 프로그램 또는 공유 라이브러리 코드 내의 서브 루틴에 있다.
    • 가젯과 취약성을 사용하면 공격자가 임의의 작업을 수행 할 수 있다.

Gadgets - POP; POP; POP; RET

ROP는 기본적으로 RTL 기법을 이용하며, 공격자는 RTL과 Gadgets을 이용해 공격에 필요한 코드를 프로그래밍 하는 것이다.

  • 01.RTL(Return to Libc) - x86 에서 system() 함수만 호출하였다.
  • 하지만 프로그램 및 운영체제,등 다양한 상황에 따라 여러 개의 함수 호출이 필요할 수 있다.

RTL structure

Stack address Value Explanation
0xffffd57c System function address of libc Fuction Return Address
0xffffd580 The address to return to after calling the system function  
0xffffd584 First argument value  
  • 여러 개의 함수를 호출하기 위해 사용되는 것이 Gadgets이며, 기본적으로 다음과 같은 Gadgets 이 사용된다.
    • 호출 하는 함수의 인자가 3개 일 경우 : "pop; pop; pop; ret"
    • 호출 하는 함수의 인자가 2개 일 경우 : "pop; pop; ret"
    • 호출 하는 함수의 인자가 1개 일 경우 : "pop; ret"
    • 호출 하는 함수의 인자가 없을 경우 : "ret"
  • 해당 Gadgets들의 역할은 ESP 레지스터의 값을 증가시키는 것이다.
    • RTL에 의해 호출되는 함수에 전달되는 인자 값이 저장된 영역을 지나 다음 함수가 호출될 수 있도록 하는 것이다.
    • x86 바이너리에서는 pop 명령어의 피연산자 값은 중요하지 않다. (x64는 중요)

다음과 같은 방법으로 여러 개의 함수를 연속해서 실행할 수 있다.

  • RTL에서 호출할 함수(주소 값이 저장된)의 다음 영역은 해당 함수가 종료된 후 이동할 Return Address 영역이다.
  • 해당 영역에 Gadgets의 주소를 저장함으로써 연속해서 다음 함수가 호출될 수 있다.
  • 아래 예제는 read() 함수 호출 후 System() 함수를 호출하게 된다.

ROP structure

Stack Address Value Explanation
0xffffd57c Read function address of libc Function Return Address
0xffffd580 Address of gadgets(pop;pop;pop;ret)  
0xffffd584 First argument value  
0xffffd588 Second argument value  
0xffffd58c Third argument value  
0xffffd590 System function address of libc  
0xffffd594 The address of retunr to after calling the system function  
0xffffd598 First argument value  

 

PLT & GOT

  • 프로시저 링키지 테이블(PLT, Procedure linkage table)에는 동적 링커가 공유 라이브러리의 함수를 호출하기 위한 코드가 저장되어 있다.
    • 해당 정보들은 ".plt" 섹션에 저장되어 있다.
  • 전역 오프셋 테이블(GOT, Global offset table)에는 동적 링커에 의해 공유 라이브러리에서 호출할 함수의 주소가 저장된다.
    • 이 정보들은 ".got.plt" 섹션에 저장된다.
    • 이 섹션은 공격자들의 공격 대상이 되며, 주로 힙, ".bss" Exploit에 의해 포인터 값을 변조 한다.
  • ROP에서는 해당 정보들을 유용하게 활용할 수 있다.

다음과 같이 PLT & GOT 영역의 내용 및 값의 변경을 확인할 수 있다.

  • read() 함수가 처음으로 호출되기 전에 Break point를 설정하였다.

  • read함수의 plt, got 영역의 주소는 다음과 같다.

    • .plt : 0x8048300

    • .got.plt : 0x804a00c

  • read@plt 영역에는 libc에서 read() 함수를 호출하기 위한 코드가 저장되어 있다.

  • read@plt 의 코드는 다음과 같이 동작한다.

    • read@got(0x804a00c) 영역에 저장된 주소로 이동한다.

    • read@got(0x804a00c) 영역에는 <read@plt+6>(0x8048306)영역의 주소가 저장되어 있다.

      • 이는 해당 프로그램에서 read() 함수가 한번도 호출되지 않았기 때문이다. 

    • <read@plt+11> 의 "jmp 0x80482f0" 코드에 의해 _dl_runtime_resolve() 함수를 호출한다.

      • 해당 함수는 libc에서 찾고자 하는 함수(read)의 주소를 .got.plt 영역에 저장한다.
    • read() 함수가 호출된 후 read@got(0x804a00c)영역에는 libc의 read() 함수 주소가 저장되어 있다.

Proof of concept

다음과 같이 Overflow를 확인할 수 있다.

  • Return address(0xffffd37c) - buf 변수의 시작 주소 (0xffffd33e) = 62

  • 즉, 62개 이상의 문자를 입력함으로써 Return address 영역을 덮어 쓸 수 있다.

Exploit 순서

  1. read 함수를 이용해 "/bin/sh" 명령을 쓰기 가능한 메모리 영역에 저장

  2. write 함수를 이용해 read 함수의 .got 영역에 저장된 값을 출력
  3. read 함수를 이용해 read 함수의 .got 영역에 system 함수의 주소로 덮어씀
  4. read 함수 호출 - read .got 영역에 system 함수의 주소가 저장되어 있기 때문에 system 함수가 호출됨
read(0,writableArea,len(str(binsh)))
write(1,read_got,len(str(read_got)))
read(0,read_got,len(str(read_got)))
system(writableArea)

확인해야 할 정보 목록

  • "/bin/sh"명령을 저장할 수 있는 쓰기 가능한 메모리 공간
  • read(), write() 함수의 plt, got
  • system() 함수의 주소
  • pop,pop,pop,ret 가젯의 위치

Finding a writable memory space

해당 바이너리의 0x0804a000 ~ 0x0804b000 영역에 쓰기권한이 부여되어 있다.

 

앞에서 확인한 쓰기 가능한 영역에는 .got.plt, .data, .bss 섹션이 포함된다.

 

Find gadget

rp++를 사용하여 원하는 Gadgets을 찾는다.

 

Find plt, got address - read, write

다음과 같이 gdb에서 .plt, .got 영역을 확인 할 수 있다.

 

Find the address of the system() function

다음과 같이 system 함수의 Address, offset을 확인할 수 있다.

 

Exploit

 

 

REF: https://www.lazenca.net/display/TEC/01.ROP%28Return+Oriented+Programming%29-x86

 

01.ROP(Return Oriented Programming)-x86 - TechNote - Lazenca.0x0

Excuse the ads! We need some help to keep our site up. List Return Oriented Programming(ROP) -x86 ROP( Return-oriented programming )는 공격자가 실행 공간 보호(NXbit) 및 코드 서명(Code signing)과 같은 보안 방어가있는 상태�

www.lazenca.net

 

관련글 더보기

댓글 영역