Participation

[제 14회 중고생 정보보호올림피아드 시스템1] 출제 후기 및 Write-up

D4tai1 2019. 10. 25.

제작년 12회에는 네트워크 문제팀과 DDoS탐지 및 방어를 했고,

작년 13회에는 운영팀에서 웹서버 및 전체운영, 시스템팀 소속에 있었으며,

이번 14회에는 시스템팀과 안드로이드팀 소속으로 

문제를 출제하게 되었습니다.

 

예선은 9월 20일 토요일 온라인,

본선은 10월 25일 금요일 국회의사당에서 

진행되었습니다.

 

[그림1] 국회의사당 정문

 

[그림2] 대회현장

 

[그림3] 저녁에 바라본 국회의사당

 

 

그럼 예선 Q4 시스템1 풀이를 시작하겠습니다.

[그림1] Q4 실행화면

실행하자마자 입력을 12개나 받습니다.

또한 메모리가 오염되었나 봅니다.

 

이 말은 입력이 이상하거나 뭔가 꼬여서 변경해야 하거나

둘 중에 하나겠죠?

 

간단하게 정보보고 가실게요.

[그림2] 정적분석

눈감고 봐도 64비트 ELF헤더입니다.

두근두근 열어볼까요?

 

[그림3] Q4 시작부분

①은 시작할 때 출력해주고

②와 같이 11보다 작거나 같을때까지 입력을 받네요.

13번째에 ④에 있는 Verify_Solution함수로 이동합니다.

 

[그림4] Verify_Solution 함수

와우!!

함수에 들어왔는데

반겨주는 프롤로그조차 보이질 않네요?

저 instruction이 1000개정도 보이는데

디컴파일해 봅시다.

 

[그림5] 디컴파일 실패

디컴파일이 되지 않습니다.

 

[그림6] opcode 확인을 위한 설정

프롤로그부분이 보이지 않으니

기계어로 확인해보기위해

[option] - [general]을 누르면

위와 같은 창이 뜨는데

Number of opcode bytes에 6을 적습니다.

 

[그림7] opcode 확인

이제 opcode가 보이는데...

가만보니 55

48 89 E5

이 부분은 프롤로그의 opcode 아닌가요?

 

[그림8] opcode를 disassembly

역씌역씌!!

 

앞에 01이라는 한 바이트가 더 있을 뿐이지만

C언어는 역함수가 존재하지 않습니다.

읽는 방법에 따라 다양하게 해석이 될 수 있지요.

IDA의 경우는 휴리스틱을 이용해서 읽고

디컴파일의 경우 가끔은 이상하게 나오기도 하지요.

 

[그림9] opcode 확인

눈을 감고 보아도 이상한

이 부분을 수정해야겠습니다.

※ F2를 누르면 수정이 가능합니다.

 

[그림10] opcode 수정

프롤로그인 55 48 89 E5를 붙이고

남는 한 바이트를 nop처리 합니다.

 

[그림11] 함수로 설정

우클릭을 누르거나 P를 눌러 이 부분을 함수로 설정해 줍니다.

 

[그림12] 함수의 범위

함수의 마지막은 0x1288입니다.

 

[그림13] 함수정보 수정

우클릭을 누르거나 Alt+P를 누릅니다.

 

[그림14] 함수 주소 수정

이유는 모르겠지만 0x1289로 되어있는 주소를

0x1288로 수정합니다.

그리고 디컴파일을 해보겠습니다.

 

[그림15] Verify_Solution 함수 디컴파일

와우... 방정식의 해를 찾으라네요.

 

[그림16] flag 부분

즉, 프로그램 실행 시 입력받은 입력값은 전부

방정식의 해와 관련되어 있습니다.

그리고 "Do not be modest!!"??

겸손해 하지 말랍니다.

 

import angr

proj = angr.Project('Q4', load_options={'auto_load_libs':False})

state = proj.factory.entry_state()
simgr = proj.factory.simulation_manager(state)

simgr.run()

print(simgr)

for i in simgr.deadended:
	print(i.posix.dumps(0), i.posix.dumps(1))

저는 이런 12차방정식을 풀 자신이 없기 때문에?

angr에 있는 Z3 solver를 이용하겠습니다.

 

[그림17] angr 사용

68, 58, 90, 93, 100, 38, 68, 69, 108, 95, 100, 43

을 입력했을 때 flag가 나오네요.

flag : N0PWn_N0fUn!

 

댓글