Codegate 2013 bin 200 write up ...?

Posted 2013. 3. 8. 21:07

문제에 딱히 설명은 없었다.

 

파일을 받고 열어보면 실행이 제대로 되지 않을 때가 있는데 관리자 권한으로 실행시켜야 한다.

 

실행하면 드라이버 이름을 입력하라고 나온다,,

 

 

 

하지만 아무거나 입력해도 딱히 변하는 값은 없고 맨 마지막에 나오는 Message 값만 다르게 나온다.

 

 

 

그리고 중간에 보면 위와 같은 내용이 보이는데 이 값을 Base64 디코딩 하면 뭔가 나올 것 같아서 해봤는데 안됬다.

 

올리디버거로 메인부터 살펴보면

 

 

이런 부분을 발견할 수 있다.

 

이때 부터 두근두근 하면서 혹시 ????를 바뀌는 부분이 있을까,,하고 찾아봤는데 못찾겠다;;;;

 

그래서 이번에는 입력값에 따라 달라지는 Message 값을 추적해 봤다.

 

 

 

 

먼저 입력 값을 compress 해준다.

 

그 다음에 base64? 는 아니지만 뭔가 비슷한 걸로 인코딩 한 뒤에 출력한다.

 

다시 그 함수를 들어가면........ 잘 모르겠다....

 

그래서 그냥 한번 쭈~~~욱 훑어보던중

 

 

이런 부분이 있었는데 마치 Base64 에서 보던것과 뭔가 비슷해 보였다,,,

 

(아래가 Base64의 인코딩 테이블이다..)

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

 

따라서 루틴은 아래와 같다.

 

입력값 -> compress -> Base 인코딩

 

그래서 인코딩 테이블을 바꾼뒤 Base 디코딩을 한 뒤에 zlib를 사용해서 uncompress() 해주면 Key 가 나온다.

 

 

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "..\..\zlib127\zlib-1.2.7\zlib.h"

//변환할 문자열
char str[] = "8pFHHoMssjtoucpX4EdPgcrdzuKXgEFV7iNur4YzDrOdfyNOA/bp7lX=";

//Base64 테이블
char table[]="QwErTyUiOpAsDfGhJkLzXcVbNm0246813579qWeRtYuIoPaSdFgHjKlZxCvBnM+/";


int find_index(char a);      // base64 인덱스 찾아줌
void dec2bin(char *src, int a, int pos); // 10진수를 2진수로 (pos는 반환할 자리수)
int bin2dec(char *a);      // 2진수 문자열을 10진수로 반환

int main()
{
 int i, j = 0, index;
 char bin[1000] = {0,}, tmp[10];
 Bytef compressed_str[1000], uncompressed_str[1000];
 uLongf len = 1000;

 //Base64 -> bin  base 인코딩을 6자리 2진수 나열로 변환
 for(i = 0; str[i] != '\0' && str[i] != '='; i++)
 {
  index = find_index(str[i]); //base64테이블에서 index 찾아옴
  dec2bin(tmp, index, 6);  //2진수를 6글짜로 리턴
  strcat(bin, tmp); 
 }

 //bin -> char 나열된 2진수를 8자리 단위로 분리하여 변환
 for(i = 0; i < strlen(bin); i += 8)
 {
  memset(tmp,0,10);
  memcpy(tmp, bin+i, 8);
  compressed_str[j++] = bin2dec(tmp);
 }
 compressed_str[j] = '\0';

 //uncompress
 uncompress(uncompressed_str,&len, compressed_str,1000);
 
 //print
 printf("%s\n", uncompressed_str);
 return 0;
}

int find_index(char a)
{
 int i;
 for(i = 0; i < 64; i++)
 {
  if(table[i] == a)
   return i;
 }
 printf("error\n");
 exit(1);
}
void dec2bin(char *src, int a, int pos)
{
 int i, k = 1;
 
 for(i = 0; i < pos-1; i++, k*=2); 

 for(i = 0; i < pos; i++,k /= 2)
 {
  if(a & k)
   src[i] = '1';
  else
   src[i] = '0';
 }
 src[i] = '\0';
}
int bin2dec(char *a)
{
 int i, k = 1, result = 0;

 for(i = strlen(a)-1; i >= 0 ;i--, k*=2)
 {
  if(a[i] == '1')
   result += 1*k;
 }
 return result;
}

 

http://zlib.net/zlib127.zip 

 

위 링크에서 zlib를 받으면 많은 .h 파일과 .c 파일이 있을 것이다.

거기서 모든 .h 파일과 .c 파일을 프로젝트에 포함시킨 다음에 zlib.h 의 위치를 찾아서 include 시켜주면 uncompress 를 사용가능하다.

 

아래 첨부파일은 Visual Studio 2012 로 만든 프로젝트다..

 

ConsoleApplication2.7z

 

(zip은 용량이 10MB가 넘는데 7z 5MB 라니..)

 

허접한 write up ㅈㅅ

python web 읽기

Posted 2013. 3. 6. 16:46

import urllib
S = urllib.urlopen('http://127.0.0.1').read()
print S

 

 

윈도우8 로 바꾸고 나서 한국장학재단 홈페이지에서 아래와 같이 출근부를 입력할 때 아무것도 나오지 않는 현상이 생겼다....

 

몇일동안 텅텅빈 공백때문에 고생좀 했다..

 

한국장학재단에서 IE 10에 대한 호환성이 좋지 못해서이다.

 

 

언젠간 한국장학재단 홈페이지를 업데이트 하겠지만 일단 해결방안은 일시적으로 브라우저 모드를 IE 9로 바꿔주면 된다.

 

IE 에서 [도구] - [F12 개발자 도구(L)]  누르거나 F12를 눌러서 개발자 도구를 실행한다.

 

그 뒤에 [브라우저 모드]에서 Internet Explorer 9(9) 를 선택한다.

 

 

 

 

위 화면에서 Internet Explorer 9(9)를 선택하면 출근부 입력화면이 제대로 나온다

 

.

 

 

'기타' 카테고리의 다른 글

문명 5 로컬연결(LAN) 안될 때  (0) 2014.08.27
cmd 결과 복사  (0) 2013.07.09
XE ftp 오류  (0) 2012.08.13
아파치 인증 (apache2)  (1) 2012.07.06
시쿨리(sikuli) 스크린샷이 안될 때  (0) 2012.06.07

파이썬 클립보드 사용하기

Posted 2013. 1. 8. 12:24

환경: Python 2.7.3

 

import wx이나 import ctype를 이용하면 되는데 모듈을 받아야되니 귀찮으니깐 간단하게 이용하는 법을 알아봤다,,,,;

 

1. 운영체제 명령어 이용하기

 

#윈도우(비스타 이상부터)

import os

copy_string = "hello"

copy_string = "echo " + copy_string + " |clip"
os.system(copy_string) 

 *참고 : 윈도우는,,,,,복사시에 echo 명령어 자체가 엔터를 붙이는걸 해결하지 못했네요;;;

 

#리눅스(xclip 설치해야함)

import os

copy_string = "hello"

copy_string = "echo " + copy_string + " | xclip -selection clipboard"
os.system(copy_string)

 *참고 : 리눅스는 echo 명령어에 -n 옵션을 붙여서 끝에 엔터를 제거할수 있고 -e 옵션을 사용하여 여러가지 형태의 문자열들을 클립보드에 넣을수 있다.

ex>

안녕하세요.

복사테스트입니다. 

 

==> echo -ne "안녕하세요.\n복사테스트입니다."|xclip -selection clipboard

 

 

2. Tkinter 이용하기

 *참고 : Tkinter는 파이썬으로 GUI를 구성할 때 사용합니다

#윈도우

from Tkinter import Tk


r = Tk()

r.withdraw()        
r.clipboard_append('hello')
r.mainloop() 

*참고 : 이렇게 하면 응답대기상태(?)가 되는데 자동으로 꺼지는건 해결 안됬다;;;

 


 

'python > 스터디' 카테고리의 다른 글

파이썬 스터디 끝  (0) 2012.06.09
파이썬 소켓 예시  (0) 2012.06.03
파이썬 시작하기  (0) 2012.05.22
파이썬 2번째 강의  (0) 2012.05.22
파이썬을 배우기 시작하였다....  (0) 2012.05.22

 

 

메뉴에서 프로젝트에 있는 속성을 클릭한다.(또는 Alt + F7)

 

 

구성 속성의 디버깅에서 명령인수에 argv 값을 넣어주면 된다.

위에 사진은 명령어 인수를 2개를 넣은 모습이다.

이것도 명령 실행할 때의 사용법과 유사하다.

'programing > C언어' 카테고리의 다른 글

fscanf, scanf 사용하기  (0) 2012.10.27
C언어 콤마(,) 연산자?  (0) 2012.05.22

fscanf, scanf 사용하기

Posted 2012. 10. 27. 12:01

scanf 계열의 함수를 사용하다 보면 특정 문자열을 받고 싶은데 scanf 는 띄어쓰기나 탭, 엔터 모두를 분할해서 받기 때문에 이용하기가 힘든 경우가 있고 이 부분을 처리하다 보면 코드가 쓸데없이 길어지거나 하드코딩으로 가는 경우가 많다.

 

예를들어 fscanf 를 사용할때 아래와 같은 문자열을 받는다고 할때

 

김 원영(탭)남자(탭)010 1111 2222(엔터)

 

scanf("%[^\t]\t%s\t%[^\n]\n", name, sex, phone); 

이렇게 받아주면 된다.

%[^\t] 는 탭 문자가 나오기 전까지 문자열로 받는다는 뜻이고 즉 띄어쓰기든 상관없이 탭까지 끊어 받는다는 뜻이다

 

만약 fscanf 의 경우 아래와 같은 데이터 파일에서 받는다고 가정했을 시

 

김 원영(탭)남자(탭)010 1111 2222(엔터)

김 김기(탭)여자(탭)010 1111 3333(엔터)

김 뭐시기(탭)남자(탭)010 1111 4444(엔터)

 

while( EOF != fscanf("%[^\t]\t%s\t%[^\n]\n", name, sex, phone) )

{

  ~~~~~~~~~~~~~~~~~~
}

이렇게 받아주면 된다.

 

EOF != ~~~~

는 fscanf가 파일의 끝을 만나면 EOF라는 상수값을 리턴해 주는데 EOF 라는게 나올 때 까지 while 문을 돌리게 된다.

 

그리고 마지막에 \n 이 들어가는 이유는 꽤 중요한데 만약 \n을 안써주게 되면 버퍼에 계속 \n이 남아있게 되어서 다음 받을때 영향을 주기 때문이다.

물론 \t 도 마찬가지

리눅스 웹 한글깨짐

Posted 2012. 8. 16. 11:31

리눅스로 웹 페이지를 구성할 때 한글이 깨져 나오곤 한다.

그 이유는 언어 인코딩 문제인데 리눅스는 보통 UTF-8 을 사용하는데 우리가 윈도우에서 사용하는 언어는 EUC-KR 인코딩셋으로 되어있다.

 

따라서 브라우저에서 인코딩을 UTF-8 로 설정해주면 잘 보인다.(웹페이지에서 우클릭후 인코딩->UTF-8)

 

자동으로 이 설정을 바꿔주기 위해서는 html 태그로 다음과 같이 해주면 된다.

 

<META HTTP-EQUIV="content-type" CONTENT="text/html; CHARSET=utf-8">

 

만약 저렇게 써주는게 귀찮을 경우 리눅스에서 아에 처음부터 EUC-KR 로 인코딩을 해주면 되는데,,, 이건 좀더 찾아봐야 겠다.

XE ftp 오류

Posted 2012. 8. 13. 12:15

XE 에서 업데이트 할때 쉬운 설치를 하는데 아래와 같은 오류가 날 때가 있다.

 

msg_ftp_upload_failed

 

여러가지 이유가 있지만 나한테 발생한 이유는 root 의 ftp 계정으로 했는데 root 폴더에서 상위폴더로 벗어나지 못해서 그랬다.

 

보안상으로 상위 폴더를 넘어가는 것을 막아 놓은 것이다. 


예를들어 create32 계정을 /home/create32 폴더로 ftp 를 한정 시켜 놓으면 그 폴더의 상위로는 갈 수 없다.


따라서 ftp 설정 파일에서 상위폴더 이동 제한을 풀어줘야 한다.

 

그런데 ftp 라고 해서 다 같은 ftp 는 아니고 ftp 도 종류가 또 있는데

proftp

vsftp

wu-ftp

등등..

각각 다 설정 파일의 이름은 다르니;;;

ex) vsftp - vsftpd.conf

 

locate 명령어가 다 있는건지는 모르겠으나 나는 locate *ftp*.conf 로 파일을 찾았다.


각자 찾아서 설정을 바꿔야 한다. 


chroot_local_user=YES

 

이 부분을 NO 로 바꿔주고 재시작을 해준다.

 

service vsftpd restart

 

다음으로 XE 관리 페이지에서 [ftp 설정]에서 위치를 다시 잡아주면 끝난다.

 

그리고 보안상 다시 YES 로 해주는게 좋겠다;;;

 

아니면 chroot_list_enable=YES 이 설정으로 해당 user 를 제한시켜 놓는 것도 방법도 있다고 한다.

 

나도 잘 모르니 패쓰 .

 

 

 

아파치 인증 (apache2)

Posted 2012. 7. 6. 14:06

권한 제한을 걸 폴더에 .htaccess 파일을 만들어 놔야되는데 아파치에서 .htaccess 파일을 인식하게 하기 위해서는

아래와 같은 작업이 필요하다.

 

vi /etc/apache2/sites-available/default

 

 

 

저부분을 None 에서 All 로 바꿔준다.

 

그리고 .htaccess 파일을 만들어준다. 먼저 권한인증을 할 폴더에 파일을 만든다.

 

ex)

vi  /var/www/secret/.htaccess

 

내용은 아래와 같이 해준다. (수정할 부분은 수정해도 된다.)

 

AuthUserFile /권할설정할폴더/.htpasswd

AuthGroupFile /dev/null
AuthName "인증창에 뜨는 말"
AuthType Basic

<Limit GET POST OPTIONS>
require valid-user
</Limit>

 

ex)

AuthUserFile /var/www/secret/.htpasswd
AuthGroupFile /dev/null
AuthName "Please enter your ID and password"
AuthType Basic

<Limit GET POST OPTIONS>
require valid-user
</Limit>

 

다음으로 .htpasswd 파일을 만들어야 한다.

 

htpasswd -c /경로/.htpasswd 계정이름

ex)

htpasswd -c ./.htpasswd admin

 

-c 를 붙이는 이유는 새로 만들기 할때 붙인다.

-c 를 안붙이면 새로 안만들고 기존에 있는 파일에 붙여넣기 된다.

 

그리고 apache2 재시작을 해준다.

service apache2 restart

 

여기서 [ OK ] 가 떴다고 다 된게 아니다.

 

 

* Restarting web server apache2                                                               

apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
 ... waiting apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName

 

 

혹시 이런 비슷한 에러가 난다면

vi /etc/apache2/httpd.conf 파일에 아래 내용을 추가해 준다.

추가할 내용:

ServerName localhost

 

그리고 재시작을 해준다.

service apache2 restart

 

 

 

 

 

 

 

 

'기타' 카테고리의 다른 글

cmd 결과 복사  (0) 2013.07.09
Windows 8 (Internet Explorer 10) 한국장학재단 출근부 입력 안될 때  (8) 2013.02.27
XE ftp 오류  (0) 2012.08.13
시쿨리(sikuli) 스크린샷이 안될 때  (0) 2012.06.07
IP 자동으로 바꿔주기  (0) 2012.05.25

webhack.wk.to [level 12]

Posted 2012. 6. 21. 03:14





ID 와 PW 를 입력하는 로그인 창이 있고 admin 을 얻어야 되는데 매직쿼터도 off 다.


매우 기본기본기본기본적인 SQL 인젝션인듯 하다.


일단 있는 그대로 보내보면 


이렇게 뜬다.


그러면 SQL 문을 추측을 해보자.


select * from where id = '$id';

select * from where pw = '$pw';


이렇게 둘로 나눠지거나


select * from where id='$id' and pw='$pw'


한줄로 입력이거나 아님 더 복잡하거나. 


일단 간단하게 두번째 경우로 보자


한줄이므로 id 만 검사하고 뒤는 주석처리를 하면 PW는 신경안써도 된다.





어이쿠 # 이 필터링이 되어있다.. 그럼 -- 으로 해본다.


-- 을 쓸 때 꼭 생각해야 할 것이 있는데 -- 뒤에 띄어쓰기가 꼭 들어가야 된다.




select * from id='admin' -- pw='guest'


이런 SQL 문이 됐을 것이다.



« PREV : 1 : 2 : 3 : 4 : 5 : NEXT »