[해커스쿨 ftz] level 17 -> level 18

2014.08.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. 컴파일 후 실행



smleenull WARGAME/hackerschool ftz,lob

티스토리 툴바