회사에서 마이그레이션 테스트 서버를 만들기 위해 CentOS 6.5를 설치하던 중 만난 에러. 


이미지 파일을 Unetbootin 으로 USB에 풀고 설치시 발생.


해결법 -> 


USB에서 /repodata/TRANS.TBL 파일을 열어보면 해당 repodata폴더에 있는 파일들의 리스트와 명칭이 다르다.


/repodata 밑에 있는 md5 해쉬 값으로 된 파일 명들을 모두 TRANS.TBL 에 들어있는 목록과 일치하도록 rename 을 한 뒤 다시 설치를 시도하면 에러 없이 정상적으로 설치가 진행 된다. 




Posted by $Zero
:

삼바를 외부에서 사용하기 위해서는 서버와 139 포트로 연결이 가능해야 한다. 


삼바를 외부에서 사용하려고 할 때 몇가지 문제가 있는데, 


첫째로 윈도우는 기본적으로 139포트외에 다른 포트로 변경할 방법이 없다. 

(심지어 해당 서비스의 포트포워딩도 프로그램을 해킹하지 않는 이상 불가하다.)


둘째, 139포트는 웜바이러스가 기승을 부리던 포트라 어지간한 통신사는 라우터 자체에서 해당 포트의 사용을 막아버렸다. 


웜바이러스와는 거리가 먼, 리눅스 및 유닉스 사용자는 억울하기 그지 없는 처사다. 


그래도 다행인건 리눅스 및 유닉스는 삼바연결시 포트를 마음대로 바꿀 수 있다는 점이다. 


해서 리눅스와 유닉스는 외부에서 삼바를 사용하는 것이 크게 문제가 되지 않는다. 

단지 서버쪽 포트를 기본139가 아닌 8888과 같은 임의의 포트로 변경하고 클라이언트에서도 8888포트로 연결해서 사용하면 된다 


가장 큰 문제는 사용률이 가장 높은 윈도우에서 발생한다. 


서버측에서 포트를 변경한다 한들 윈도우즈의 네트워크 드라이브는 139포트 밖에 사용할 수 없기에 연결을 할 수가 없다. 


아직까지 내가 아는 방법은 2가지 뿐이다. 


1. 통신사측에 139포트를 열어달라고 요청하든지


2. 꼼수를 부려 윈도우즈의 139 포트 출력을 다른 포트로 포워딩 시키는 것이다. 


일반적으로 포트 포워딩은 들어오는 패킷의 포트를 내부 PC의 다른 포트로 받아들이는 것인데 


이와 반대로 내부 PC가 외부로 패킷을 보낼때 원본 패킷의 포트를 뜯어 고치는 것이다. 


윈도우즈입장에서는 139포트로 연결을 요청하면 중간에 프록시와 같은 프로그램이 연결을 가로채 139포트를 8888포트로 변경해서 외부로 보낸다고 이해하면 되겠다.


매우 귀찮고 번거롭지만 윈도우즈에서 별다른 방법이 없다. 


이 방법 역시 서버측 포트는 139가 아닌 다른 포트를 사용 해야한다. 

(139는 통신사에 의해 막혀있으므로..)



http://devbug.me/412 (해당 유틸과 사용법)





Comicglass SMB 사용 - 2016-05-30 작성 -


정말 오랜만에 SMB를 사용할 일이 생겼다.


ComicGlass의 SMB를 이용하여 내 방에 있는 NAS를 스트리밍하려고 한 것인데,


139포트가 통신사에 의해 막혀있다는 사실을 망각한 채 외부에선 왜 오류가 나지라는 의문으로 하루를 보냈다. -_-


공유기를 연결하여 포트포워딩으로 8888포트를 사용하게 했건만..


ComicGlass가 포트변경을 지원하지 않는 것 같다.

URL에 :8888을 넣어도 아무런 반응이 없다.


보안에 영 찝찝해서 잘 안쓰지만 별 방법이 없을 것 같다.


공유기의 VPN 서버를 활용하는 수 밖에...


공유기의 VPN 서버를 경유 하니 NAS에서 오픈한 SMB서버에 접속이 매우 잘 된다.


VPN서버를 열어둔다는 게 매우 찝찝하지만.. 별 방법이 없으니 - -










Posted by $Zero
:

REP = 다음에 나오는 명령어를 ECX 만큼 반복해서 수행 

REPNE, REPNZ = Zero Flag 가 0이 아니며 ECX 만큼 수행. Zero Flag가 0이되면 빠져나옴.  (Zero Flag != 0 , ECX > 0 )

REPE, REPZ = Zero Flag 0 일 경우 ECX만큼 수행. Zero Flag 가 설정되면 빠져나옴. (Zero Flag == 0, ECX > 0)

STOS = AX의 값을 EDI 주소에 저장

SCAS = AX의 값과 EDI 주소에 있는 값과 비교 

SCASB = SCAS 를 byte 단위로 비교 

SCASW = SCAS 를 word 단위로 비교 

SCASD = SCAS 를 DWORD 단위로 비교

LODS = ESI 가 가리키는 메모리의 값을 읽어 EAX로 복사 (STOS와 같이 b,w,d 의 단위 연산자가 있음)

LOOPD = ECX만큼 피연산자의 주소로 goto 하는 명령

ROL = 왼쪽으로 shift(<<) 명령 최상위 비트가 오른쪽 끝으로 이동

SHR = 왼쪽으로 shift(<<) 명령 최상위 비트가 CF 로 이동 


LODSB/LODSW/LODSD (Load String Byte/Word/Double) 바이트/워드/더블워드의 자료를 esi가르키는 곳으로 부터 읽어와서 al/ax /eax 레지스터에 전송시킨다. 전송된 후 esi는 다음번 문자열 요소를 가르 키도록 갱신되는 데, df이 0이면 1/2/4만큼 증가되고, df가 1이면 1/2/4 만큼 감소된다.



----JMP----


JL(Jump if Less) = (SF!=0F) 비교 결과가 작으면 점프. 

JLE(Jump if Less or Equal) =  (ZF=1 or SF!=0F) 비교 결과가 작거나 같으면 점프.

JNE(Jump if Not Equa) = (ZF=0) 비교 결과가 다르면 점프.

JNB(Jump if Not Below) = (CF=0) 비교 결과가 크거나 같으면 점프.

JBE(Jump if (unsigned) below or Equal) CF=1 or ZF=1

JB(Jump if Below) = (a < b) 뒤의 피연산자의 값이 클 경우 점프

JA(Jump if Above) = (a > b) 앞의 피연산자의 값이 클 경우 점프 (CF=0 and ZF=0)

JG(Jump if Greater) = (a > b) 왼쪽 인자의 값이 오른쪽 인자의 값보다 크면 점프 (ZF=0 and SF=0F)



----PUSH & POP----


PUSHFD = 플래그 레지스터를 스택에 저장 

PUSHAD = 모든 레지스터를 스택에 저장.

POPAD = PUSHAD로 저장된 레지스터를 모두 복원

POPFD = 스택에서 플래그 레지스터 복원

PUSHA,POPA : 16bit 버전 


----------------------------


CLI = 인터럽트 플래그를 0으로 만든다. (인터럽트 무시)

STI = 인터럽트 플래그를 1로 만든다. (인터럽트 허용)




Posted by $Zero
:

mysql 데이터베이스의 user 테이블에 host,user 정보 insert되었는지 확인 후

flush privileges;  로 변경 권한 적용(혹은 mysql reload)

/etc/mysql/my.cnf 에 bind-address 설정이 있는지 확인.

있다면 해당 줄 주석처리. 

Posted by $Zero
:





한글이 insert 가 안되는 경우는 100% character set 문제다. 

비록 server , client , database, table, connection 모든 character set 을 utf8로 변경했다 하더라도 


latin1 상태에서 만든 테이블은 각 컬럼들이 여전히 latin1로 남아있다. 


각 컬럼에 스샷과 같이 alter 명령으로 character set 을 utf8 로 바꿔주면 한글이 정상적으로 잘 입력된다. 

'레퍼런스 > DB' 카테고리의 다른 글

[mysql] 원격접속이 안되는 경우.  (0) 2014.02.21
[Oracle] Oracle 설치시 DISPLAY 변수 문제  (1) 2013.08.30
Posted by $Zero
:

cron 의 로그는 syslog가 관리하며


sudo grep CRON /var/log/syslog 로 확인 할 수 있다. 


Posted by $Zero
:

TOMCAT_HOME/lib/el-api.jar 


파일을


JAVA_HOME/jre/lib/ext 폴더에 복사




'레퍼런스 > API' 카테고리의 다른 글

[winAPI] ReadProcessMemory  (1) 2013.09.14
[winAPI] ProcessToken, AccessToken  (0) 2013.09.12
[winAPI]GetModuleFileName 함수  (0) 2013.09.02
[winAPI] DllMain 정의  (0) 2013.09.02
[winAPI] ListBox 여러개 삭제, 멀티 셀렉트 삭제  (0) 2012.05.30
Posted by $Zero
:





win XP의 CreateRemoteThread 실행 과정


kernel32!CreateRemoteThread() -> ntdll!ZwCreateThread()


windows7 의 CreateRemoteThread 실행 과정


kernel32!CreateRemoteThread() -> kernelbase!CreateRemoteThreadEx() -> ntdll!ZwCreateThreadEx()


kernelbase는 Vista 이상부터 추가된 dll 파일 . 


zwCreateThreadEx() native API를 호출하는 코드루틴을 보면 


Suspend 모드로 쓰레드를 생성하고 


Resume API를 호출하기전에 어떠한 변수값을 비교한 후 점프를 함 .


만약 그 변수값이 틀릴 경우 Resume을 호출하지 않고 그대로 ExitThread API함수로 건너 뜀 


Resume 이 실행되야 Suspend모드에서 빠져나올 수 있으므로 


해당 CMP 명령어에서 변수값을 똑같도록 맞춰주면 DLL인젝션이 성공적으로 이루어짐

'레퍼런스 > Reversing' 카테고리의 다른 글

ADM 64 Linux 호출 규약  (0) 2018.05.18
[리버싱] 어셈블리어 정리  (1) 2014.05.13
Posted by $Zero
:
BOOL WINAPI ReadProcessMemory(
  _In_   HANDLE hProcess,
  _In_   LPCVOID lpBaseAddress,
  _Out_  LPVOID lpBuffer,
  _In_   SIZE_T nSize,
  _Out_  SIZE_T *lpNumberOfBytesRead
);

Process의 메모리 데이터를 읽어오는 함수.


hProcess : 메모리에서 데이터를 읽어 올 프로세스의 핸들. 이 핸들에대한 PROCESS_VM_READ 권한이 있어야 메모리에 액세스 할 수 있다. (디버깅 모드로 접근시 모든 메모리에대해 R/W 권한이 있다.)

lpBaseAddress : 읽어올 데이터가 있는 메모리의 주소. 이 메모리의 주소는 hProcess내의 공간이어야 하며, 시스템은 이 메모리에 접근해 데이터를 전송하기전에 이 메모리를 읽을 권한이 있는지 검사하고 혹 권한이 없다면 함수를 종료한다.

lpBuffer : lpBaseAddress에 있는 데이터를 받기위한 버퍼의 포인터 . 

nSize : 받을 데이터의 크기 


lpNumberOfBytesRead : 받아온 데이터의 크기를 저장할 변수의 포인터. 

(NULL로 지정시 이 파라미터는 무시된다.)


Posted by $Zero
:



Token관련 API 

Windows의 Token은 계정의 권한과 같은 개념이다. 

윈도우엔 권한이 있어야만 실행 가능한 것들이 있다.

(현재 로그인 세션의 권한을 저장하고 있는 변수라고 생각하면 된다.)


BOOL WINAPI OpenProcessToken(
  _In_   HANDLE ProcessHandle,
  _In_   DWORD DesiredAccess,
  _Out_  PHANDLE TokenHandle
);

ProcessHandle : Token을 얻어올 프로세스 핸들
DesiredAccess : 해당 프로세스에서 필요한 액세스 권한
TokenHandle : 얻어온 토큰이 저장될 핸들


BOOL WINAPI LookupPrivilegeValue(
  _In_opt_  LPCTSTR lpSystemName,
  _In_      LPCTSTR lpName,
  _Out_     PLUID lpLuid
);

*LUID = locally unique identifier의 약자로 Windows가 부팅되면서 부여되는 64비트크기의 고유한 값이다.


함수 이름 그대로 PrivilegeValue 값을 Lookup하는 함수. 
PrivilegeValue는 LUID로 구분되어 OS가 리부팅 되기전까지 가지고 있는 고유한 값이다.
(각 권한마다 매 부팅시 LUID가 부여되며 우리는 이 LUID로 권한을 disable || enable 시킬 수 있는 것이다.)


lpSystemName : Privilege값을 얻어올 시스템 이름. NULL입력시 로컬 시스템.
(MSDN에서 의미하는 System이 호스트단위인지는 잘 모르겠다. 공유가 가능한 LAN상에서 타 시스템의 Token도 가지고 올 수 있는건지 MSDN에선 Local system과 일반 system을 구분하고 있다.)

lpName : PrivilegeValue를 얻어올 PrivilegeName. 

lpLuid : PrivilegeValue를 받을 LUID자료형의 포인터. 



BOOL WINAPI AdjustTokenPrivileges(
  _In_       HANDLE TokenHandle,
  _In_       BOOL DisableAllPrivileges,
  _In_opt_   PTOKEN_PRIVILEGES NewState,
  _In_       DWORD BufferLength,
  _Out_opt_  PTOKEN_PRIVILEGES PreviousState,
  _Out_opt_  PDWORD ReturnLength
);

명시된 Access Token 의 권한을 Disable || Enable 시킬 수 있는 API함수


TokenHandle : 권한을 수정 할 Token의 핸들.

DisableAllPrivileges : 수정과는 관계없는 인자이므로 FALSE를 전달하면 된다. 이 값이 TRUE일 경우 NewState값은 무시되며 모든 권한이 Disable된다 

NewState : 수정할 토큰에대한 정보를 담은 TOKEN_PRIVILEGES 구조체의 포인터 (예제 참조)

BufferLength : 버퍼의 크기 입력. 수정되기전의 Privileges 값을 받을 때 사용되는 버퍼같은데 어떻게 사용하는지는 자세하게 알지 못하겠다. 0으로 설정하려면 PreviousState (변경되기 전의 값을 받을 포인터) 또한 NULL이어야 한다. 

PreviousState : 변경되기전 Privileges값을 받기위한 포인터 

ReturnLength : 변경되기전 Privileges 값을 리턴받기위해 필요한 바이트 크기. TOKEN_PRIVILEGES의 크기를 말하는 것 같다. 이 역시 PreviousState값이 NULL일 경우에만 NULL을 전달 할 수 있다. 




예제


int main(int argc, char *argv[])
{


if(!SetPrivilege(SE_DEBUG_NAME, TRUE))
return 1;

return 0;
}



BOOL SetPrivilege(LPCTSTR lpszPrivilege, BOOL bEnablePrivilege)
{
TOKEN_PRIVILEGES tp;
HANDLE hToken;
LUID luid;

if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
{  
printf("OpenProcessToken error : %u\n", GetLastError());
return FALSE;
}

if(!LookupPrivilegeValue(NULL, lpszPrivilege, &luid))
{
printf("LookupPrivilegeValue error : %u\n", GetLastError());
return FALSE;
}

tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
if(bEnablePrivilege)
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;   
else
tp.Privileges[0].Attributes = 0;               // disable

if(!AdjustTokenPrivileges(hToken, 
FALSE,
&tp,
sizeof(TOKEN_PRIVILEGES),
(PTOKEN_PRIVILEGES) NULL,
(PDWORD)NULL))
{
printf("AdjustTokenPrivileges error : %u\n", GetLastError());
return FALSE;
}

if(GetLastError() == ERROR_NOT_ALL_ASSIGNED)
{
printf("The token does not have the specified privilege. \n");
return FALSE;
}

return TRUE;
}




**  TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY 에 대해 


TOKEN_ADJUST_PRIVILEGES : Token에 Access권한을 설정하는 AdjustTokenPrivileges를 호출할때 필요하다
MSDN : Required to enable or disable the privileges in an access token.


TOKEN_QUERY : 어떤 값인지 감을 못잡겠다 . 

MSDN의 내용대로라면 Lookup API를 쓰기위해 지정해주는 mask가 아닐까 한다. 

query : 질의, 문의 

MSDN : Required to query an access token.

Posted by $Zero
: