[xcz.kr]prob18

[xcz.kr]prob18


소스코드를 해석하여 빨강색 네모박스 부분에 Key 값을 뛰우는 문제다


View source 페이지를 클릭하여 서버측 소스를 보자



변수 값을 난독화(?) 해났다. 노트패드, 에디트플러스든 소스를 복사하여 "Ctrl+h(글자바꾸기)"로 난독화를 풀어주고 해석하면 다음과 같다.


1. 'c'(쿠키변수), 'g'(GET 변수)', 'p'(POST변수) 는 null 값이면 안되고, 서버에 GET 요청 시, g+c 값이 "givemepassword"이면 key 출력


2. 'c'(쿠키변수), 'g'(GET 변수)', 'p'(POST변수) 는 null 값이면 안되고, 서버에 POST 요청 시, p 값이 "keyplz!"이면 key 출력


조건대로 코딩을 짜주면 아래와 같다.




저작자 표시 비영리 변경 금지
신고

'Simple Story > Wargame' 카테고리의 다른 글

[xcz.kr]prob18  (0) 2014.03.14

비쥬얼 스튜디오로 C코드를 짜고 컴파일을 해서 올리로 보면 우리가 원했던 코드와 다르게 나온다.


이를 해결하기 위한 컴파일 방법이다




<출처:http://blog.naver.com/PostView.nhn?blogId=ifkiller&logNo=70098976909>



저작자 표시
신고

'Simple Story > etc' 카테고리의 다른 글

Visual Studio 리버싱 최적화 컴파일  (1) 2014.03.02



윈도우 리버싱 문제. (출제자가 문제 이미지와 문구까지도 신경을 썻음을 알 수 있는 문제이다!)


  "복제기술, 프로세스를 생성할 수 있는 제한?,  답은 어디에 있을까?"


실제 문제를 실행하면 자기 자신과 같은 프로세스를 수 없이 생성하고 죽어버린다. 



아규먼트를 넣고 돌려바도 현상은 똑같다... 문구로 보아 프로그램 생성 시 생성되는 프로세스들 중에 키가 숨어 있는 것인가?


현재로선 알 수 엄다. 확실한 건 많이 출제되었던 "입력 값 > 연산 > 답",  "조건 만족 > 답" 등과 같은 문제와는 다르다는 느낌을 받았다.


일단 어떤 프로그램인지 알기 위해 분석을 해보자.




해당 프로그램 C++ 로 작성되어 있으며, 패킹되어 있지 않다. 스트링 검색을 해바도 문제를 풀 단서가 될 만한 내용은 전혀 엄다.(ㅠ0ㅠ)


프로그램 메인 부분도 함수하나 호출하고 끝나는 심플한 프로그램이다,


단서를 잡기 위해, 유일하게 호출하는 함수를 분석해보자.



먼저 프로그램은 0X190번, 즉 400번에 걸쳐 자기 자신을 생성하고 죽는다는 것, 어떤 연산을 거쳐 값을 셋팅한다는 점.


그리고 빨간색 친 부분, 문제를 풀 단서하나를 알려주고 있다.


저 부분이 어떤 일을 하는지 올리를 통해 알아보자.



프로그램 실행 시 어떤 arg도 넣지 않았는데, 실제론 3개의 arg가 박혀서 실행되고 있었다.


그렇다면 저 arg는 갑자기 어디서 튀어나온 것인가? 


v1, v6, dword_409758 이 문제의 arg이며 해당 arg는 dword_40974C, dword_409754, dword_409758 값을 이용하여 셋팅된다. 


ida의 크로스레퍼런스 기능을 통해 역추적해보면 sub_401160 함수에서 이 데이타가 사용됨을 알 수 있다(sub_4012C0은 winMain함수)


또 하나의 단서가 되는 sub_401160 함수를 살펴보자



문제의 함수는 최종적으로 start 함수에서 호출하고 있다. start 함수는 main함수 이전에 호출되는 함수로 프로그램 시작시 실제로


main 함수부터 시작하는 것이 아닌, start 함수를 거치고 main 함수가 최종적으로 호출되어 프로그램이 실행된다(자세한 것은 구글링!)



문제의 함수의 수도코드(hex-ray기능, F5)를 보려고 하면 위와 같은 에러가 발생한다.


에러메세지를 해석해보면 40116F 부근에 SP 값이 이상하다고 한다.


40116F 부분을 보면 의미 없는 스택조작 연산이 있다.(출제자의 의도인지 궁금...)


구글링을 해보면 에러 발생 전 코드에서 ALT+K 로 스택값을 조절하라고 나온다. 


401169, 40116F 값을 위와 같이 고치고 F5키를 누르면 수도코드를 볼 수 있다.


문제의 함수 sub_401160 분석하면 다음과 같다.



메인 함수 실행전에 프로그램은 아규먼트가 몇개인지 검사를 하여 2가지 루틴으로 나눠지게 된다.


맨 처음 프로그램 실행 시, "0x0A8276BFA", "0x92F837ED", "1"값이 아규먼트 값으로 셋팅 되어 실행되며


이 아규먼트 값은 프로그램이 시작되고 400번동안 연산 로직에 의해 값이 바뀌며 실행된다.



아규먼트 값중 첫번째와, 두번쨰 값, 암호화되어 있는 값이 sub_401070 함수에 파라미터로 쓰이며, 


아래와 같은 로직에 의해 복호화 연산을 수행한다.



멀록 함수로 메모리를 할당 받아 해당 주소에 복호화된 문자열을 저장하고, 그 주소를 반환한다.


결국 400개에 프로세스 중 한 곳에 복호화된 key값이 있는 것이다.


문제는... 이 것을 어떻게 확인하냐?  방법은 두가지다.


1.아규먼트 값이 생성되는 로직 & 복호화 로직 코딩하여 확인.


2.코드 패치를 통한 확인 방법.


1번 보단 2번이 편해 보인다.


현재 해외 풀이 중에 복호화곳을 MessageBox()를 통해 확인 할 수 있도록 패치하는 방법이 있지만, 


이 방법 또한 언제 나올지 모르는 키 값을 눈으로 보며 클릭해야 하는 번거로움이 있다.


따라서 복호화된 값을 파일에 담아 확인하는 방법을 써보도록 하겠다.



먼저 복호화되어 키가 저장된 주소를 EAX 로 옮기고, 반화되기 전에, 키 값을 파일로 뿌려줄 로직이 있는 곳으로 가도록 코드를 삽입한다.(JMP 405439)

(0x405439 ~    영역은 프로그램에서 남는 영역)



간단하게 파일로 출력해주는 함수를 c 코딩 후, 해당 어셈을 참고하여 문제 프로그램에 맞게 삽입 시켰다.


삽입 시 주의 해야 할 부분이 "0x405467 ADD ESP, 1C" 부분이다.


해당 부분은 위처럼 코드를 삽입하게 되면 스택이 변경되어 리턴주소가 꼬이게 된다. 따라서 스택을 보고 원래 프로그램으로 


돌아 갈 수 있도록 삽입해야 하는 부분이다.



삽입한 코드가 문제가 없고, 의도한대로 리턴이 되어도 위에 코드 부분에서 익셉션이 발생한다.


해당 로직은 복호화된 주소를 초기화 하는 부분으로 nop 처리를 해주었다.


코드가 패치된 프로그램을 실행해보면 아래처럼 복호화된 키 값을 볼 수 있다.




.






저작자 표시
신고

'Simple Story > CTF' 카테고리의 다른 글

[2014 Codegate]Reversing 250 write up  (0) 2014.03.02
[2013 HUST]6번 문제  (0) 2013.12.04
[2013 HUST]5번 문제  (0) 2013.12.04
[2013 HUST]4번 문제  (7) 2013.11.29
[2013 HUST]3번 문제  (0) 2013.11.28
[2013 HUST]2번 문제  (0) 2013.11.28