본문 바로가기

WARGAME/hackerschool ftz,lob

[해커스쿨 ftz] level 14 -> level 15

hint 

#include <stdio.h>

#include <unistd.h.

main ()

{

int crap;

int check;

char buf[20];


fgets(buf, 45, stdin);

if ( check==0xdeadbeef)

{

setreuid(3095, 3095);

system("/bin/sh");

}

}



풀이

1. level 13 문제와 비슷해보인다. 차이점은 입력으로 파일입출력 함수를 사용한다는 것과 변수의 개수가 늘어난 것이 있다.

이 문제 또한 스택 구조를 예상하여 변수 check 위치에 0xdeadbeef를 넣으면 setreuid로 실제 id와 유효 id를 설정하고 system()함수로 쉘이 떨어질 수 있을 것이다.


1-1 $ cp attackme ./tmp/attackme

1-2 $ gdb attackme

1-3 (gdb) disas main



16진수로 0x38, 10진수로 56바이트의 공간을 할당하고 있다. 따라서 스택 구조는 다음과 같이 예상할 수 있다.


low address ... | buf[20] | check | dummy | crap | dummy| sfp | ret | ... high address

low address ... | buf[20] | dummy | check | dummy | crap | sfp | ret | ... high address

low address ... | buf[20] | dummy | check | dummy | crap | dummy | sfp | ret | ... high address

등등...


2. buf[20]을 쓰레기 값으로 채우고 나머지 36바이트를 0xdeadbeef로 채워 공격한다.