A Hacker Next Door

[HSCTF 6 Write-up] Web – Accessible Rich Internet Applications

Category: Write-up
Tag: CTF
문제 설명

– index.html

index.html 페이지

Magic Number Generator 라는 제목으로 input 값을 입력받게 되어있는데요, 임의의 숫자를 입력해보면 “i like 0″라는 검색어로 구글링된 페이지로 리다이렉트 됩니다.

index.html 소스코드

index.html의 소스코드를 보시면 난독화되어 읽기가 힘듭니다.

firefox 브라우저의 요소검사 창.

이럴 때에는 브라우저의 요소검사 창을 보시는 것이 도움이 됩니다. F12키를 누르거나 마우스 우클릭을 한 후 요소검사를 클릭하면 됩니다. 요소검사에서는 브라우저가 해석한 코드를 볼 수 있습니다. html 코드에서 스크립트도 볼 수 있고 그 아래 리스트 박스의 데이터도 볼 수 있습니다.

list box 데이터

리스트 박스의 데이터를 보니 어떠한 패턴을 발견한 것 같습니다. 오른쪽 빨간박스의 1과 0의 데이터는 플래그의 2진수 데이터인 것 같고, 왼쪽 박스의 “aria-posinset”부분은 각각의 0이나 1이란 데이터의 위치를 나타내는 값 같아 보입니다.

이런 가정을 바탕으로 2진수 플래그 데이터를 추출해보는 작업을 해보겠습니다.


– 바이너리 데이터 추출 소스코드

#include <stdio.h>

int main(void)
{
	FILE *fp;
	fp = fopen("list.txt", "r");
	int index[2000] = {0};
	int pos=0, bin=0, max=0;

	if(fp == NULL) {
		printf("파일 오픈 실패 - 종료\n");
		return 1;
	}

	// fscanf() 함수는 성공적으로 변환하고 지정되는 필드의 수를 리턴합니다. 
	while(fscanf(fp, "<div role=\"option\" aria-posinset=\"%d\" aria-setsize=\"1040\">%d</div>", &pos, &bin) == 2)
	{	
		index[pos] = bin;

		if(max < pos) {
			max = pos;
		}

		// printf("%d %d ", pos, bin);
	}

	printf("Binary Data : ");
	for(int i=0; i<=max; i++){
		printf("%d", index[i]);
	}
	printf("\n");

	fclose(fp);

	return 0;
}	

html 소스코드의 <div id=”list” role=”listbox”> 영역의 데이터는

<div role="option" aria-posinset="525" aria-setsize="1040">1</div>

위와 같은 패턴의 문자열들로 이루어져 있습니다.

바이너리 데이터 추출 소스코드는 이와같은 패턴에서 “aria-posinset”의 정수부분과 0과 1 데이터만을 추출합니다.
해당 데이터를 추출하고 0,1데이터를 aria-posinset에 적혀있는 위치에 삽입합니다.
aria-posinset의 최대 값도 구합니다.

추출한 바이너리 데이터

0번째 인덱스부터 최대 값의 인덱스까지의 바이너리 데이터를 추출할 수 있습니다.
이제 이 데이터를 ascii값으로 변환시키면 됩니다.

ASCII로 변환된 바이너리

플래그를 찾았습니다 ㅎㅎ

flag{accessibility_is_crucial}

▲top