분류 전체보기
pwntools
pwntools
2017.08.13https://github.com/Gallopsled/pwntoolshttps://docs.pwntools.com/en/stable/intro.htmlhttps://docs.pwntools.com/en/stable/globals.htmlhttp://docs.pwntools.com/en/stable/tubes.html 32bit에서도 돌아가기는 하나 정식으로 지원하지는 않음.canary break같은 brute force는 threading이나 asyncio를 사용해야 하는데 threading의 경우 될 때도 있고 안될 때도 있음. 직접 짠건 잘 되는걸로 보아 시스템 상태에 더 민감하게 반응하는 듯? 그래서 이런 경우 직접 코딩하는게 낫다. debug 기능이 아주 이상하기 때문에 그냥 안쓰는게 낫다. ``..
[MCSC2014] tinypwn - SROP
[MCSC2014] tinypwn - SROP
2017.08.10`` 0x3``번 system call을 호출하는데, 이는 ``c read()``다.그리고 곧바로 read 결과 처음 4byte로 return하기 때문에 아주 심플한 바이너리다. ASLR과 NX가 적용되어 있기 때문에 shellcode로 리턴하는 것은 불가능.libc.so가 매핑되지 않는, 단일 바이너리이기 때문에 RTL도 불가능하다. ``` 0x8048107 : int 0x80 0x8048109 : ret `````c int 0x80`` instruction이 있기 때문에 ROP chain을 구성해 파라미터를 푸시하고 system call할 수 있다. ``c read()``는 읽은 byte 수를 eax로 리턴하기 때문에, 이를 이용해 eax를 적당히 설정하고 ``c int 0x80``으로 리턴하면 sy..
Blind SQL Injection
Blind SQL Injection
2017.08.08Boolean-based Blind SQL Injection쿼리 실행 결과의 ``sql True / False`` 여부에 따라 response가 다르다면, Boolean-based Blind를 사용할 수 있다.꼭 로그인에 성공해야 ``sql True``인 것은 아니다. query의 실행 결과가 참인 상태에서 로그인에 실패한 것과 query 실행 결과가 거짓인 상태에서 로그인에 실패한 것 둘을 구분할 수 있다면 사용할 수 있다. 중요한 것은 query의 실행 결과를 구분할 수 있느냐다. 다음 내장 함수를 사용한다.```sqlSUBSTR(str,pos,len) / ASCII(str) mysql> select ascii(substr(pw, 1, 1)) from sqlinj_test where id='umbum..
Basic SQL injection
Basic SQL injection
2017.08.08Note마지막에 짝이 안맞는 `` '``가 있으면 query가 실행되지 않는다. 1. 짝을 맞춰주거나 2. 주석처리 해주거나 3. escape 해주어야 한다.``sql SELECT``가 아니라 ``sql INSERT, UPDATE, DELETE`` 등이어도 injection 가능하다. 단, ``sql UPDATE`` 내부에 sub query로 ``sql SELECT``를 사용할 때 ``sql UPDATE`` 대상 database와 ``sql SELECT``대상 database가 같다면 아무것도 조회되지 않는다. && ||``sql AND / OR``는 공백 넣어주어야 하고, ``sql && / ||``는 공백 없어도 된다. 공백이 없어도 `` '``로 감싸면 문자열로 인식하기 때문에 ``sql ''or'..
[Windows] injection & hooking
[Windows] injection & hooking
2017.08.07Dll injection#1``c OpenProcess()``로 HANDLE을 얻는다.``c VirtualAllocEx()``로 타겟 프로세스에 injection할 dll의 path를 쓸 공간을 할당한다.``c WriteProcessMemory()``로 step 2의 주소에 path를 쓴다.``c GetProcAddress()``로 LoadLibraryA의 주소를 얻는다. ``c CreateRemoteThread()``의 네번째 인자로 실행할 함수( LoadLibraryA )의 주소를, 다섯번째 인자로 그 함수가 실행할 인자(path)를 전달한다.결과적으로 remote process가 ``c LoadLibraryA(path)``를 실행하게 되어 dll을 load하게 되고, ``c Dllmain()``이 ..
[Linux] injection
[Linux] injection
2017.08.07So injection#1리눅스는 윈도우의 CreateRemoteThread같은 API를 제공하지 않기 때문에, ptrace를 이용해야 한다.2016/12/12 - [System/LINUX & UNIX] - ptrace - Linux injection ( code injection / so injection ) #2환경변수 LD_PRELOAD가 설정되어 있는 경우 명시된 라이브러리를 먼저 로드한다.2016/12/19 - [System/LINUX & UNIX] - LD_PRELOAD를 이용한 so injection과 hooking. + wrapping function #3쓰기 권한이 있는 경우 ELF 포맷 대로 수정해서 library를 로딩하도록 하는게 가능할 것 같기는 한데, 해보지는 않았다. Code ..
[CodeGate2014] nuclear : libpthead(send, recv, system)
[CodeGate2014] nuclear : libpthead(send, recv, system)
2017.07.31아이디어 자체는 어렵지 않았으나 `` libc``가 아닌 다른 library의 함수가 호출될거라는 생각을 못했기 때문에 꽤 헤맸다.recv buffer 초기화에 별로 신경을 안썼더니, send의 결과로 받은 값에 이전 send 결과로 받은 데이터가 포함되어 몇 byte 씩 틀어져 있거나 처음에 303031이 들어가 시간을 꽤 소모함. fork를 사용하는 standalone 방식의 서버 프로그램이다. leak``c __isoc99_sscanf()`` 실행 이후 stack context```0000| 0xffffd050 --> 0xffffd070 ("1/1\n")0004| 0xffffd054 --> 0x8049877 ("%f/%f")0008| 0xffffd058 --> 0xffffd274 --> 0x3f80..
[C] the end of the address space check
[C] the end of the address space check
2017.07.27```cif (__builtin_expect ((uintptr_t) p > (uintptr_t) -size, 0)```* `` size`` is `` p``'s size ``c type(x) = uintptr_t``일 때, ``c x + ~x = uintptr_t's MAX (111...11)`` 이므로``c p + x = MAX`` 이면 ``c p = ~x``다. ``c -x = ~x + 1``이므로 ``c p = -x - 1``이다.* 이를 대입하면 ``c x -x -1 = MAX``가 나오는데, 보통 ``c int(-1) = uintptr_t's MAX (111....11)``임을 생각해보면 된다. 따라서 ``c p = -x -1``이면 ``c p + x = uintptr_t's MAX``다.``c..
Shellcode
Shellcode
2017.07.26http://shell-storm.org/shellcode/ NOP-like NOP는 다음과 같은 방식으로도 만들 수 있다.```cmov %eax, %eax``` #1 peda #2 pwntools #3 msf x86```cvoid main(){__asm__ __volatile__("xor %eax, %eax \n\t" 31 c0"push %eax \n\t" 50"push $0x... \n\t" 68 ..."mov %esp, %ebx \n\t" 89 e3"push %eax \n\t" 50"push %ebx \n\t" 53"mov %esp, %ecx \n\t" 89 e1"mov %eax, %edx \n\t" 89 c2"mov $0xb, %al \n\t" b0 0b"int $0x80 \n\t" cd 80);..
UML 과 Diagram
UML 과 Diagram
2017.07.26UML 협업을 위해 UML을 그릴 때는 API(public 필드, 메소드)만 명시하는 버전이 있으면 좋다. 클래스의 모든 멤버를 명시하면 복잡하고, 결국 협업하는데 중요한건 내부 구현이 아니라 외부로 공개한 API이기 때문 UML Tool plant UML은 source code 작성하듯이 쓰면 된다는 장점이 있는데... 익숙하지 않으면 문법을 따로 보면서 해야해서 좀 불편할 것 같고. starUML은 쓰다보면 속터진다. UX가 엉망... 그래도 무료중에 이거만한게 없긴 함. https://www.websequencediagrams.com/ https://www.draw.io 강추!! python epydoc 사실 doc을 만들어주는 목적인데, 코드를 기반으로 UML형태의 html / pdf 보고서를 만..
UAF, Use After Free
UAF, Use After Free
2017.07.23* Integer overflow와 연계해 reference counter를 overflow시켜 0으로 만들어 강제로 ``c free()``시키는 방법으로 사용할 수도 있다. #1``c free()``된 영역을 참조하는 경우.보통 ``c free()``하면 `` fd/bk/last_size`` 부분만 초기화되고 나머지 영역은 그대로 남아있기 때문에 나머지 영역에 있는 데이터를 leak할 수 있다.이 때 ``c puts()``같은 문자열 함수를 사용해 처음부터 출력하면 `` \x00``까지만 읽어 `` fd`` 첫 바이트가 `` \x00``인 경우 아무것도 출력되지 않으므로 주의.```cint main(){ void *old_p = malloc(32); void *new_p; strcpy(old_p, "a..
[glibc] free_hook, malloc_hook
[glibc] free_hook, malloc_hook
2017.07.23```cgdb-peda$ x/4wx &__free_hook0xf7fd08b0 : 0x00000000 gdb-peda$ patch 0xf7fd08b0 one_gadget_addr```32bit `` libc.so``의 경우 다음과 같이 `` unsorted_bin``에서 `` 0x10`` 단위로 조회하면 없는 것 처럼 나오는데, 이는 `` gdb``가 맨 왼쪽에 있는 symbol만 표시해주기 때문이다.```bashgdb-peda$ x/40wx 0xf7fad7b0 - 0x600xf7fad750: 0x00000000 0x00000000 0x00000000 0x000000000xf7fad760 : 0xf7e6cfa0 0xf7e6cf40 0x00000000 0x000000000xf7fad770: 0x0000000..