Jaeseo's Information Security Story

DebugMe - Shadow CTF 2019 (수원대 CTF) 본문

Write UP/Shadow CTF 2019 (수원대 CTF)

DebugMe - Shadow CTF 2019 (수원대 CTF)

Jaeseokim 2019. 11. 23. 03:34

예전에 풀었던 Write Up 업로드 입니다.. 어설퍼도 이해 부탁드립니다.

일단 리버싱 문제이니 PE 분석을 간단하게 하고 시작합니다.

일단 C++로 짜여 졌다는 점과 아무런 Packing 조치가 되어 있지 않다는 점을 확인했습니다.

이제 IDA로 정적분석을 해봅니다.

간단하게 프로그램을 봤을 때 IsDebuggerPresent() 함수를 통해 리턴값이 0이라면 반복문을 돌고 그 다음부터는 v5하고 IsDebuggerPresent() 리턴값 XOR 연산을 통해 flag를 구하고 총 28번 반복을 한뒤 IsDebuggerPresent()값이 1이면 flag를 출력해주는 프로그램을 분석이 됩니다.

이제 이 문제를 푸는 방법이 직접 while문 도는 부분의 ZF를 수정해서 바꾸는 방법이 있지만 이러한 방법은 매우 불편한 방법 이기 때문에 어셈블리어를 수정하여 해결하였습니다.

X32DBG로 실행을 하여 while문을 도는 부분을 찾습니다.

찾은 결과 edi  IsDebuggerPresent() 함수의 주소를 넣고 call edi를 통해 호출 하는 것을 확인 할 수 있는데 이때 일단 첫번째 call edi를 하고 text eax,eax를 하는 모습을 볼 수가 있는데 이때 JF 1이면 반복문을 돌지 않고 빠져나가기 때문에 text eax,eax 하는 부분을 수정합니다.

And 연산을 통해 al 0 and 시킨다면 결과 값이 0이 나오기 때문에 ZF 0이되고 나머지부분을 그대로 둔 다음 종료가 되기전에 BreakPoint를 걸어 확인을 한다면 Flag값을 확인할 수 있어 보입니다.

이제 수정한 결과값을 가지고 반복문이 끝나는 지점에 BreakPoint를 걸고 관찰을 합니다.

결과 예상하던 대로 FLAG 값이 BASE64로 인코딩 되어 나온다는 것을 확인할 수가 있습니다.

이제 값을 Decoding 시키면 shadow{Baeg@pa..!!}  이 나오는 것을 확인할 수 있습니다.

 

Flag : SHADOW {Baeg@pa..!!}

 

참고포인트 :

IsDebuggerPresent() 함수가 하는 역할 참고.

'Write UP > Shadow CTF 2019 (수원대 CTF)' 카테고리의 다른 글

pwn2 - Shadow CTF 2019 (수원대 CTF)  (0) 2019.11.23
Comments