FC3 dark_eyes->hell_fire
/*
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 |