ACSC2021 - Histogram

728x90

csv파일 개념 자체도 몰랐으며 nan이라는 값도 몰라 풀지 못했던 문제이다.

공격 벡터는 알았으나 실제로 이를 적용하지 못해 풀지 못했던 아쉬운 문제.

 

우선 개념부터 짚고 넘어가자.

CSV(영어: comma-separated values)는 몇 가지 필드를 쉼표(,)로 구분한 텍스트 데이터 및 텍스트 파일이다. 확장자는 .csv이며 MIME 형식은 text/csv이다. comma-separated variables라고도 한다.

출처: 위키피디아

예시

1.01, 2.01
1.01, 2.01
1.01, 2.01
1.01, 2.01
1.01, 2.01
1.01, 2.01
1.01, 2.01
1.01, 2.01
1.01, 2.01

 

NaN(Not a Nuber)데이터

표현 불가능한 수치형 데이터

 

분석

read_data부분에서 취약점이 발생한다.

int read_data(FILE *fp) {
  /* Read data */
  double weight, height;
  int n = fscanf(fp, "%lf,%lf", &weight, &height);
  if (n == -1)
    return 1; /* End of data */
  else if (n != 2)
    fatal("Invalid input");

  /* Validate input */  
  if (weight < 1.0 || weight >= WEIGHT_MAX)
    fatal("Invalid weight");
  if (height < 1.0 || height >= HEIGHT_MAX)
    fatal("Invalid height");

  /* Store to map */
  short i, j; // short=  -32768~32767
  i = (short)ceil(weight / WEIGHT_STRIDE) - 1;
  j = (short)ceil(height / HEIGHT_STRIDE) - 1;
  
  map[i][j]++;
  wsum[i]++;
  hsum[j]++;

  return 0;
}

아래 코드에서 정확하게 취약점이 발생한다.

  i = (short)ceil(weight / WEIGHT_STRIDE) - 1;
  j = (short)ceil(height / HEIGHT_STRIDE) - 1;

 

취약점이 발생하는 이유는 weight / WEIGHT_STRIDE(10)부분인데 weight값을 10으로 나눈다.

이때 weight값이 1미만이면 weight / WEIGHT_STRIDE는 0.~~이 되거나 다른 값이 되는데, ceil함수때문에 0으로 바뀌고 0-1 = -1이 되어 인덱스가 음수가 되는 상황이 발생한다.

 

 ceil함수 = ceil() 함수는 소수점 자리의 숫자를 무조건 올리는 함수, 실수를 정수로 만든다.

 

그럼 예시의 값을 넣어보고 메모리 구조를 관찰해보자.

1.0, 1.0
2.0, 2.0
3.0, 3.0
4.0, 4.0
5.0, 5.0

위 값을 넣으면

입력한 데이터의 개수가 들어감

즉 동일한 값을(ex)5.0, 5.0) 10번 입력하면 map에 10이라는 값이 쓰여진다. 이를 통해 map에 원하는 값을 쓸 수 있다.

하지만 weight의 값을 nan으로 넣어준다면, (nan/10) -1 = i가 되기 때문에 결론적으로 i는 -1이 된다.

메모리 구조를 보면 0x405cbc부분이 4라는 값이 들어감을 볼 수 있다.

즉 weight의 값을 nan으로 주면 i를 -1로 하여 map 이전의 값을 변경할 수 있다는 의미이다.

 

map[-1][j]이고, j에 따라 저장할 수 있는 위치가 달라지니, j를 3주고 인덱스 위치에 잘 맞춰서 fclose 함수를 win함수로 뒤 덮으면 됨(뒤 3바이트만)

 

nan,30 을 520번 써주면 끝
728x90

'CTF 풀지못한 문제 - pwn' 카테고리의 다른 글

2021 HackTheBox - arachnoid_heaven  (0) 2021.12.20
2021 SECCON CTF - Kasu bof  (0) 2021.12.13
TSG 2021 - Coffee  (0) 2021.10.05