코드엔진 level12

보안/리버싱 2017. 9. 6. 22:50



코드엔진 level12

: http://codeengn.com/challenges/basic/12




12번째 문제를 보게 된다면 key 값을 구한 뒤에 입력하게 된다면 성공 메시지를 볼 수 있다고 했다. 그래서


key 값을 먼저 찾아야할 것 같다.





처음에 시작된 12번째 문제의 프로그램이다. 이것을 올리 디버거를 통해서 디버거를 시작한다.






처음 시작을 하게 되면 이 코드로 시작을 하게 된다.






문제에서 key 값을 찾으면 어떤 문구가 출력이 된다고 명시를 했다. 그래서 그 문구가 무엇인지 찾으러 가보자.







마지막 하단에 보면 Congra~라고 시작되는 부분이 있다. 아마 이 부분이 key 값을 정상적으로 입력을 했을 경우에 뜨는


문자인 것 같다. 이 문자를 따라서 들어가면 아마 저 문구를 띄우기 위해서 조건문이 있을 것이니깐 저 문구를 클릭해서


따라가보자.






어셈블리어에서 cmp 값1, 값2는 값1과 값2의 서로의 값이 같으면 0이 나오면 jnz가 인식을 해서 다음 조건문으로


넘어가게 된다. CMP EAX, 7A2896BF이 EAX-&A2896BF가 0이 나와야 한다는 게 된다.





어셈블리어에서는 16진수를 많이 사용하니깐 16진수의 10진수의 수로 바꾸면 어떻게 될까?라고 공학용 계산기를


이용해서 위의 16진수의 수를 10진수로 바꿔보자. 그러면 2049480383의 10진수 값이 나온다.


이것을 프로그램에 직접 입력을 해보자.







그러면 축하 문자가 나온다!! 그러면 여기까지가 key값을 찾는 과정이고, 그 다음엔 이 문구를 출력하는 위치값을


알아내라고 했으니깐 HEXEDIT 프로그램을 이용해서 프로그램을 열어보자.







들어가 있는 축하메시지 문구는 지우고, 십진수의 값을 16진수로 일일이 입력을 하자. 그러면 들어간 부분의


값이 있다. 0D4B에서 0D45까지인 것을 볼 수 있다.


그러면 구한 key값과 HexEdit을 이용한 값을 더해서 넣으면 다음 화면으로 넘어갈 것이다.






'보안 > 리버싱' 카테고리의 다른 글

코드엔진 level14  (0) 2017.09.07
코드엔진 level13  (0) 2017.09.07
코드엔진 level11  (0) 2017.09.06
코드엔진 level9  (0) 2017.09.05
코드엔진 level8  (0) 2017.09.04

설정

트랙백

댓글

코드엔진 level11

보안/리버싱 2017. 9. 6. 19:02

 

코드엔진 level11

: http://www.codeengn.com/challenges/basic/11

 

 

 

 

level 9 문제에서 풀었던 OEP를 찾으시오 문제이다. 문제의 답은 정답인증은 OEP+ Stolenbyte
Ex ) 00401000FF35CA204000E84D000000

 

이런 형식이고 말이다.

 

 

 

 

프로그램을 시작하게 된다면 이런 문구의 메시지를 출력하는 메시지 창이 보인다.

 

 

 

 

 

 

 PEID 프로그램을 이용하면 프로그램이 언패킹이 되어있는지 아니면 패킹되어 있는 프로그램인지 확인할 수 있다.

 

 

 

 

 

 

 

프로그램의 윗쪽 부분을 보면 NOP 부분이 12byte나 있다. 그래서 패킹되기 전의 프로그램을 올리디버거로

 

열어보면 저 부분만큼만 찾으면 된다.

 

 

 

 

 

 

popad를 찾아서 그 밑에 있는 12byte 만큼 opcode를 입력하면 된다.

 

 

 

 

 

 

'보안 > 리버싱' 카테고리의 다른 글

코드엔진 level13  (0) 2017.09.07
코드엔진 level12  (0) 2017.09.06
코드엔진 level9  (0) 2017.09.05
코드엔진 level8  (0) 2017.09.04
코드엔진 level1  (0) 2017.09.04

설정

트랙백

댓글

코드엔진 level9

보안/리버싱 2017. 9. 5. 20:01


코드엔진 level9

: http://codeengn.com/challenges/basic/09





프로그램의 stolenByte를 구하라는 문제다.


stolenByte는 패커가 이동시킨 코드, 즉 EP의 코드 몇 개를 이동시킨 것이라고 생각하면 된다.


보호된 프로그램의 코드에서 윗부분을 이동시켰는데. 이부분의 명령어는 이동된 곳이나 할당


받은 메모리 공간에서 실행된다. 보호된 프로세스의 메모리가 덤프되었을 때 StolenByte를


복구하지 못한다면 덤프 된 실행파일은 작동하지 않는다.







처음 패킹되어 있는 상태로 프로그램을 실행하게 된다면 이런 문구를 출력을 하게 된다.


그리고 이 화면에서 확인 버튼을 누르면 다음 창이 뜬다.






하지만 언패킹을 하고 나서 프로그램을 실행시키면  다음 창이 뜬다.





이상한 문구를 뿌리면서 제대로 프로그램이 실행되지 않은 것을 확인할 수 있다.






패킹을 한 상태에서 프로그램을 올리 디버거로 실행을 하면 상단에 Nop의 문자가 뿌려지면서 messageBox 실행한다.




messagebox함수를 보면



int WINAPI MessageBox(HWND hWnd, LPCSTR lpszText, LPCSTR lpszCaption, UINT nType);


부분이다.


hWnd - 상위 윈도우의 핸들을 매개변수로 받는다.


lpszText - 출력할 메시지 문자열을 매개변수로 받는다.


lpszCaption - 메시지 박스의 타이틀에 나타날 문자열을 매개변수로 받는다.


nType - 메시지 박스의 동작방식, 아이콘 모양, 버튼의 종류를 지정한다.





위의 사진을 보면 messagebox 사용된 방법이 다르다. 위에 부분은 잘려있고, 밑에 부분은 함수의 인자가 설정이 되어


있는 것을 확인가능하다. 그래서 위에 messagebox의 인자가 중간에 잘렸다는 소리가 된다.




어셈블리어에서 nop자체는 \x09이라는 1바이트 값이므로 nop이 12번, 12바이트가 stolen 되었다는 것을


의미한다.






패킹된 어셈블리어 코드에서 프로그램이 실행이 되었던 주소인 0040100C의 시작인 PUSH 0이 언패킹된 코드에서 보면


그 어셈블리어 코드부터 시작해서 00407370부터 12byte를 찾으면 이 문제의 stolenByte가 된다.





'보안 > 리버싱' 카테고리의 다른 글

코드엔진 level13  (0) 2017.09.07
코드엔진 level12  (0) 2017.09.06
코드엔진 level11  (0) 2017.09.06
코드엔진 level8  (0) 2017.09.04
코드엔진 level1  (0) 2017.09.04

설정

트랙백

댓글

코드엔진 level8

보안/리버싱 2017. 9. 4. 21:48



코드엔진 level8

: http://codeengn.com/challenges/basic/08






위의 주소를 통해서 문제를 이동하게 된다면 이런 문제가 있다. OEP를 구하라는 문제인데, OEP가 무엇이냐면


Original Entry Point의 약자인데, 보통 프로그램의 소스코드가 다 공개되어 있는 게 아니라 패킹이라는 것을 통해서


중요한 소스코드를 감추고, 프로그램이 실행이 되게끔 만든다. 그래서 OEP는 프로그램의 시작지점이라고 보면된다.





그래서 일단 프로그램을 다운받아서 패킹이 된 것인지, 아니면 언패킹이 되어있는 지를 확인한다.


확인하는 프로그램은 PEid란 프로그램을 이용해서 확인할 수 있다.





그러면 UPX가 되어있는 것을 확인할 수 있다.


UPX는 언패킹되어 있어서 올리 디버거를 통해서 프로그램을 디버거 하게되면 PUSHAD와 POPAD로 한 세트로


묶여서 언패킹되어있는 것을 확인할 수 있다. 하지만 PEID로도 OEP를 확인할 수 있다.







이렇게 하면 OEP를 확인할 수 있고, 올리디버거로도 확인할 수 있다.






'보안 > 리버싱' 카테고리의 다른 글

코드엔진 level13  (0) 2017.09.07
코드엔진 level12  (0) 2017.09.06
코드엔진 level11  (0) 2017.09.06
코드엔진 level9  (0) 2017.09.05
코드엔진 level1  (0) 2017.09.04

설정

트랙백

댓글

코드엔진 level1

보안/리버싱 2017. 9. 4. 20:26



코드엔진 level1

: http://codeengn.com/challenges/basic/01







코드엔진을 가게 된다면 HDD를 CD-ROm으로 인식하기 위해서 사용된 GetDriveTypeA의 리턴값이


무엇이냐고 묻고 있다.






처음에 시작을 하게 된다면 이런 화면창이 나오고, 제대로 인식을 못하게 된다면





이런 화면이 나오게 된다.






ollydbg 프로그램을 이용해서 프로그램을 열게 된다면 이렇게 간단한 화면이 보인다. 보통의 프로그램같은 경우에는


이것보다 훨씬 더 복잡하고 긴 화면을 볼 수 있는 데, 거기에 비하면 많이 짧은 코드라고 볼 수 있다.


프로그램을 F8로 실행을 하게 된다면 우측 상단에 있는 EAX와 EBX 등의 값이 바뀌는 것을 볼 수 있다.





GetDriveTypeA 함수가 사용된 것을 볼 수가 있다. 함수를 사용하고 리턴값을 볼려고 하면 그 다음줄에 보면 INC ESI 가 있다.


이것은 ESI의 값을 1 증가시키는 어셈블리어 코드다.






EAX 값이 3으로 바뀐 것을 볼 수가 있다.






가운데에 보면 CMP EAX, ESI가 있는데 값을 서로 비교해서 두 값이 같으면 1, 다르면 0을 ZeroFlag에 대입을 하게 된다.



CMP [값1], [값2] : 값1과 값2를 비교하여 두 값이 같으면 1, 다르면 0이다.


그래서 두 값을 비교를 하는 우측창에 보면 EAX값은 1이고, ESI값은 3으로 나온다.


두 값이 다르므로 다음 실행창은 실패하는 부분으로 넘어가고, 프로그램이 메시지창을 띄우고 종료를 한다.







'보안 > 리버싱' 카테고리의 다른 글

코드엔진 level13  (0) 2017.09.07
코드엔진 level12  (0) 2017.09.06
코드엔진 level11  (0) 2017.09.06
코드엔진 level9  (0) 2017.09.05
코드엔진 level8  (0) 2017.09.04

설정

트랙백

댓글

어셈블리어 시작

기초/어셈블리어 2017. 8. 31. 18:53



어셈블리어란?



CPU가 이해할 수 있는 언어로 비트단위로 쓰여진 컴퓨터 언어가 기계어인데, 

이런 기계어를 인간이 이해하기 쉬운 언어와 1:1로 대응시켜 번역한 언어이다.



기계어 형식       ex)   10110000 01100001

어셈블리어 형식 ex)   mov  al, 061h




어셈블리어는 전자계산기에 대한 전문지식이 있어야 사용할 수 있으며,

기계마다 다르고, 호환성이 없다. 또 단순한 계산(덧셈, 뺄셈, 곱셈, 나눗셈)으로

처리되는 업무에 적합하며, 비트 연산이 가능하여 시스템 프로그램 작성에 적합하다.

2진수 0과 1의 조합으로 구성되어 있는 기계어와 비교하였을 때, 기호 코드를

사용하므로 프로그램 작성이 용이하고, 프로그램 내용을 이해하기 쉬우며, 

수정과 삭제ㆍ추가가 간편하다는 장점이 있다. 또한 번지부를 기호로 쓸 수 있기 때문에

번지를 잘못 지정할 가능성이 적다. [네이버 지식백과] 어셈블리어 (시사상식사전, 박문각)







'기초 > 어셈블리어' 카테고리의 다른 글

리눅스에 edb 설치하기!!  (0) 2018.02.22

설정

트랙백

댓글