#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
int target;
void printbuffer(char *string)
{
printf(string);
}
void vuln()
{
char buffer[512];
fgets(buffer, sizeof(buffer), stdin);
printbuffer(buffer);
if(target == 0x01025544) {
printf("you have modified the target :)\n");
} else {
printf("target is %08x :(\n", target);
}
}
int main(int argc, char **argv)
{
vuln();
}
printf(string) -> fsb가 발생한다.
target의 값을 0x01025544로 바꿔야 하는데
[그림 1-1]를 보면 0x01025544를 만들기 위해서는 엄청 큰 숫자가 들어가야 한다.
저 숫자를 출력하면 문제가 생길 수 있다. 따라서 4byte를 한 번에 입력하는 것이 아니라 2byte씩 나눠서 입력해야 한다.
gdb를 통해 target의 주소를 알아올 수 있다. -> 0x80496f4
[그림 1-3]처럼 2byte씩 0x080496f6에는 102를 넣고 0x080496f4에는 5544를 넣으면 된다.
12번째 %p에서 AAAA를 출력하고 13번째 %p에서 BBBB를 출력한다.
AAAA에는 0x080496f6 주소를 넣어 12번째 %p를 %n으로 바꿔 0x080496f6 주소에 0x102 넣으면 된다.
이런 식으로 0x080496f4에도 5544를 넣자.
[그림 1-5]가 완성된 payload이다.
0x080496f6에 먼저 값을 넣는 이유는 들어가는 숫자 크기가 더 작기 때문이다.
2byte만 쓰기 위해서는 %hn을 사용한다.
1byte면 %hhn
4byte면 %n
[그림 1-5]를 넣으면 위 문자열을 출력한다.