'Deadlock'에 해당되는 글 2건

  1. 2010.03.28 [Padocon 2010 ] Crakme 200 ExcuteMe 풀이
  2. 2010.01.02 [펌]교착 상태와 그 조건

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

2010.01.02 14:15 System


1) What is Deadlock?
교착 상태(膠着狀態, deadlock)란 두 개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있기 때문에 결과적으로 아무것도 완료되지 못하는 상태를 가리킨다. 예를 들어 하나의 사다리가 있고, 두 명의 사람이 각각 사다리의 위쪽과 아래쪽에 있다고 가정한다. 이때 아래에 있는 사람은 위로 올라 가려고 하고, 위에 있는 사람은 아래로 내려오려고 한다면, 두 사람은 서로 상대방이 사다리에서 비켜줄 때까지 하염없이 기다리고 있을 것이고 결과적으로 아무도 사다리를 내려오거나 올라가지 못하게 되듯이, 전산학에서 교착 상태란 다중 프로그래밍 환경에서 흔히 발생할 수 있는 문제이다. 이 문제를 해결하는 일반적인 방법은 아직 없는 상태이다.

출처:위키백과


2) Condition of Deadlock

4가지 조건을 모두 만족할시 교착상태가 발생한다.
순환대기는 점유대기 조건과 비선점 조건을 만족해야 성립하므로
완전히 독립적인 것은 아니다.


상호배제(Mutual exclusion) : 프로세스들이 필요로 하는 자원에 대해 배타적인 통제권을 요구한다.

상호 배제(mutual exclusion, Mutex, 뮤텍스)는 동시 프로그래밍에서 공유 불가능한 자원의 동시 사용을 피하기 위해 사용되는 알고리즘으로, 임계 구역(critical section)으로 불리는 코드 영역에 의해 구현된다.

공유 불가능한 자원의 예로는 동시에 실행되고 있는 프로그램간의 통신에 사용되는 비트 단위의 깃발, 계수기, 등이다. 문제는 스레드가 언제라도 정지되거나 시작될 수 있다는 것이다.

예) 프로그램의 일부분이 여러 단계를 거치면서 데이터를 읽고 쓰고 있다고 하자. 그런데 예상치 못한 사건 등에 의해 다른 스레드가 동작하기 시작했다. 첫 번째의 스레드가 쓰고 있는 영역에서, 이 두 번째의 스레드가 또 다른 작업을 시작한다면, 해당 영역의 값은 부적절하며 예상할 수 없는 상태에 놓이게 된다. 게다가 두 번째의 스레드가 값을 덮어 써버리기라도 한다면, 복구 불가능한 상태로 되고 만다. 그러므로 공유 데이터를 접근하는 프로그램 내부의 이른바 임계 구역이라는 부분은 홀로 수행되도록 보호되어야 하며, 다른 스레드가 동일한 부분의 프로그램을 수행해서 동일한 공유 데이터를 접근하는 것을 막아야 한다.

단일 프로세서 시스템에서, 상호 배제를 구현하는 가장 단순한 방법은 인터럽트를 억제해서 공유 데이터가 손상되는 것을 막는 것이다. 성능에 최소한의 영향을 주기 위해 인터럽트가 발생하지 않을 명령어 집합의 수는 가능한 최소로 유지시키는 것이 좋다.


점유대기(Hold and wait) : 프로세스가 할당된 자원을 가진 상태에서 다른 자원을 기다린다.

비선점(No preemption) : 프로세스가 어떤 자원의 사용을 끝낼 때까지 그 자원을 뺐을 수 없다.

순환대기(Circular wait) : 각 프로세스는 순환적으로 다음 프로세스가 요구하는 자원을 가지고 있다.


'System' 카테고리의 다른 글

셸 코드 작성  (0) 2010.01.17
2008 JFF 8번 문제 풀이  (0) 2010.01.10
[펌]교착 상태와 그 조건  (0) 2010.01.02
What is CALLBACK function?  (0) 2010.01.01
[펌]함수 호출규약 [Calling Convention]  (0) 2010.01.01
Format String Bug  (0) 2009.12.22
Posted by LinkC
이전버튼 1 이전버튼

블로그 이미지
LinkC

태그목록

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

공지사항

Yesterday35
Today4
Total331,024

달력

 « |  » 2019.8
        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

최근에 받은 트랙백

글 보관함


. .