FC3 hell_fire -> evil_wizard
by St1tch
/*
The Lord of the BOF : The Fellowship of the BOF
- evil_wizard
- Local BOF on Fedora Core 3
- hint : GOT overwriting
*/
// magic potion for you
void pop_pop_ret(void)
{
asm("pop %eax");
asm("pop %eax");
asm("ret");
}
int main(int argc, char *argv[])
{
char buffer[256];
char saved_sfp[4];
int length;
if(argc < 2){
printf("argv error\n");
exit(0);
}
// for disturbance RET sleding
length = strlen(argv[1]);
// healing potion for you
setreuid(geteuid(), geteuid());
setregid(getegid(), getegid());
// save sfp
memcpy(saved_sfp, buffer+264, 4);
// overflow!!
strcpy(buffer, argv[1]);
// restore sfp
memcpy(buffer+264, saved_sfp, 4);
// disturbance RET sleding
memset(buffer+length, 0, (int)0xff000000 - (int)(buffer+length));
printf("%s\n", buffer);
}
문제를 보면 got overwriting으로 풀어라고 되있다.
다른 보호기법들의 설명은 생략하겠다.
일단 pop_pop_ret함수로 인해 poppopret가 있기 때문에 이전에 가젯이 없어서 못푼 문제와는 달리 공격을 시도할 수 있다.
우선 '/bin/sh'문자열과 system함수의 주소에 쓰이는 값들을 모두 찾아내서 배열로 만들었다.
그리고 got를 overwrite할 함수를 정해야 하는데 나는 그냥 printf로 했다. 별 다른 이유는 없다.
대략 적인 순서는 system주소를 bss영역에 쓴 다음,
printf함수의 got를 bss영역의 주소로 바꾸었다.
그리고 '/bin/sh' 문자열을 다시 bss영역에 쓴 다음,
printf 함수를 호출하고 인수로 bss영역의 주소를 주었다.
이렇게 하면 printf("/bin/sh")가 실행되지만 printf의 got가 system함수의 주소이기 때문에,
결국에 system("/bin/sh") 가 실행이 되어 쉘을 획득할 수 있다.
블로그의 정보
튜기's blogg(st1tch)
St1tch