본문 바로가기

WARGAME/hackerschool ftz,lob

[해커스쿨 ftz] level 16 -> level 17

hint
#include <stdio.h>
void shell () {

setreuid(3097, 3097);

system("/bin/sh");

}


void printit() {

printf("Hello there!\n");

}


main ()

{
      int crap;

void (*call) () = printit;

char buf[20];

fgets(buf, 48, stdin);

call();

}



풀이

1. 위 소스는 이전 문제와 초기화한 변수가 동일하다. 약간의 차이점은 이전 문제에서는 포인터 변수였지만 여기선 포인터 함수로 변경되었다.

소스 마지막에 call()을 실행하고 있는데, 그렇다면 포인터 함수인 call에 shell()의 주소값을 넣어주면 될 것 같다.

gdb로 확인하여 스택 구조를 본다.

1-1 $ cp attackme ./tmp/attackme

1-2 $ gdb attackme

1-3 disas main


16진수로 0x38, 10진수로 56바이트를 할당하고 있다. 

이전의 문제도 56바이트를 할당하고 있었으므로 dummy의 크기와 위치가 이전 문제와 동일할 것이다.

그렇다면 스택의 일부분의 구조는 다음과 같다

low address ... | buf[20] | dummy(20) | *call | crap | .... high address 


따라서, buf와 dummy에 쓰레기 값을 40바이트 채우고 shell()함수의 주소를 써주면 된다.


2. shell() 함수 주소 확인



3. 공격 명령어 작성