hint
#include <stdio.h>
void printit() {
printf("Hello there!\n");
}
main ()
{
int crap;
void (*call) ()=printit;
char buf[20];
fgets(buf, 48, stdin);
setreuid(3098, 3098);
call();
}
풀이
1. 이전 문제와 비슷한데 이전 문제는 *call 변수에 shell()이라는 system("/bin/sh"); 소스가 들어간 함수의 주소를 작성해 주는 것이었다.
하지만 이번 문제는 main 함수에서 setreuid를 해주고 따로 system("/bin/sh")로 쉘을 실행해주는 함수가 없다.
따라서 buf에 25byte의 쉘 코드를 적고 *call 변수에 buf의 시작 주소를 적어주면 될 것 같다.
여기서 ASLR이 적용되어 있어서 brute force 소스를 작성하였다. 소스는 다음과 같다.
간단하게 44바이트 중 앞의 15바이트는 NOP으로 채우고 나머지 25바이트를 쉘코드로 하고 마지막 4바이트는 0xbfffffff부터 감소해가며 입력하게 하였다.
2. 컴파일 후 실행
'WARGAME > hackerschool ftz,lob' 카테고리의 다른 글
[해커스쿨 ftz] level 19 -> level 20 (0) | 2014.08.23 |
---|---|
[해커스쿨 ftz] level 18 -> level 19 (0) | 2014.08.23 |
[해커스쿨 ftz] level 16 -> level 17 (0) | 2014.08.22 |
[해커스쿨 ftz] level 15 -> level 16 (0) | 2014.08.22 |
[해커스쿨 ftz] level 14 -> level 15 (0) | 2014.08.22 |