[제 14회 중고생 정보보호올림피아드 시스템1] 출제 후기 및 Write-up
제작년 12회에는 네트워크 문제팀과 DDoS탐지 및 방어를 했고,
작년 13회에는 운영팀에서 웹서버 및 전체운영, 시스템팀 소속에 있었으며,
이번 14회에는 시스템팀과 안드로이드팀 소속으로
문제를 출제하게 되었습니다.
예선은 9월 20일 토요일 온라인,
본선은 10월 25일 금요일 국회의사당에서
진행되었습니다.
그럼 예선 Q4 시스템1 풀이를 시작하겠습니다.
실행하자마자 입력을 12개나 받습니다.
또한 메모리가 오염되었나 봅니다.
이 말은 입력이 이상하거나 뭔가 꼬여서 변경해야 하거나
둘 중에 하나겠죠?
간단하게 정보보고 가실게요.
눈감고 봐도 64비트 ELF헤더입니다.
두근두근 열어볼까요?
①은 시작할 때 출력해주고
②와 같이 11보다 작거나 같을때까지 입력을 받네요.
13번째에 ④에 있는 Verify_Solution함수로 이동합니다.
와우!!
함수에 들어왔는데
반겨주는 프롤로그조차 보이질 않네요?
저 instruction이 1000개정도 보이는데
디컴파일해 봅시다.
디컴파일이 되지 않습니다.
프롤로그부분이 보이지 않으니
기계어로 확인해보기위해
[option] - [general]을 누르면
위와 같은 창이 뜨는데
Number of opcode bytes에 6을 적습니다.
이제 opcode가 보이는데...
가만보니 55
48 89 E5
이 부분은 프롤로그의 opcode 아닌가요?
역씌역씌!!
앞에 01이라는 한 바이트가 더 있을 뿐이지만
C언어는 역함수가 존재하지 않습니다.
읽는 방법에 따라 다양하게 해석이 될 수 있지요.
IDA의 경우는 휴리스틱을 이용해서 읽고
디컴파일의 경우 가끔은 이상하게 나오기도 하지요.
눈을 감고 보아도 이상한
이 부분을 수정해야겠습니다.
※ F2를 누르면 수정이 가능합니다.
프롤로그인 55 48 89 E5를 붙이고
남는 한 바이트를 nop처리 합니다.
우클릭을 누르거나 P를 눌러 이 부분을 함수로 설정해 줍니다.
함수의 마지막은 0x1288입니다.
우클릭을 누르거나 Alt+P를 누릅니다.
이유는 모르겠지만 0x1289로 되어있는 주소를
0x1288로 수정합니다.
그리고 디컴파일을 해보겠습니다.
와우... 방정식의 해를 찾으라네요.
즉, 프로그램 실행 시 입력받은 입력값은 전부
방정식의 해와 관련되어 있습니다.
그리고 "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를 이용하겠습니다.
68, 58, 90, 93, 100, 38, 68, 69, 108, 95, 100, 43
을 입력했을 때 flag가 나오네요.
flag : N0PWn_N0fUn!
'Participation' 카테고리의 다른 글
[WISET] 2019 공학연구제팀 심화과정 결과발표 (0) | 2019.10.26 |
---|---|
[제 14회 중고생 정보보호 올림피아드 안드로이드] 출제후기 및 Write up (2) | 2019.10.26 |
팀프로젝트 간 갈등 (0) | 2019.09.13 |
[산업체탐방] 한국과학기술연구원 후기 (0) | 2019.08.14 |
케이쉴드주니어 3기 입교식 (0) | 2019.08.14 |
댓글