WARGAME/hackerschool ftz,lob
[해커스쿨 ftz] level 17 -> level 18
LF0827
2014. 8. 23. 03:20
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. 컴파일 후 실행