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로 채워 공격한다.
'WARGAME > hackerschool ftz,lob' 카테고리의 다른 글
[해커스쿨 ftz] level 16 -> level 17 (0) | 2014.08.22 |
---|---|
[해커스쿨 ftz] level 15 -> level 16 (0) | 2014.08.22 |
[해커스쿨 ftz] level 13 -> level 14 (0) | 2014.08.22 |
[해커스쿨 ftz] level 12 -> level 13 (6) | 2014.08.22 |
[해커스쿨 ftz] level 11 -> level 12 (0) | 2014.08.22 |