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. 공격 명령어 작성
'WARGAME > hackerschool ftz,lob' 카테고리의 다른 글
[해커스쿨 ftz] level 18 -> level 19 (0) | 2014.08.23 |
---|---|
[해커스쿨 ftz] level 17 -> level 18 (0) | 2014.08.23 |
[해커스쿨 ftz] level 15 -> level 16 (0) | 2014.08.22 |
[해커스쿨 ftz] level 14 -> level 15 (0) | 2014.08.22 |
[해커스쿨 ftz] level 13 -> level 14 (0) | 2014.08.22 |