2010.03.28 19:45 WarGame


지난번에 이어서 crackme 풀이에 들어갑니다

실행해 보면 아무것도 뜨지 않습니다

트레이에도 남지 않는군요

프로세스를 확인해보면

멀쩡히 있는 것을 확인해 볼 수 있습니다



말그대로 이걸 실행 시켜야 하는데

Resource를 로드 하는 부분이 있어서

Resource Hacker로 들여다보니

다음과 같은 Dialog가 있었습니다




음 역시 패스 워드는 쉽게 드러나진 않는군요

프로그램 내부에서 연산 되서

저 Password 에 출력되는게 틀림없어 보입니다

Tracing 하면서 어디서 막히나 찾아보면

다음과 같은 루틴을 찾아낼 수 있습니다




멀티 스레드를 이용했군요

모든 스레드가 정상적으로 종료될때까지 무한정 대기 합니다

Timeout 을 0으로 바꿔줘서 우회하게 되면..



저번 문제와 비슷합니다

또 저 패스워드 부분을 연산하는 루틴이 따로 존재하고

올바른 값이 주어져야 저

패스워드가 올바르게 보이겠죠

저번 문제와 다르게 우리가 일반적으로 프로그램 상에서

입력해 줄 수 있는 부분은 없습니다

그렇다면 남은건 스레드 부분이라고 생각해서

스레드 실행 부분을 지정하는 함수 부분을 살펴보았습니다



LeaveCriticalSection 이 보이는군요

임계 영역을 해제하는 함수입니다

EnterCriticalSection 도 앞서 실행되겠죠

아무래도 한 스레드에서 Enter 한 Critical 영역을

다른 스레드가 참조해서 무한 대기 상태로 빠지지 않나 생각했습니다



일단 쭉 훑어보면

모든 스레드는 402020 함수를 각기 다른 인자로 호출하는데

LeaveCriticalSection 함수 인자로 미뤄보아 아무래도

402020 인자로 들어가는 ECX는 임계 영역의 주소를 나타내는거 같군요

각기 다른 영역을 Critical 영역으로 잡는데

무한 대기 상태에 빠지는걸 보면

다음 함수가 해결의 키 함수가 되겠네요

함수 내용입니다



Sleep  뒤에 익숙한 인자로 402020 함수를 호출합니다

저 인자들은 각각 2,3번째 스레드의 Critical 영역의 주소인걸 기억하시나요?

일단 전체적인 구조를 C로 나타내보면



Leave 를 호출해주지만..

이 스레드가 모두 실행 되고 다른 스레드가 실행 되길 바라는건 좀 억지가 있죠

Sleep의 시간을 0으로 줘도 다른 스레드로 넘어가 버리구요

그럼 Sleep 함수가 실행되지 않도록 NOP으로 채워줍시다



혹은 402020 의 EnterCriticalSection 부분을 무력화시켜도 될 것 같네요

아무튼 이런 식으로 각 스레드가 제대로 실행 되도록 하면

DeadLock 에 걸리지 않고 끝나게 됩니다





Posted by LinkC

블로그 이미지
LinkC

태그목록

Tistory Cumulus Flash tag cloud by BLUEnLIVE requires Flash Player 9 or better.

공지사항

Yesterday48
Today25
Total328,667

달력

 « |  » 2019.5
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  

최근에 받은 트랙백

글 보관함


. .