시큐어코딩

시큐어코딩 (10) - CH 02-6 Arc injection(return-into-libc)

vitamin3000 2025. 4. 13. 22:42

 

이번 포스트에서는 Arc injection(아크 주입)에 대해 알아보고자 한다.

 

 1. Arc injection이란?

정의 : 지정한 프로세스가 강제로 동작하도록 하는 것,

예를 들어 코드의 흐름 강제 조정, 원복 가능

 

  • 아크 인젝션은 프로그램 메모리 공간에 이미 존재하는 코드로 제어권을 이전한다
  • 악용은 프로그램의 제어 흐름 그래프에 새로운 아크(제어 흐름 전송)를 삽입하는 방식을 말한다
  • 기존 함수 system() 또는 exec()의 주소를 설치할 수 있으며, 이 함수는 로컬 시슽메에서 프로그램을 실행하는데 사용할 수 있다
  • 이 기술을 사용하면 훨씬 더 정교한 공격이 가능하다

2. Vulnerable Program(취약 프로그램)

 

취약 코드의 예시를 살펴보자

#include <string.h>

int get_buff(char *user_input){
	char buff[4];
    
    memcpy(buff, user_input, strlen(user_input)+1);
    return 0;
}

int main(int argc, char *argv[]){
	get_buff(argv[1]);
    return 0;
}

 

이 코드는 다음의 악용 가능성을 내포하고 있다

  • 반환 주소를 기존 함수로 덮어씌운다
  • 함수 호출을 연결하는 스택 프레임을 생성한다
  • 원래 프레임을 다시 생성하여 프로그램으로 돌아가고 감지 없이 실행을 재개한다.

3. 위 코드에서의 Stack Before and After Overflow

 

 

기존 main 함수에는 Before의 stack만이 존재하였다.

 

이때 공격자는 Frame1과 Frame2를 추가한다고 가정해보자

Frame1은 f함수와 관련되어있고, Frame2은 g함수와 관련되어 있다.

즉 buff -> f -> g -> main 함수로 실행된다,.

 

따라서 g에 main의 ebp를 연결 및 저장한다

*ebp는 extended base pointer를 의미한다

 

 

3-1 get_buff() Returns는 다음과 같이 실행된다.

 

 

f함수가 실행되고,

 

f함수가 종료되면서 f()는 제어를 반환하고 종료된다 이때 ebp는 g에연결되어 있기에, g함수가 실행된다.

이어서 g함수가 실행된다.

g함수 역시 실행이 완료된후 g()는 제어를 반환하고 종료된다.

이때 ebp가 Original Frame에 연결되어 있기에 이곳으로 이동하여 실행한다

 

공격자가 f와 g함수를 추가하여 실행했지만 OriginalFrame을 처음부터 보존시켰고, 수정하지 않았기 때문에 

main에 반환되는 제어권은 Original Frame의 값이다


4. 왜 이것이 흥미로울까?

  • 공격자는 여러개의 함수를 인수와 함께 연결할 수 있다.
  • 코드 세그먼트에 사전 설치된 "악용"코드가 존재한다
    • 따라서 코드를 삽입하지 않는다
    • 그래서 매모리 기반 보호 체계는 Arc Injection(아크 삽입)을 방지할 수 없다
    • 더 큰 오버 플로우가 필요하지 않다
  • 탐지를 방지하기 위해 원본 프레임을 복원할 수 있다.