#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
int target;
void vuln()
{
char buffer[512];
fgets(buffer, sizeof(buffer), stdin);
printf(buffer);
if(target == 64) {
printf("you have modified the target :)\n");
} else {
printf("target is %d :(\n", target);
}
}
int main(int argc, char **argv)
{
vuln();
}
printf(buffer) -> fsb 가 일어난다.
4번째 %p에서 AAAA가 출력된다.
왜? 4번째 %p에서 AAAA가 출력이 될까? gdb로 봐보자
printf를 실행하기전 인자값("AAAA%p %p %p %p %p")를 스택에 넣고 printf 함수를 실행하는데, %p는 차례대로 [esp+4], [esp+8], [esp+12], [esp+16] 을 출력하게된다. 4번째 %p([esp+16]) 에 AAAA가 있기 때문에 AAAA가 출력이되는 것이다.
따라서 AAAA에 target의 주소를 넣고 4번째 %p를 %n으로 바꾸면 target의 값이 씌여질 것이다.
gdb를 통해 target의 주소를 구하고 [그림 1-3]를 보내본다.
target에 4가 쓰인 이유는 %4$n을 하기전 4byte(target 주소)가 들어가 있기 때문이다.
하지만 60이 부족하다.
%4%n을 하기전 %60c 를 통해 부족한 60을 채워버리면 64만큼 출력하기 때문에 target에 64가 씌여 문자열이 출력된다.