BLOG main image
분류 전체보기 (222)
Reversing (13)
Pwnable (4)
Linux Kernel (3)
Crypto (2)
Wargames (66)
Programming (18)
Write Up (32)
Project (22)
Web (2)
My Life (52)
Memo (3)
etc (2)
발표자료 (1)
36,063 Visitors up to today!
Today 12 hit, Yesterday 30 hit
daisy rss
tistory 티스토리 가입하기!
2017.04.10 20:39


It was written in Korean


문제들 중에 배점이 두 번째로 낮았는데 푼 사람이 제일 적고 가장 어려웠던 문제입니다ㅠㅠ

파일을 받아보면 일반적인 PE나 ELF같은 포맷이 아닌 

이렇게 알수 없는 형태로 파일이 구성되어 있습니다. 맨 첫줄을 구글에 검색해보니

.hex라는 확장자를 가진 파일이며 아두이노 같은 avr 환경에서 쓰이는 바이너리임을 알았습니다. 다시 검색해보니 

Intel HEX라는 포맷이었습니다. 다시 검색을 통해 objcopy를 이용해서 hex파일을 elf파일로 변환할 수 있다는 것을 알았습니다. (objcopy가 elf32-avr 타겟을 지원해야 합니다.)

"objcopy -I ihex Flour_d550ed0eb751b1da2b2bdfeeb1fe60ae213e77e8.hex -O elf32-avr Flour_d550ed0eb751b1da2b2bdfeeb1fe60ae213e77e8.elf"

이렇게 명령어를 치면 elf파일이 생성되지만 프로세서를 모르기 때문에 이상하게 IDA에서는 디스어셈블링이 되지 않았습니다ㅠㅠ 그래서 objdump를 이용해서 어셈블리를 txt로 뽑아서 소스를 오디팅해 보았습니다. (역시 objdump가 elf32-avr 타겟을 지원해야 합니다.ㅠㅠ)

"objdump -D Flour_d550ed0eb751b1da2b2bdfeeb1fe60ae213e77e8.elf > disassem.txt"

그러면 소스를 추출할 수 있고 소스를 오디팅 하다보면 이런 부분을 찾을 수 있습니다. (###########으로 주석 처리한 부분을 봐주세요.)

r18 = table1[i] ^ table2[i] ^ 0xf3
r19 = input[i]
if (r18 != r19) 
    break;

대충 해석을 해 보면 이럴꺼 같은 느낌이 옵니다. 이 부분이 플래그를 연산해서 비교하는 부분이라 생각했습니다. 여기부터는 어떤 테이블을 쓰는지 정적 분석으로는 한계가 있으므로 avr studio를 이용해서 동적분석 해 보겠습니다. (데이터 영역에서 테이블을 추출할 수도 있지만 대회 당시에는 그럴 생각이 나지 않았습니다.ㅋㅋ)


 avr studio로 elf 파일을 열고 디바이스는 ATMEGA128로 맞춰주고 열어서 디버깅 해보겠습니다.(디바이스는 가장 보편적으로 쓰이는 ATMEGA128로 사용한 것이며, hapsim을 이용해서 바이너리와 입출력 통신을 하려 했으나 안되서 값 입출력은 할 수 없었습니다ㅠㅠ)

열심히 어셈 따라가면서 디버깅 하다 보면 입력을 받는 부분에서 무한 루프가 걸립니다.

값을 입력해주지 않으면 현재 pc가 가리키고 있는 BRNE 명령어가 항상 참이 되어 루프를 탈출 할 수 없습니다. 값을 입력했다 가정하고 pc를 수정해서 좀 더 진행하다 보면

아까 소스를 오디팅 할 때 봤던 소스와 같은 소스가 들어있습니다. 이제 r19레지스터와 r18레지스터에 값을 어떤 테이블에서 가져오는지만 확인하면 됩니다.

먼저 r19에 사용되는 테이블은 데이터 영역의 0x139 주소에 있으며 확인해보면 

이렇게 값이 있습니다. 0x2f만큼 가져오면 C8 CA 9D 4B E3 6B 22 D3 2A 1A 98 BF 5D BB 14 06 08 C0 18 3A 4D 0E 84 CA 12 D8 CA CA BC B8 B8 29 2E 33 2B D9 66 C6 A3 A5 6A EE 0E BE 26 62 8E 이만큼이 첫 번째 테이블 값임을 알 수 있습니다. 

다음으로 r18에 사용되는 테이블인 0x107 주소부터 0x2f 바이트 만큼을 가져오면 

7A 6A 27 EB 6B FD B0 53 80 B6 1F 0D DD 23 B8 97 82 6C 8E A4 DC CE 13 5D 84 4F 66 5D 7C 3D 22 B9 B8 B3 87 43 E6 6A 32 66 EB 74 93 2A EF B8 00 이만큼이 사용됩니다.

이제 이를 이용해서 연산을 하면 

플래그가 나옵니다.

flag : ASIS{easY_tAsk_by_emb3dded_d3vices_is_b0ring:)}

'Write Up' 카테고리의 다른 글

YISF 2017 예선 Write-Up  (2) 2017.08.11
ASIS CTF Quals 2017 Reversing Flour  (2) 2017.04.10
YISF 2016 본선 리버싱 문제 풀이  (5) 2016.12.01
2016 Whitehat Contest 예선 Write-Up  (3) 2016.10.13
2016 Layer7 CTF Write-UP  (4) 2016.09.07
YISF 2016 예선 Write-Up  (2) 2016.08.19
kirasys | 2017.04.17 02:46 신고 | PERMALINK | EDIT/DEL | REPLY
잘보고갑니다~
| 2017.04.21 08:59 신고 | PERMALINK | EDIT/DEL | REPLY
잘보고 가요! 태양님 블로그는 공부하는데 좋은 자극이 되는 것 같아요~ 항상 좋은 글 올려주셔서 감사합니다:)
Name
Password
Homepage
Secret