전체 글
call-by-reference, call-by-value + call-by-address
2016.11.22 : Coding Note/CodingKnowledge주소0차1차 &pp*p 122EF560 125F7458 71 Note ) java에서 말하는 참조 변수와, C++에서 말하는 참조 변수가 다름을 알아야 혼동을 피할 수 있다.C++에서 참조 변수는 java나 C에는 없는, 변수 자체의 alias 개념이다 ( case 3 참조 )java에서 참조 변수란 C나 C++에서 말하는 포인터 변수와 동일하다. 즉 배열, 객체 등을 가리키는 변수를 말한다.( C의 포인터 변수와 다른 점은 참조 변수에 아무 값이나 대입할 수는 없다는 것이다. )아마 java가 포인터를 지원하지 않으면서 포인터 변수 보다는 참조 변수라는 말을 쓰는 것 같다. case 1: call-by-value java는 항상 call-by-value다. ( 정확하게는 call-by-sharing =..
[Linux] Memory Layout, Segment + Kernel
2016.11.21 : OS/LINUX & UNIX2017/01/04 - [System/LINUX & UNIX] - procfs stack의 최대 크기는``c RLIMIT_STACK ( usually 8MB, 0x08000000 )``이다. * 한 번 확장된 stack top은 다시 줄어들지 않는다.Text segment의 시작지점은 보통 ``c 0x08048000``이지만, 항상 그런 것은 아니다.dynamic library는 stack과 heap의 중간 Memory Mapping Region에 mapping되고, static library는 text segment에 mapping된다.Memory Mapping Region의 경우 library mapping 이외의 용도로도 사용되는데, anonymous memory mapping이라고 부르며, ``c..
[compile process] Shared Library
2016.11.21 : OS/LINUX & UNIXwindows에서 lib과 dll을 사용하듯, Linux-based system에서도 비슷한 개념의 라이브러리가 존재한다.크게 static library와 shared library로 나뉘며, shared library가 다시 link 시점에 따라 나뉜다. Linking과 Loading의 차이LinkingAll of the object files and any libraries are linked together to make your final program. For static libraries, the actual library is placed in your final program, while for shared libraries, only a reference to the library is ..
XML
2016.11.19 : Languages & Frameworks/Front-endXML(eXtensible Markup Language)tree 구조 ( hierarchical )반드시 단 하나의 root만 가져야 한다DTD(Document Type Definition)는 문서 당 하나여야 한다```xml ]> 127.0.0.1 . . .``` 검색```xml일반적으로는 / 문서 전체에서 검색 // 계층은 상관없음attribute를 검색 @ /ip/@addr 하면 loopback이 나온다.attribute로 검색 [] /ip[addr="loopback"]```xpath에서 namespace 때문에 tag가 검색이 잘 안되는데, 그럴 땐 //*[local-name()='ip']를 이용한다. 또는 NameSpaceContext를 만들어서 xpath에 붙여도 된다. namespace다른 ..
동기식, 비동기식 stream cipher
2016.11.18 : Security/Cryptstream에서 동기식, 비동기식 차이는 key가 평문이나 암호문에 독립적이면 동기식, 종속적이면 비동기식이다. 동기식독립적일 경우 1bit error는 1bit에만 파급되나, (후속 암호문에 오류 파급되지 않음)1bit 추가/손실은 이후 XOR을 당기거나 밀어서 복호화에 실패한다.그래서 전송시에 동기화가 필요하다. 내부상태를 맞춰야하니까.난수열을 암호화 할 input과 독립적으로 생성하는 경우암/복호화에서 상호 동기화 필수의도적인 변조가 복호화 단계에서 검출 불가전송도중 변조되어도 후속 암호문에 오류 파급되지 않음 비동기식비동기식(자기동기식, 종속적)일 경우 내부상태에 의존하지 않아 동기화가 필요없는 대신 이전에 생성된 평문이나 암호문에 종속적이다. 따라서 1bit error/추가/삭제가 발생하면 일부..
Assembly
2016.11.18 : Languages & Frameworks/C C++Intel 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
2016.11.15 : OS/LINUX & UNIX`` 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 주소 계산
2016.11.15 : Security/Reversing & DbgIntel 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
2016.11.15 : Security/System Exploit CHALftz 서버에 붙어서 하는거랑, 직접 vmware를 이용해 구축해서 하는거랑 차이가 있다. 직접 구축하라고 배포되고 있는 iso파일은 OS가 red hat 9라서 그런 듯.ftz 서버에 붙으면 버그도 없고, ASLR도 꺼져있고, setuid 걸려있어도 gdb 사용이 가능해서 상당히 난이도가 내려감.기본 쉘에서는 0xc0인가?를 넘어가면 둘로 쪼개지며 이상하게 입력되는 버그가 있어 csh를 사용해야 한다. 처음에 귀찮아서 shell script로 짰는데 안돼서 system 함수로 같은 기능하게 하는 프로그램을 짰더니 된다.xinetd가 쉘 명령어를 인식 못하기 때문인 것 같다. 왜 생성되는 임시파일을 cp로 얻는게 안되냐면, 아마 주어진 race condition 취약점이 있는 프로그램이 파일 쓰기부터 삭..
LOB gate ~ skeleton → golem
2016.11.15 : Security/System Exploit CHALbash 버그 때문에 반드시 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
2016.11.15 : OS/LINUX & UNIXpasswd 등 내부적으로 `` 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
2016.11.13 : Network & Protocol & Infraserver 측 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이 존재할 수 있다. 단, 둘 이상..