format3

oogu ㅣ 2023. 1. 24. 13:29

#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]

[그림 1-1]를 보면 0x01025544를 만들기 위해서는 엄청 큰 숫자가 들어가야 한다.

저 숫자를 출력하면 문제가 생길 수 있다. 따라서 4byte를 한 번에 입력하는 것이 아니라 2byte씩 나눠서 입력해야 한다.

[그림 1-2]

gdb를 통해 target의 주소를 알아올 수 있다. -> 0x80496f4

[그림 1-3]

[그림 1-3]처럼 2byte씩 0x080496f6에는 102를 넣고 0x080496f4에는 5544를 넣으면 된다.

[그림 1-4]

12번째 %p에서 AAAA를 출력하고 13번째 %p에서 BBBB를 출력한다.

 

AAAA에는 0x080496f6 주소를 넣어 12번째 %p를 %n으로 바꿔 0x080496f6 주소에 0x102 넣으면 된다.

이런 식으로 0x080496f4에도 5544를 넣자.

[그림 1-5]

[그림 1-5]가 완성된 payload이다.

0x080496f6에 먼저 값을 넣는 이유는 들어가는 숫자 크기가 더 작기 때문이다.

2byte만 쓰기 위해서는 %hn을 사용한다.

1byte면 %hhn

4byte면 %n

[그림 1-6]

[그림 1-5]를 넣으면 위 문자열을 출력한다.

'protostar' 카테고리의 다른 글

heap00  (0) 2023.01.27
format4  (0) 2023.01.24
format2  (0) 2023.01.24
format0  (0) 2023.01.24
stack7  (0) 2022.09.11