FC3 dark_eyes->hell_fire

Posted by dw0rdptr
2017. 4. 7. 19:53 System/FC3

/*
    The Lord of the BOF : The Fellowship of the BOF
    - hell_fire
    - Remote BOF on Fedora Core 3
    - hint : another fake ebp or got overwriting
    - port : TCP 7777
*/



#include <stdio.h>

int main()
{
    char buffer[256];
    char saved_sfp[4];
    char temp[1024];
 
    printf("hell_fire : What's this smell?\n");
    printf("you : ");
    fflush(stdout);

    // give me a food
    fgets(temp, 1024, stdin);
  
    // save sfp
    memcpy(saved_sfp, buffer+264, 4);
 
    // overflow!!
    strcpy(buffer, temp);

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

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

remote bof라 이전 레벨처럼 링크를 이용한 공격이 불가능하다. 그 이유는 원본 hell_fire에는 setuid가 걸려 있지않고, xinetd으로 동작하는 hell_fire에서 쉘을 따야 하기때문이다.


전에 iron_golem을 풀때 system과 exec함수의 차이점을 공부하는 도중 https://www.joinc.co.kr/w/man/3/system 에서 'system() 함수는 /bin/sh -c string을 호출해 string에 지정된 명령어를 실행하고(생략)/bin/sh를 실행시키기 위한 execve()의 호출...' 에서 system함수에서 인자를받아 execve와 "/bin/sh"를 호출하는 부분이 있다는것을 알수 있다.

간단히 말하면 system함수 내에 do_system에서 "/bin/sh" 를 호출하는 부분이 있는데, ret에 이주소를 넣으면 쉘이 실행된다.

먼저 스택구조를 보면
temp[1024]  | dummy1[??] | saved_sfp[4] | dummy2[??] | buffer[256] | dummy3[??] | sfp[4] | ret [4] |

더미값을 268개 줬을때 segmentation fault가 떴으므로 dummy3은 8이다.


system함수를 분석해보면 아래에 do_system을 호출한다.


do_system 내부에서 execve를 호출하므로 /bin/sh도 위 어딘가에서 인자로 받을것이다. 어딨는지모르겠으니 노가다로 하나씩...해보자

페이로드
| dummy[268] | &/bin/sh |




사실 이문제는 do_system아이디어를 다른곳에서 보고 푼것이기 때문에 제대로 풀었다고는 볼수없다.

힌트에서 준 another fake ebp는 main이 종료되고 돌아가는 함수의 sfp를 덮어쓴다는 방법이라는데 이부분도 공부해두면 좋을거같다.

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

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