분류 전체보기
Assembly
Assembly
2016.11.18Intel x86 Architecture ( windows ) 연산 방향 ←AT&T Architecture ( *-NIX계열 ) 연산 방향 → ( * gdb가 아니라 objdump에서 확인해야 함 ) Inline Assembly```cint input = 3;int output = 0;__asm__ __volatile__( "mov %1, %%eax \n\t" "add $1, %%eax \n\t" "mov %%eax, %0 \n\t" : "=r" (output) : "r" (input) : "eax"); // clobber```output / input / clobber를 사용하는 경우(Extended asm), asm에서 레지스터를 사용할 때 반드시 ``c %%``로 적어주어야 한다. 반대로 Basic..
main startup routine bt
main startup routine bt
2016.11.15`` main``의 상위 frame은 `` __libc_start_main``이다. __libc_start_main`` __libc_start_main``은 `` init, fini, stack_end`` 등을 인자로 받는데, 첫 번째 인자로 `` main``의 함수 포인터를 받는다.```cint __cdecl _libc_start_main(int (__cdecl *main)(int, char **, char **), int argc, char **ubp_av, void (*init)(void), void (*fini)(void), void (*rtld_fini)(void), void *stack_end) .text:0000000000000A5D lea rdi, main ; main.text:000000..
jmp, call instruction 주소 계산
jmp, call instruction 주소 계산
2016.11.15Intel x86 architecture에서 JMP, CALL 명령어는 5Byte로 opcode와 operand는 다음과 같다.```cJMP : E9 XX XX XX XXCALL : E8 XX XX XX XX```이 때 operand는 절대주소 값이 아니라, 현 위치 기준 상대주소다. 따라서```cXX XX XX XX = 목적지주소 - 현재명령어주소 - 5 ( Little Endian 정렬 )```-5(Byte)는 JMP, CALL 명령어의 크기 만큼 빼주는 것. ex) 402000에서 401000으로 간다면```c402000 - 401000 - 5 = FF FF EF FB E9 FB EF FF FF``` 절대주소를 사용하고 싶은 경우```c mov eax, 401000 jmp *eax```call도 동..
FTZ : ; cat, FSB
FTZ : ; cat, FSB
2016.11.15ftz 서버에 붙어서 하는거랑, 직접 vmware를 이용해 구축해서 하는거랑 차이가 있다. 직접 구축하라고 배포되고 있는 iso파일은 OS가 red hat 9라서 그런 듯.ftz 서버에 붙으면 버그도 없고, ASLR도 꺼져있고, setuid 걸려있어도 gdb 사용이 가능해서 상당히 난이도가 내려감.기본 쉘에서는 0xc0인가?를 넘어가면 둘로 쪼개지며 이상하게 입력되는 버그가 있어 csh를 사용해야 한다. 처음에 귀찮아서 shell script로 짰는데 안돼서 system 함수로 같은 기능하게 하는 프로그램을 짰더니 된다.xinetd가 쉘 명령어를 인식 못하기 때문인 것 같다. 왜 생성되는 임시파일을 cp로 얻는게 안되냐면, 아마 주어진 race condition 취약점이 있는 프로그램이 파일 쓰기부터 삭..
LOB gate ~ skeleton → golem
LOB gate ~ skeleton → golem
2016.11.15bash 버그 때문에 반드시 bash2를 사용해야 한다는 점 주의. 구축하고 나서 netconfig로 설정해주어야 telnet 접속이 가능하다. ff를 넣으면 00으로 바뀜. 왜 ff가 00으로 바뀌는건지 찾아보니 bash버그가 있다고 한다. 그래서 bash2를 사용해야 한다고. 별거 없음. 버퍼가 작을 뿐. gets를 이용해 stdin으로 받는다는 것이 차이점.세가지 방법이 생각났는데,1) hex값을 ASCII문자로 변경해서 복붙2) ASCII code표 보고 입력 가능한 문자 hex값을 고려해 본 다음 가능한 메모리 공간에 적재.- 이건 불가능할거같다. 프로세스에 삽입하는 데이터의 위치를 내가 임의로 지정할 수 없다.3) 파일입출력을 이용해 hex data를 바로 쓰는 방법. file descript..
[setuid] ruid, euid
[setuid] ruid, euid
2016.11.15passwd 등 내부적으로 `` ruid``를 체크하는 작업을 수행하려면 `` ruid``를 변경해 주어야 한다. `` setuid`` bit가 설정 되어있는 바이너리를 실행하면 `` euid``가 변경된다. `` ruid``는 `` euid``가 변경된 상태에서 직접 ``c setuid()``를 호출해줄 때 변경된다. 때문에 ``c setuid()``를 호출하지 않는 바이너리를 이용해 쉘을 실행하더라도 `` euid``만 변경되고 `` ruid``는 그대로인 상태다.이런 경우, 쉘을 실행하기 전에 ``c setuid()``도 실행하도록 하면 ``c ruid == euid``인 쉘을 얻을 수 있다.`` euid``만 변경된 쉘에서 ``c setuid(geteuid()) / system("/bin/sh")..
Port, Socket, Connection
Port, Socket, Connection
2016.11.13server 측 socket programming sequence```csocket() //socket 생성 파라미터로 넘긴 값들이 socket 구조체에 들어간다.bind() //IP와 port 할당listen() //대기accept()``` Port / Socket / ConnectionA TCP connection is defined by two endpoints aka sockets. socket은 IP와 port로 정의되는 endpoint다. ( 사실 상태나 프로토콜도 정의 요소에 포함해야 한다. )즉, TCP connection은 srcIP:port , dstIP:port( two sockets, 4-tuple )로 정의된다. 하나의 port에 여러 socket이 존재할 수 있다. 단, 둘 이상..
[C] printf, scanf계열
[C] printf, scanf계열
2016.11.10```c%p == %#x%2x 2자리 출력. 빈칸일 경우 공백으로 채움%02x 2자리 출력. 빈칸일 경우 0으로 채움%u unsigned type 출력. 기본은 int%h short 출력. h 한 개 붙일 때 마다 1/2씩 감소.%hhu uint8_t 출력%hhx uint8_t 16진수 출력``` ``c scanf()`` 쓸 때 마지막 개행문자가 버퍼에 남지 않을 수 있도록 format string 끝에 ``c \n``을 적어주는 것이 좋다.표준 함수에서 BOF를 예방하는 법은 ``c %100s`` 같이 사용하는 것. ( 입력을 100개의 char로 제한. )``c scanf()``는 다양한 형식을 입력받아야 할 때 사용하고, 단순히 문자열을 입력 받는 함수가 필요하다면 ``c fget()``를 사용하는..
BOF, Buffer OverFlow ( local exploit )
BOF, Buffer OverFlow ( local exploit )
2016.11.10이 글은 보호되어 있기 때문에 이것을 보려면 암호가 필요합니다.
[C] atoi / strtol , sprintf : 문자열 > 숫자, 16진수 변환
[C] atoi / strtol , sprintf : 문자열 > 숫자, 16진수 변환
2016.11.06문자열 > 숫자```c#include int atoi(const char *nptr);long atol(const char *nptr);long long atoll(const char *nptr); long int strtol(const char *nptr, char **endptr, int base); // strtollunsigned long int strtoul(const char *nptr, char **endptr, int base); //strtoull``` 직접 변환하기```cpp auto i = 0; while (isdigit(input[pos])) i = i * 10 + input[pos++] - '0';``` 숫자 > 문자열```c#include int printf(const char ..
[shell] pipe
[shell] pipe
2016.11.03pipe란? 한 프로세스의 `` stdout``을 다른 프로세스의 `` stdin``으로 연결하는 IPC 방법이다. 파이프 한 개(r, w 한 쌍) 당 한 쪽 방향으로만 사용할 수 있다. ``` ↓ docking! ↓ -------pipe------- ---------process--------- -------pipe------- w -> r ⇒ stdin stdout ⇒ w -> r -------pipe------- ---------process--------- -------pipe------- ``` 이름없는 파이프 ```bash echo .... | File ( ...; cat ) | File ``` `` A | File`` : A의 표준 출력을 File의 표준 입력으로 연결한다. fifo ( na..
[Windows] 공유 폴더 설정
[Windows] 공유 폴더 설정
2016.11.01!!! 클라이언트 수 제한클라이언트 프로그램 중 파일을 받아올 때 마다 커넥션을 서너개 씩 막 열고 닫지는 않는 클라이언트 프로그램이 있다. 대표적으로 ES파일탐색기. 원래 안그랬는데 최근에 변경된 듯?이런 경우 사용자 수를 제한해버리면, 폴더를 눌렀는데 반응이 없거나, 파일 목록은 보이는데 재생할 수 없는 파일 형식이라고 뜨니 주의. # 공유폴더 등의 목적으로 생성한 계정을 로컬로그인 시 숨기는 방법.제어판 - 관리도구 - 로컬 보안 정책에서 로컬 정책 - 사용자 권한 할당 - 로컬 로그온 거부 에 개체를 추가하면 된다. 거부가 허용보다 우선하니 해당 계정의 그룹을 해제할 필요는 없다. RDP에서는 이 옵션이 필요 없다.windows server OS가 아닌 경우 한 OS에 여러 계정으로 로그인 할 수..