no image
CodeEngn Basic 06
문제확인 UPX패킹이므로 언패킹을 해야한다. 본인이 사용하는 방법은 3가지이다.1. OEP를 찾아서 그 부분부터 분석을 하는것2. OEP를 찾아서 OllyDump를 통행 덤프를 뜬 후 LoadPE를 통하여 Rebuild를 한 후에 분석3. UPX.exe를 통하여 언패킹을 한 후에 분석을 한다.여기서 나는 3번의 방법을 통하여 분석을 실시하였다. >> $ upx -d 06.exe 풀이아래의 JMP가 가르키는 곳이 OEP지점이다. 이 지점으로 점프를 하여 분석을 하면 된다. 아래와 같이 성공부분의 분기점이 나뉘어진 곳을 찾을 수가 있다. 이 부분에서 ASCII AD46DFS547 이라는 키 값을 찾을 수가 있다. 따라서 OEP+Key 이므로 00401360AD46DFS547이 이번 문제의 정답이다.
2015.06.01
no image
CodeEngn Basic 05
문제확인 프로그램을 실행하면 다음과 같다. 이와 같이 아이디와 시리얼 값을 찾는 것이 문제이다. 디버깅에 앞서 PEID를 통하여 분석을 해보면 UPX로 패킹이 되어 있는 것을 확인 할 수가 있다. 풀이방법은 두가지이다. POPAD 다음의 점프 부분이 본래의 코드 부분으로 점프를 한 후에 분석을 진행 할 수가 있다. 하지만 이는 지속적으로 분석하기에 번거로움이 있다. 따라서 우리는 upx를 통하여 unpacking을 진행 한 후에 프로그램을 분석 할 것이다. 분석을 하다보면 문자열을 검색하여 성공 구문을 찾은 후에 분석을 하면 되는데 총 두번의 문자열비교가 일어난다. 아이디와 시리얼 값이 각 각 따로 비교가 진행이 되며 진행 되는 방법은 다음과 같이 EAX에는 우리가 입력한 값과 EDX에는 비교에 사용될 ..
2015.05.31
no image
CodeEngn Basic 04
문제확인 풀이프로그램을 천천히 분석하다 보면 디버깅이 걸리는 시점을 찾을 수가 있다. 바로 아래의 IsDebuggerPresent 지점이다. 이 부분에 의하여 디버깅이 걸리는 것이다. 따라서 안티디버깅을 피하기 위해서는 IsDebuggerPresent를 NOP로 채우는 것도 하나의 방법이다. NOP로 채움으로 인하여 디버깅일 정상적으로 실행 되는 것을 확인 할 수가 있다. 또는 MOV EAX,0을 통하여 무력화 할 수도 있다.
2015.05.31
no image
CodeEngn Basic 03
문제 확인 문제를 실행 할 경우 아래와 같이 동작하는 것을 확인 할 수가 있다. 풀이 123을 키 값으로 넣었을 경우 아래와 같이 비교 문자열이 존재하는 것을 확인 할 수가 있다. 따라서 문자열 비교 함수는 vbaStrCmp이며 키 값은 2G83G35Hs2 인 것을 확인 할 수가 있다.
2015.05.31
no image
CodeEngn Basic 02
문제확인아래와 같이 패스워드를 확인하는 문제이다. 하지만 실행파일이 손상되어 실행이 되지 않는다. 실행을 하여보자. 실행을 할 경우 windows8.1에서는 아래와 같이 뜨는 것을 확인 할 수가 있다. 따라서 우리는 다른 방법으로 이 프로그램을 분석하여야 한다. 참고로 손상이 되었기에 디버깅도 가능 하지 않다. 따라서 우리는 HexEditor를 통하여 프로그램을 분석하여 보자. 풀이아래와 같이 문자열이 기록되는 부분으로 추측 되는곳에 패스워드로 추측이 되는 문자열을 확인 할 수가 있다. 이처럼 우리는 패스워드를 쉽게 찾을 수가 있다.
2015.05.31
no image
CodnEngn Basic 01
문제확인문제는 아래와 같이 GetDriveTypeA가 CD-ROM으로 인식 되기 위해서는 어떤 리턴값이 와야 하는지에 대한 문제를 구하는 방법이다. 아래와 같이 BP를 걸고 실행시 EAX에 3이 반환 되는 것을 확인 할 수가 있다. 이는 DRIVE_FIXED가 반환 되는 것으로 MSDN을 통하여 확인을 할 수가 있다. 또한 여기서 우리는 DRIVE_CDROM이 Return Value 5에 있는 것을 확인 할 수가 있으며, 이를 통하여 우리는 문제를 풀 수가 있었다. 풀이 하지만 여기서 CMP EAX,ESI를 통하여 분기점이 나뉘어지는데 여기서 문제가 이상한 것인지 EAX에 5를 넣어도 CMP EAX(3), ESI(4010003)이 비교가 되어서 결국 실패하는 부분으로 가게 된다. 따라서 우리는 성공 문자..
2015.05.31
FTZ Level20 //FSB
문제확인Hint를 확인할 경우 아래와 같이 간단한 소스를 확인 할 수가 있다. 하지만 여기서 보아야 할것은 bleh[80]인데 fgets로는 79byte 까지만 입력을 받는 것을 볼 수 있으며 이를 통하여 BOF는 할 수 없다는 것을 알 수가 있다. 그렇다면 다른 부분을 보아야 하는데 바로 printf(bleh)이다. 여기에는 포멧 스트링이 존재 하지 않기 때문에 이를 통하여 공격을 할 수가 있다. gdb로 확인을 할려 했으나 확인이 되지 않기에 직접 hint의 소스를 통하여 같은 프로그램을 컴파일 하였다. 역시 BOF는 불가능 한것을 확인 할 수가 있다. 우선 문제를 직접 실행하여보자. AAAA %8x %8x %8x %8x를 할 경우에 AAAA가 저장된 곳이 출력이 되는 것을 확인 할 수가 있다. 따라..
2015.05.31
no image
Socket_server.py
사진출처 : http://jinpyolab.tistory.com/1
2015.05.28

CodeEngn Basic 06

Kail-KM
|2015. 6. 1. 00:07

문제확인




UPX패킹이므로 언패킹을 해야한다. 본인이 사용하는 방법은 3가지이다.

1. OEP를 찾아서 그 부분부터 분석을 하는것

2. OEP를 찾아서 OllyDump를 통행 덤프를 뜬 후 LoadPE를 통하여 Rebuild를 한 후에 분석

3. UPX.exe를 통하여 언패킹을 한 후에 분석을 한다.

여기서 나는 3번의 방법을 통하여 분석을 실시하였다.      >>    $ upx -d 06.exe



풀이


아래의 JMP가 가르키는 곳이 OEP지점이다. 이 지점으로 점프를 하여 분석을 하면 된다.


아래와 같이 성공부분의 분기점이 나뉘어진 곳을 찾을 수가 있다. 이 부분에서 ASCII AD46DFS547 이라는 키 값을 찾을 수가 있다. 따라서 OEP+Key 이므로 00401360AD46DFS547이 이번 문제의 정답이다. 



'Reversing > CodeEngn' 카테고리의 다른 글

CodeEngn Basic 08  (0) 2015.06.01
CodeEngn Basic 07  (0) 2015.06.01
CodeEngn Basic 05  (0) 2015.05.31
CodeEngn Basic 04  (0) 2015.05.31
CodeEngn Basic 03  (0) 2015.05.31

CodeEngn Basic 05

Kail-KM
|2015. 5. 31. 23:08

문제확인




프로그램을 실행하면 다음과 같다. 이와 같이 아이디와 시리얼 값을 찾는 것이 문제이다.


디버깅에 앞서 PEID를 통하여 분석을 해보면 UPX로 패킹이 되어 있는 것을 확인 할 수가 있다.



풀이


방법은 두가지이다. POPAD 다음의 점프 부분이 본래의 코드 부분으로 점프를 한 후에 분석을 진행 할 수가 있다. 하지만 이는 지속적으로 분석하기에 번거로움이 있다.


따라서 우리는 upx를 통하여 unpacking을 진행 한 후에 프로그램을 분석 할 것이다.


분석을 하다보면 문자열을 검색하여 성공 구문을 찾은 후에 분석을 하면 되는데 총 두번의 문자열비교가 일어난다. 아이디와 시리얼 값이 각 각 따로 비교가 진행이 되며 진행 되는 방법은 다음과 같이 EAX에는 우리가 입력한 값과 EDX에는 비교에 사용될 원래의 값이 존재한다. 이를 통하여 우리는 시리얼 값을 찾을 수가 있다.


이에 따라 입력을 한후에 실행을 할 경우 성공 구문이 나타나는 것을 확인 할 수가 있다.


추가


OEP지점으로 이동하여 OllyDump를 통하여 직접 덤프를 뜰 수가 있다. 해당 플러그인을 통하여 OEP지점에서 DUMP를 클릭한 후에 rebuild를 해제 한 후에 완료를 클릭한 후에 LoadPE를 통하여 프로그램을 다시 재설정 해주면 upx패킹을 언패킹 할 수가 있다.


LordPE Deluxe.zip


OllyDump.dll


'Reversing > CodeEngn' 카테고리의 다른 글

CodeEngn Basic 07  (0) 2015.06.01
CodeEngn Basic 06  (0) 2015.06.01
CodeEngn Basic 04  (0) 2015.05.31
CodeEngn Basic 03  (0) 2015.05.31
CodeEngn Basic 02  (0) 2015.05.31

CodeEngn Basic 04

Kail-KM
|2015. 5. 31. 22:31

문제확인




<일반적인 방법으로 프로그램을 실행할 경우>


<디버깅을 통하여 프로그램을 실행할 경우>




풀이


프로그램을 천천히 분석하다 보면 디버깅이 걸리는 시점을 찾을 수가 있다. 바로 아래의 IsDebuggerPresent 지점이다. 이 부분에 의하여 디버깅이 걸리는 것이다.


따라서 안티디버깅을 피하기 위해서는 IsDebuggerPresent를 NOP로 채우는 것도 하나의 방법이다. NOP로 채움으로 인하여 디버깅일 정상적으로 실행 되는 것을 확인 할 수가 있다. 또는 MOV EAX,0을 통하여 무력화 할 수도 있다.


'Reversing > CodeEngn' 카테고리의 다른 글

CodeEngn Basic 06  (0) 2015.06.01
CodeEngn Basic 05  (0) 2015.05.31
CodeEngn Basic 03  (0) 2015.05.31
CodeEngn Basic 02  (0) 2015.05.31
CodnEngn Basic 01  (0) 2015.05.31

CodeEngn Basic 03

Kail-KM
|2015. 5. 31. 22:19

문제 확인




문제를 실행 할 경우 아래와 같이 동작하는 것을 확인 할 수가 있다.



풀이



123을 키 값으로 넣었을 경우 아래와 같이 비교 문자열이 존재하는 것을 확인 할 수가 있다.


따라서 문자열 비교 함수는 vbaStrCmp이며 키 값은 2G83G35Hs2 인 것을 확인 할 수가 있다.


'Reversing > CodeEngn' 카테고리의 다른 글

CodeEngn Basic 06  (0) 2015.06.01
CodeEngn Basic 05  (0) 2015.05.31
CodeEngn Basic 04  (0) 2015.05.31
CodeEngn Basic 02  (0) 2015.05.31
CodnEngn Basic 01  (0) 2015.05.31

CodeEngn Basic 02

Kail-KM
|2015. 5. 31. 22:03

문제확인


아래와 같이 패스워드를 확인하는 문제이다. 하지만 실행파일이 손상되어 실행이 되지 않는다. 실행을 하여보자.



실행을 할 경우 windows8.1에서는 아래와 같이 뜨는 것을 확인 할 수가 있다. 따라서 우리는 다른 방법으로 이 프로그램을 분석하여야 한다. 참고로 손상이 되었기에 디버깅도 가능 하지 않다. 따라서 우리는 HexEditor를 통하여 프로그램을 분석하여 보자.




풀이


아래와 같이 문자열이 기록되는 부분으로 추측 되는곳에 패스워드로 추측이 되는 문자열을 확인 할 수가 있다. 이처럼 우리는 패스워드를 쉽게 찾을 수가 있다.


'Reversing > CodeEngn' 카테고리의 다른 글

CodeEngn Basic 06  (0) 2015.06.01
CodeEngn Basic 05  (0) 2015.05.31
CodeEngn Basic 04  (0) 2015.05.31
CodeEngn Basic 03  (0) 2015.05.31
CodnEngn Basic 01  (0) 2015.05.31

CodnEngn Basic 01

Kail-KM
|2015. 5. 31. 21:53

문제확인


문제는 아래와 같이 GetDriveTypeA가 CD-ROM으로 인식 되기 위해서는 어떤 리턴값이 와야 하는지에 대한 문제를 구하는 방법이다.



아래와 같이 BP를 걸고 실행시 EAX에 3이 반환 되는 것을 확인 할 수가 있다. 이는 DRIVE_FIXED가 반환 되는 것으로 MSDN을 통하여 확인을 할 수가 있다. 또한 여기서 우리는 DRIVE_CDROM이 Return Value 5에 있는 것을 확인 할 수가 있으며, 이를 통하여 우리는 문제를 풀 수가 있었다.




풀이



하지만 여기서 CMP EAX,ESI를 통하여 분기점이 나뉘어지는데 여기서 문제가 이상한 것인지 EAX에 5를 넣어도 CMP EAX(3), ESI(4010003)이 비교가 되어서 결국 실패하는 부분으로 가게 된다. 따라서 우리는 성공 문자를 출력하기 위하여 다른 방법을 사용하여야 한다.


아래와 같이 JE를 JNE로 바꿈으로 인하여 우리는 성공 메세지를 확인 할 수가 있다.


'Reversing > CodeEngn' 카테고리의 다른 글

CodeEngn Basic 06  (0) 2015.06.01
CodeEngn Basic 05  (0) 2015.05.31
CodeEngn Basic 04  (0) 2015.05.31
CodeEngn Basic 03  (0) 2015.05.31
CodeEngn Basic 02  (0) 2015.05.31

문제확인


Hint를 확인할 경우 아래와 같이 간단한 소스를 확인 할 수가 있다. 하지만 여기서 보아야 할것은 bleh[80]인데 fgets로는 79byte 까지만 입력을 받는 것을 볼 수 있으며 이를 통하여 BOF는 할 수 없다는 것을 알 수가 있다. 그렇다면 다른 부분을 보아야 하는데 바로 printf(bleh)이다. 여기에는 포멧 스트링이 존재 하지 않기 때문에 이를 통하여 공격을 할 수가 있다.


gdb로 확인을 할려 했으나 확인이 되지 않기에 직접 hint의 소스를 통하여 같은 프로그램을 컴파일 하였다. 역시 BOF는 불가능 한것을 확인 할 수가 있다. 


우선 문제를 직접 실행하여보자. AAAA %8x %8x %8x %8x를 할 경우에 AAAA가 저장된 곳이 출력이 되는 것을 확인 할 수가 있다. 따라서

출력물 - 4f - 4212ecc - 42087a75 - 41414141 - 과 같은 순서로 구성이 되는 것을 확인 할 수가 있다. 따라서 우리는 인자로 DTOR_END의 주소를 주어서 그 주소에 새로운 값을 쓰도록 할 것이다. 공격 방법은 아래에서 구체적으로 설명을 하겠다. 이 41414141이 나오기 전의 3가지의 값을 우리는 버릴값이라고 임의로 정하자.


nm 명령어가 통하지 않기에 우리는 objdump -h attackme를 통하여 dtor_LIST의 주소를 찾는다. 그 후 이 LIST+4가 바로 DTOR_END의 주소임을 우리는 알아야 한다. 따라서 DTOR_END의 주소는 0x08049598 이다. 




공격


공격에 앞서 우리는 환경변수를 통하여 DTOR_END를 대체할 주소를 마련해야하며 이를 위하여 아래와 같이 환경변수를 등록을 한다. 그리고 공격에 쓰일 환경변수의 주소는 0xbffffc9d이다.


이제 Payload를 작성하면 아래와 같다. 이 페이로드에 대하여 설명을 하자 우선 FSB 공격의 경우에 흔히 "AAAA낮은주소BBBB높은주소"와 같은 형태로 쓰인다. 여기서 주목해야할 것은 바로 가운데에 있는 " + "를 기준으로 가독성을 위하여 일부러 나누어서 공격을 시도하였다. 우선 앞부분의 경우 인자로 "AAAA+DTOR_END(low)+BBBB+DTOR_END(high)"의 주소를 주고 있다. 낮은 주소와 높은 주소를 나누는 이유는 환경변수의 주소를 한 곳에 담을 수가 없기에 낮은주소에 2byte만큼을 그리고 높은주소에 2byte만큼을 입력하기 위함이다. 

그리고 뒤의 세번의 %8x를 통하여 우리는 앞에서 본것과 같이 버릴값을 지나친다. 세번의 포인터가 이동하기 떄문이다. 그리고 이 세번의 %8x 후에 포인터는 이제 인자가 나타내는 주소 "0x41414141"을 나타내고 있다. 이제 여기에 우리는 %(64629)c를 통하여 "AAAA낮은주소BBBB높은주소"로 이동을 하고 그 낮은 주소가 가르키는 주소에 %n을 통하여 값을 씌운다. 그리고 값을 씌운 이후 "AAAA낮은주소BBBB높은주소"에 위치하는데 여기에 %(50018)c를 통하여 한번더 이동하므로 "AAAA낮은주소BBBB높은주소"로 이동을 하게 되고 여기에 이제 %n을 통하여 값을 씌운다. 

이제 %64629c와 %50018c에 대하여 설명을 하자면 바로 환경변수의 주소를 나타내는 것이다. 환경변수의 주소는 0xbffffc9d인데 2byte씩 나누어서 값을 씌워야한다. 우선 FC9D의 값을 10진수로 변환하고 " + " 이전에 쓰인 16+ %8x*3 까지 포함하여 40Byte를 뺄셈한다. 그 값이 바로 64629이다. 이를 통하여 \x9d\xfc를 덮어 쓴것이다. 그리고 1BFFF-FC9D를 통하여 50018이란 값이 나오고 이를 통하여 \xff\xbf의 값을 씌우므로 우리는 결국 \x9f\xfc\xff\xbf 의 주소를 DTOR_END에 덮어 씌울수가 있다. 


이를 통하여 공격을 실행하여 우리는 쉘을 획득 할 수가 있다.

'Hacking > System Hacking' 카테고리의 다른 글

Cracking Windows Password Hash with Kali linux Live Booting  (1) 2015.08.22
FTZ Level19 //Chaining RTL Calls  (0) 2015.05.28
FTZ Level18  (0) 2015.05.25
FTZ Level17  (0) 2015.05.24
FTZ Level16  (0) 2015.05.22

Socket_server.py

Kail-KM
|2015. 5. 28. 19:06



사진출처 : http://jinpyolab.tistory.com/1

'Programming > Python' 카테고리의 다른 글

crypto.py  (1) 2015.06.20
Search_File.py  (1) 2015.06.20
Socket_client.py  (0) 2015.05.28
Code Injection by Python  (1) 2015.03.26
DLL Injection API by Python  (0) 2015.03.25