□ description
==========================================
Limited processes will be generated.
Which one has the flag?
http://58.229.183.26/files/clone_technique.exe_b9b0870fb1b877cecf5ea2ae615e12eb
==========================================
□ number of solvers : 71
□ breakthrough by
1 : More Smoked Leet Chicken (02/23 02:29)
2 : sonic (02/23 02:30)
3 : spamandhexlite (02/23 02:47)
Process Explorer로 확인해본결과 프로세스가 마구마구 생성된다. 근데 흰트에, 제한된 프로세스안에서 어떤 한 부분이 플래그를 갖고 있다하여서, 이부분에 초점을 맞추고 분석을 시작했다.
그러다가 디컴파일하면서 함수들을 내려가는 도중에,
40116F부분에서 (정확히 말하면 401169 부분과 40116F부분에서) 인위적으로 ESP를 더하고 뺌으로써,디컴파일이 되지 않는 부분이 존재했다. NOP 로 해당부분을 패치해주고 다시 디컴파일을 한 결과,
아래처럼 디컴파일이 되었고, 인위적으로 이 함수만 디컴파일이 되지않게 해논 부분이어서, 이부분에 무언가 있을것 같아 집중적으로 분석을 시작했고,
memset((void *)sub_401070(&unk_407030, Buffer, v7), 0, 0x1Cu); 이부분을 찾아냈다.
memset((void *)sub_401070(&unk_407030, Buffer, v7), 0, 0x1Cu);
407030부분에서 1C(decimal:28byte) byte는 ollydbg에서 이부분에 하드웨어 브레이크를 걸고 확인을 하였고,(아래에 첨부한 그림에서 하이라이트한 부분)
IDA에서 401070함수 부분을 디컴파일하여, 복호화 루틴을 알아내었다
복호화 루틴을 알아내서..코드로 짜서 flag값을 알아내려했는데
좀더 분석해보니 다른 부분에서도 필요한 부분을 가져오고 해야해서
messagebox()를 call 하여 flag 를 뱉어내게 하는방식으로 문제를 접근하기로 하였다.
(복호화 코드를 짜서 풀은 사람도 많던데 검색해보면 한국인들이 writeup을써논것들 대부분이 그런식이여서 쉽게 찾아볼 수있다)
그래서 401070 주소부분(어차피 이부분이 복호화 부분이니까)에서 맨밑으로 내리다보면 에필로그가 존재하는데,
이에필로그아래부터 적당한 크기의 int 3이 존재하여,
(원래는 다른 적당한공간을 패치시켜서 점프시키려하였으나 에필로그 아래의 int 3 공간크기와 딱맞았다)
이부분을 parameter와 messagebox()로 patch 시켜주었다.
패치한 방법은 아래와 같다. 어셈블 설명하는 포스팅도 아니고 하니 따로 설명은 하지 않겠다.
이부분을 패치해주면 각 프로세스마다 복호화를 진행하면서 각 프로세스마다의 값이 messagebox로 출력되게 된다.(패치해준뒤 새로운 .exe파일로 생성해주고 프로그램을 실행해주었다(디버거에서 실행한거아님))
그래서 겁나 엔터를 눌러주다보면..
의미있는 값을 가지는게 하나 나오는데 이것이 당시 대회때의 flag이다.
아래의 파일은 내가 패치시켜 놓은 파일이다. 나중에 내가쓸거같아서 첨부해놈 ..
'과거의 컴퓨터 공부 > CodeGate2014' 카테고리의 다른 글
(codegate 2014) 4stone(pwnable,300pt) (0) | 2015.05.01 |
---|---|
(Codegate2014)dodoCrackme(200pt,Reversing) (0) | 2015.03.28 |
(CodeGate2014)Angry_doraemon(250P,pwnable) (0) | 2015.03.25 |