FC3 iron_golem->dark_eyes

Posted by dw0rdptr
2017. 4. 7. 18:10 System/FC3

/*
    The Lord of the BOF : The Fellowship of the BOF
    - dark_eyes
    - Local BOF on Fedora Core 3
    - hint : RET sleding
*/
int main(int argc, char *argv[])
{
    char buffer[256];
    char saved_sfp[4];
   
    if(argc < 2){
        printf("argv error\n");
        exit(0);
    }
  
    // save sfp
    memcpy(saved_sfp, buffer+264, 4);
 
    // overflow!!
    strcpy(buffer, argv[1]);

    // restore sfp
    memcpy(buffer+264, saved_sfp, 4);

    printf("%s\n", buffer);
}




sfp값을 저장해두고 복구하기 때문에 fake ebp로 공략이 불가능하다. 힌트에서 알려준대로 RET sleding로 공격하자.


RET sleding : RET Sleding은 RET를 연속적으로 호출해 스택상의 스택포인터 위치를 위로 옮기는 방법이다.

ASCII Armor가 적용되어 있어 인자구성이 불가능할 때 스택에서 쓸 수 있는 인자를 찾는다. 인자의 위치까지 함수 실행 위치를 끌어올릴때 RET Sleding을 사용하면 직접 인자를 구성하지 않아도 공격이 가능하다. 여기서 RET는 어셈블리 명령어로 함수 에필로그의 LEAVE RET 과정중 하나인데 RET는 pop eip, jmp eip 명령어로 구성되어 있다. pop이 있어 RET를 한번 호출하면 esp가 증가하게 되는 것이다.

먼저 스택구조를 보자

gdb로 분석해보면
| saved_sfp[4] | dummy1[12] | buffer[256] | dummy[8] | sfp[4] | ret[4] | 이렇게 된다
dummy크기는 대충 때려맞추고 gdb로 분석했다.

이 문제에서도 execl함수를 쓸건데, 먼저 RET가젯과 스택에서 execl의 인자로 줄 수 있는 부분을 찾자


 


 
0x0083eff4를 execl의 인자로 주자
execl을 호출할땐 | &execl | &exit | Arg1 | 구조가 되므로 Arg1에 0x0083eff4의 주소가 들어가야 한다.

그럼 execl은 0x0083eff4의 주소에서 8을 뺀 주소에 위치해야 하므로
0xfee3cf2c - 8(&0x0083eff4) =0xfee3cf28

0xfee3cf28에서 execl을 실행하려면 RET sled를 세번 타야된다.

이제 인자로 0x0083ff4가 들어가고 실행되는 주소에 전 문제와 같이 exploit 코드를 짜서 심볼릭링크를 걸어준다.



 
0x0083eff4를 실행하면 나오는 주소인 0x0083ed3c를 심볼릭링크의 이름으로 걸어준다.

최종 페이로드

| (buf+sfp)dummy[268] | RET | RET | RET | &execl |




'System > FC3' 카테고리의 다른 글

FC3 evil_wizard->dark_stone  (1) 2017.04.07
FC3 hell_fire->evil_wizard  (0) 2017.04.07
FC3 dark_eyes->hell_fire  (0) 2017.04.07
FC3 gate->iron_golem  (0) 2017.04.07