anch0vy

home notice taglog localog guestbook write admin

  •  

Search Results for '전체보기'

55 POSTS

  1. 2014.07.03 [plaid 2014] paris 1 (5)
  2. 2014.06.23 만시간의 법칙 사이트(목표 시간 관리 사이트)를 만들어봤습니다 (2)
  3. 2014.06.03 crc 알고리즘과 취약점 (11)
  4. 2014.05.14 광고를 단지 3일만에 없앴습니다
  5. 2014.04.20 페이스북 페이지 광고,추천 제거 크롬 확장 프로그램
  6. 2014.04.14 2014 plaidctf hudak write up
  7. 2014.04.06 드디어 ROP 성공했다 ㅠㅠ
  8. 2014.04.05 LeaveRet 멤버 모집 안내
  9. 2014.03.14 크롬 유저 데이터 추출.py
  10. 2014.02.27 페이스북 동영상 다운로더.py

[plaid 2014] paris 1

Posted 2014.07.03 20:47, Filed under: 리버싱 문제 풀이

이 문제가 가상화 문제라는것만 파악하면 난이도가 확 내려가는 문제이다

하지만 그래도 어려웠다 ㅠ

==



메인함수이다

except 함수를 호출해서 esi값이 0xdeadbeef 이면 정답이다



except 함수에선 예외처리 핸들러를 등록하고 예외를 발생시킨 후, edi를 0x1111 뺀다

여기서 sub edi,0x1111을 기억해두자


예외핸들러선 함수 리스트에서 함수 하나 꺼내와서 호출하는게 전부이다

함수 리스트에는 총 20개의 함수가 있는데 대부분 기본적으로 이런 형태를 가지고 있었다

.text:0040225F AND             proc near               ; DATA XREF: .text:0040222Eo
.text:0040225F
.text:0040225F context         = dword ptr  0Ch
.text:0040225F
.text:0040225F                 call    two_byte_opcode
.text:00402264                 add     ebx, 9Ch
.text:0040226A                 add     ebx, [esp+context]
.text:0040226E                 movzx   ebx, word ptr [ebx]
.text:00402271                 add     ecx, 9Ch
.text:00402277                 add     ecx, [esp+context]
.text:0040227B                 movzx   edx, word ptr [ecx]
.text:0040227E                 and     ebx, edx
.text:00402280                 mov     [ecx], bx
.text:00402283                 sub     eax, 9Bh
.text:00402288                 setz    al
.text:0040228B                 jmp     restore_if
.text:0040228B AND             endp


two_byte_opcode 에서는 opcode를 해석하고 backup_all 함수를 불러서 현재 레지스터를 포함한 가상화에서 쓰이는 모든 값을 백업한다


[백업과 복구하는 함수]

여기서 중요한건 context이다

예외 핸들러 함수의 원형은 다음과 같다고 한다

EXCEPTION_DISPOSITION __cdecl _except_handler (
struct _EXCEPTION_RECORD *ExceptionRecord,
void * EstablisherFrame,
struct _CONTEXT *ContextRecord,
void * DispatcherContext
);

그렇기에 [esp+0xc] 는 ContextRecord 가 되며 이걸 알아보는게 문제풀이에 중요한 포인트가 되겠다

void __usercall AND(int a1<ebx>, int a2, int a3, void *a4)
{
  int v4; // eax@1
  int v5; // ecx@1

  v4 = two_byte_opcode();
  *(_WORD *)((char *)a4 + v5 + 156) &= *(_WORD *)((char *)a4 + a1 + 156);
  restore_if(v4 == 155, a2, a3, a4);
}

대충 이런식으로 디컴파일이 되는데 여기서  a4가 CONTEXT가 되는데 CONTEXT 구조체를 잠깐 보자면

....

0000009C _Edi            dd ?
000000A0 _Esi            dd ?
000000A4 _Ebx            dd ?
000000A8 _Edx            dd ?
000000AC _Ecx            dd ?
000000B0 _Eax            dd ?
000000B4 _Ebp            dd ?
000000B8 _Eip            dd ?

....

와 같다

정리하면 다음과 같이 된다

156 이 0x9c, 즉 이 프로그램은 EDI 부터 몇개의 레지스터를 가상화속 레지스터로 활용한다는 뜻이다

1. 현재 opcode를 해석하고 현재 레지스터, 메모리 등 여러 값들을 백업을 해둔다. 참고로 opcode의 길이는 1,2,3 바이트 3종류가 있고 그에따라 처리하는 함수도 다르지만 거의 비슷비슷하다. 그리고 그 함수들 내부엔 backup_all 이란 함수가 있다 그리고 이 함수는 eax에 해석한 opcode의 값, ebx,ecx 에 인자를 넣는다

2. opcode와 관계없이 명령어를 무조건 실행한다

3. 만약 첫번째 함수에서 해석한 opcode값과 와 현재 opcode 의 값이 다르면 맨처음 백업 해두었던 값들을 복구한다(결과적으로 영향 없음)

참고로 여기서 해석한 opcode값과 현재 opcode값이 뭐냐면 이 프로그램의 가상화된 명령어들은 암호화 되어 있는데 그걸 첫번째 해석하는 프로그램에서 복호화를 한다

이게 해석한 opcode이고,

sub     eax, 9Bh

이부분의 0x9b가 현재 opcode값이 된다


그럼 이제  옵코드를 해석하는 부분을 보자

옵코드를 해석하는 함수는 3개의 함수가 있는데(1~3byte) 공통적으로 시작부분에 backup_all 을 호출해서 모든 값을 백업한다

그리고 eax,ebx,ecx에 간단한 and 연산과 shift 연산을 한 결과값을 넣는다

1byte

-eax 해석한 opcode 값

-ebx 인자 1, 0~14의 짝수 값을 가짐, 보통 레지스터 r0~r7 을 뜻함


2byte

-eax 해석한 opcode 값

-ebx 인자 1, 0~14의 짝수 값을 가짐, 보통 레지스터 r0~r7 을 뜻함

-ecx 인자 2, 0~14의 짝수 값을 가짐, 보통 레지스터 r0~r7 을 뜻함


3byte

-eax 해석한 opcode 값

-ebx 인자 1, 0~14의 짝수 값을 가짐, 보통 레지스터 r0~r7 을 뜻함

-ecx 인자 2, 2바이트크기의 값을 가짐, 보통 정수를 뜻함


그러니까 

.text:00402264                 add     ebx, 9Ch
.text:0040226A                 add     ebx, [esp+context]
.text:0040226E                 movzx   ebx, word ptr [ebx]

이와 같은 명령어는, 처음 ebx에는 가상화 속 레지스터 오프셋이 들어가 있고 마지막 movzx 를 실행하면 그 레지스터의 값이 ebx로 들어가게 되는 것이다

그리고 이때 레지스터 오프셋이 0~14인데 케스팅이 word 단위인것과 짝수값을 가지는걸 보면 가상화에서 쓰이는 레지스터 크기는 2바이트인걸 알 수 있다

그럼 레지스터 배치가 다음과 같이 된다

_Edi = [r0,r1]

_Esi = [r2,r3]

_Ebx = [r4,r5]

_Ecx = [r6,r7]

이제 함수 리스트 20개가 뭘 하는지만 알아내면 되는데 이는 지금까지 지식을 바탕으로 한다면 별 어려움이 없을것이니 넘어간다


다만 1개 특이한 명령어가 있다

함수리스트중 마지막에서 2번째에 있는 함수 인데 내용은 다음과 같다


xor_table 에서 인자1을 오프셋으로 값 하나를 가져와 어떤 테이블을 xor한다

기억해두자


내가 분석한 함수 리스트의 이름은 다음과 같다

.text:0040220E func_list       dd offset NOP           ; DATA XREF: jump_func+7o
.text:00402212                 dd offset MOV_REG2REG
.text:00402216                 dd offset MOV_REG2MEM
.text:0040221A                 dd offset ???
.text:0040221E                 dd offset MOV_INT2REG
.text:00402222                 dd offset ADD
.text:00402226                 dd offset SUB
.text:0040222A                 dd offset XOR
.text:0040222E                 dd offset AND
.text:00402232                 dd offset SHR8
.text:00402236                 dd offset NOT
.text:0040223A                 dd offset INC
.text:0040223E                 dd offset CMP
.text:00402242                 dd offset JMP_2_1_
.text:00402246                 dd offset JMP_IF_FLAG
.text:0040224A                 dd offset PUSH
.text:0040224E                 dd offset POP
.text:00402252                 dd offset XCHG_1byte_2byte
.text:00402256                 dd offset WTF
.text:0040225A                 dd offset FUNC_END

중간에 ???은 파이썬 코드로 말하면

r?=input[rx:rx+2:-1] 쯤 되겠다 (?와 x에는 0~7이 들어간다. 즉 레지스터이다, input은 우리가 입력한 값이 들어가 있는 곳)

쩃든 그러면 이제 디스어셈블러를 짜서 디스어셈블을 해보자

코드는 여기에 올려놓았다

https://www.dropbox.com/s/mr2yjgnw8a9x02q/paris_vm_disas_new.py

결과를 살짝 보기 좋게 해봤다

0x0 NOP
0x1 NOP
0x2 NOP
0x3 MOV_INT2REG r2,0x3133
0x6 MOV_INT2REG r3,0x0
0x9 MOV_INT2REG r4,0xff00
0xc MOV_INT2REG r5,0xff

    0xf r0=input[r3:r3+2][::-1]
    //r0 = r0 - 0x3332
    0x11 MOV_REG2REG r7,r0
    0x13 XCHG_1byte_2byte r7
    0x14 NOT r7
    0x15 CMP r7,r2
    0x17 JMP_IF_FLAG r7,0x37
    0x1a MOV_REG2REG r6,r7
    0x1c AND r6,r4
    0x1e AND r7,r5
    0x20 SHR8 r6
    0x21 XOR r7,r6
    0x23 MOV_INT2REG r6,0x200
    0x26 ADD r7,r7
    0x28 ADD r6,r7
    0x2a r7=input[r6:r6+2][::-1]
    0x2c XCHG_1byte_2byte r7
    0x2d POP r6
    0x2e XOR r7,r6
    0x30 PUSH r6
    0x31 PUSH r7
    0x32 WTF r3
    0x33 INC r3
    0x34 JMP_2_1_ r7,0xf

0x37 XOR r7,r7
0x39 MOV_INT2REG r2,0x100
0x3c MOV_INT2REG r6,0xaf21

    0x3f r5=input[r2:r2+2][::-1]
    0x41 XCHG_1byte_2byte r5
    0x42 INC r2
    0x43 INC r2
    0x44 POP r3
    0x45 CMP r5,r6
    0x47 JMP_IF_FLAG r7,0x56
    0x4a CMP r5,r3
    0x4c JMP_IF_FLAG r7,0x3f
    0x4f MOV_INT2REG r3,0x0
    0x52 MOV_INT2REG r2,0x0
    0x55 FUNC_END r7

0x56 MOV_INT2REG r5,0x5a4d
0x59 CMP r3,r5
0x5b JMP_IF_FLAG r7,0x65
0x5e MOV_INT2REG r3,0x0
0x61 MOV_INT2REG r2,0x0
0x64 FUNC_END r7

0x65 MOV_INT2REG r3,0xdead
0x68 MOV_INT2REG r2,0xbeef
0x6b FUNC_END r7

중간에 빨간 부분이 눈에 들어올텐데 저부분에 숨겨진 명령이 있어서 그렇다

맨 처음 예외를 일으키는 부분에서 sub edi,0x1111 이 나왔는데 이는 가상화 속 레지스터에도 영향을 끼친다(r0,r1)

그리고 전체 디스어셈블 결과를 보면 알겠지만 저부분이 유일하게 그 영향을 받는 부분이다

하나 명령어를 체크할때마다 0x1111이 줄어들고, r0 크기가 2바이트, edi의 하위 2바이트인걸 감안하면 

    0xf r0=input[r3:r3+2][::-1]
    0x11 MOV_REG2REG r7,r0

사이에서 r0=r0-(18*0x1111)&0xffff 가 있다는걸 알 수 있다

18인 이유는 저 input 어쩌구 명령어부터 MOV_REG2REG 까지 18번의 sub edi,0x1111을 거쳐가서 그렇다


그리고 이걸 파이썬틱한 형태로 옮겨보았다


몇개 값들을 설명하자면

dontknow_table은 [input+0x200] 에, dontknow_table2는 [input+0x100] 에 있던 문자열이다.

위 내용을 해석하면... 은 레포트를 써야하는 관계로 내일 나눠서 올린다

저작자표시비영리동일조건

'리버싱 문제 풀이' 카테고리의 다른 글

[plaid 2014] paris 1  (5) 2014.07.03
2014 plaidctf hudak write up  (0) 2014.04.14
[코드게이트 2012] bin 300  (0) 2014.02.17
[코드게이트 2011] bin 200  (0) 2014.02.15
[코드게이트 2012] Bin 100  (0) 2014.02.15
[YISF Pre Qual 2013] bin300  (0) 2014.02.12
Response : 0 Trackbacks , 5 Comments

Trackback URL :

  1. # 2014.07.03 22:43 Delete Reply

    비밀댓글입니다

    1. Re: # anch0vy 2014.07.04 16:55 신고 Delete

      아래 댓글로 달았습니다

  2. # anch0vy 2014.07.04 16:55 신고 Delete Reply

    여기서 가상화란건 다음에서 쓰인 코드가상화를 뜻해요

    제가 설명을 하는것보단 이게 나은것 같아서 링크로 대체합니다
    http://ezbeat.tistory.com/361
    http://ezbeat.tistory.com/338

  3. # Seonunghardt_ 2014.07.06 20:01 신고 Delete Reply

    감사합니다~

  4. # 1465977699 2016.06.15 17:01 신고 Delete Reply

    잘 읽고 가여~

Leave a comment

만시간의 법칙 사이트(목표 시간 관리 사이트)를 만들어봤습니다

Posted 2014.06.23 08:03, Filed under: 컴퓨터_etc

주소: http://me.ctfagain.kr/goal/time.html

모습




추천사용자
-나는 연말까지 xxx를 yyy 시간 할거다!
-근데 매일 하는 시간이 불규칙하다

사용법
-자기만의 code를 정하고 사용한다(code만 알면 그 계정에 들어갈수 있으니 쉬운 code는 피해주세요, 숫자+알파벳 대소문자 가능)
-시작일,종료일,목표시간,목표 를 저장한다
-그 목표를 하기 시작할때 시작을 누르고, 끝나면 멈추기를 누른다

+웹 브라우져 꺼도 시간은 계속 가니까 꺼도 되요
+하루 평균 해야 할 시간은 지금까지 한 시간에 따라서 계속 바뀝니다!

어차피 개인용으로 만든거라 많은 이용은 바라지 않지만 잘 쓰시는 분이 있었으면 좋겠네요

저작자표시비영리동일조건

'컴퓨터_etc' 카테고리의 다른 글

만시간의 법칙 사이트(목표 시간 관리 사이트)를 만들어봤습니다  (2) 2014.06.23
crc 알고리즘과 취약점  (11) 2014.06.03
페이스북 페이지 광고,추천 제거 크롬 확장 프로그램  (0) 2014.04.20
LeaveRet 멤버 모집 안내  (0) 2014.04.05
크롬 유저 데이터 추출.py  (0) 2014.03.14
페이스북 동영상 다운로더.py  (0) 2014.02.27
Response : 0 Trackbacks , 2 Comments

Trackback URL :

  1. # partrita 2014.08.12 21:32 신고 Delete Reply

    감사합니다:)

  2. # DomingoPlag 2014.10.19 08:10 Delete Reply

    이용약관위배로 관리자 삭제된 댓글입니다.

Leave a comment

crc 알고리즘과 취약점

Posted 2014.06.03 22:23, Filed under: 컴퓨터_etc

이번 시큐인사이드에 crc관련 문제가 정말 많이 나왔다(명존쎄)

그래서 한번 crc에 대해 간단하게 글을 써봤다

==

crc는 체크썸 함수의 한 종류로, 원래는 1bit씩 계산하는 함수이다.

그리고 보통은 그 속도를 올리기 위해 256개의 테이블을 만들어서 한번에 8bit(=1byte) 씩 계산하는 방법을 쓰게 된다.

이 글에서 난 테이블 생성 부분은 통채로 페스하고 crc 계산법에 대해서만 다룬다

crc코드는 다음과 같다


def crc(c,crc_):
    index=(crc_^c)&0xff
    crc_=crc_>>8
    crc_=crc_^table[index]
    return crc_


입력값으로 1바이트의 문자열과 이전 crc 결과값을 받아오고, crc 값을 리턴한다

table 은 어떤 초기값에 의해 미리 계산된 256개의 값들이다

여기서 연산을 잘 보면 리턴하는 crc값의 가장 높은 바이트 부분은 테이블 값이 그대로 남아있다는걸 알 수 있다

이해가 안되는 분들을 위하여 좀 설명하면

crc_=crc_>>8 하면 최상위 바이트 부분이 0 이 되버린다

이때 table[index] 와 xor해버리면 최상위 바이트 부분은 0 xor table의 최상위바이트 가 되므로 table의 값이 그대로 남아있게 되는것이다


이걸 이용해서 다음과 같은 코드로 역연산이 가능하다


def find_index(crc):
    return untable.index(crc>>56)

def uncrc(c,crc_):
    t=find_index(crc_)
    crc_^=table[t]
    crc_=(crc_<<8)&0xffffffffffffffff
    crc_=crc_+(t^c)
    return crc_

(참고로 untable은 table의 값들을 >> 56 한 값들을 저장한 테이블이다)

여기서 필요한 조건은 crc계산을 한 문자열을 알아야 하고, crc 값을 알아야 한다

어떤 문자열을 crc한 값을 알고 있고, 마지막 문자가 뭔지 알고 있어야 한다는 뜻이다


이를 이용하면 할수 있는건 crc값의 조작 및 salt 값 우회 등이 있다

예를들자면,

[내가 모르는 salt]anch0vy 의 crc값이 0xabcd1234 라고 하자

그럼 우린 crc한 값과  마지막 문자가 뭔지 알고 있으니까 [내가 모르는 salt]anch0v 의 crc값을 찾아낼 수 있다

이걸 반복해서 [내가 모르는 salt] 의 crc 값을 구한다

그리고 자신이 원하는 문자열을 이용해서 다시 crc를 해주면 crc값의 조작이 완료된다([내가 모르는 salt]admin 이라든가)

실제 시큐인사이드에서 다음과 같은 코드로 문제를 풀었었다


#hash(crc32,'salt|1401591408|ADMIN') = ?? salt는 모르는 값 #hash(crc32,'salt|1401591408|junoim') = 8144347f un=0x8144347f for x in 'mionuj': un=uncrc(ord(x),un) print "hash(crc32,'salt|1401591408|junoim')=",hex(un) for x in 'ADMIN': un=crc(ord(x),un) print print "hash(crc32,'salt|1401591408|ADMIN')=",hex(un)

그리고 하나더, 어떤 문자열에서 우리가 몇바이트를 자유롭게 조작할 수 있다면 그 문자열의 crc값을 마음대로 바꿀 수 있다

특히 우리가 조작할 수 있는 부분이 연속적으로 있다면, 더더욱 쉽게 할 수 있다

예) abcd1234efgh5678 의 crc32 값을 0x00112233 으로 만들고 싶다고 하면 이중에서 1234 부분만 조작해서 만들어 줄 수 있다

이게 가능한 이유는 crc의 역연산이 가능한 이유와 같다

crc 값의 최상위비트는 테이블의 값이 그대로 남아있고, 테이블의 값은 이전 crc 값과 문자열의 xor 결과값으로 결정되는데, 이말은 다시 말해서 crc값의 최상위 바이트를 우리 마음대로 조작할 수 있다는 것이다

아래는, 어떤분이 리버싱케알 crc1번 문제를 풀면서 남긴 노트중 일부이다


stream = 0x[??]  i-1 = 0x70      crc = 0x4CE6B97F65C99119  
stream = 0x6D i-1 = 0x6F      crc = 0x03BCFC164528BD[??] 
stream = 0x68    i-1 = 0x6E      crc = 0x994d481276a1[??]67
stream = 0x74    i-1 = 0x6D      crc = 0x87431491b8[??]2e1c
stream = 0x69    i-1 = 0x6C      crc = 0x7d2f7660[??]8ad9c1
stream = 0x72    i-1 = 0x6B      crc = 0xb4d758[??]b9bf8879
stream = 0x6F    i-1 = 0x6A      crc = 0x20ae[??]3f0be172e2
stream = 0x67    i-1 = 0x69      crc = 0x97[??]421c9b164a26
stream = 0x6C    i-1 = 0x68      crc = 0x[??]e5925d865bb8b4

역연산 하는 과정인데, 잘 보면 문자열의 0x70 위치의 문자열을 모른는데도 다음 crc값이 구해진다(물론 1바이트 부분이 정확하지 않지만)

그리고 저기 있는 [??] 부분은 맨 첫줄의 [??]에 의해 바뀐다 -> 마음대로 조작이 가능하다

만약 저기서 2바이트를 모르는 부분이라 가정하면 다음과 같이 나타낼 수 있다


stream = 0x[??]  i-1 = 0x70      crc = 0x4CE6B97F65C99119  
stream = 0x[?!] i-1 = 0x6F      crc = 0x03BCFC164528BD[??] 
stream = 0x68    i-1 = 0x6E      crc = 0x994d481276a1[??][?!]
stream = 0x74    i-1 = 0x6D      crc = 0x87431491b8[??][?!]1c
stream = 0x69    i-1 = 0x6C      crc = 0x7d2f7660[??][?!]d9c1
stream = 0x72    i-1 = 0x6B      crc = 0xb4d758[??][?!]bf8879
stream = 0x6F    i-1 = 0x6A      crc = 0x20ae[??][?!]0be172e2
stream = 0x67    i-1 = 0x69      crc = 0x97[??][?!]1c9b164a26
stream = 0x6C    i-1 = 0x68      crc = 0x[??][?!]925d865bb8b4

이때 역시 첫번째 줄의 [??] 와 두번째 줄의 [?!] 값에 의해 crc의 특정 부분을 마음대로 컨트롤 가능하다
이런식으로 crc의 크기만큼, 즉 crc32는 4바이트, crc64는 8바이트가 컨트롤이 가능하면 우리가 마음대로 crc값을 조작할 수 있는것이다

참고로 꼭 조작할수 있는 부분이 떨어져 있는경우 문제가 좀 어려워진다(reversing.kr 의 crc1 문제처럼)
crc64바이트의 1바이트 조작할 경우 위 [??] 처럼 8번 역연산 할때까지 조작하지 않은 부분의 값이 남아있다(조작하지 않은 부분이라는건 조작한 1바이트가 0x00~0xff 어떤값이 되어도 변하지 않는 부분을 뜻한다)
하지만 8번이 넘어서 9번이 되면 table 에서 가져오는 값이 아예 달라지기 때문에 그 이후로는 crc값이 어떻게 변하는지 계산하는게 쉽지 않다

그렇기에 crc조작할때 조작할수 있는 부분끼리 많이 떨어져 있으면(crc64 는 8바이트, crc32 는 4바이트 이상) 조작은 가능하나 브루트 포싱이 필요하게 된다. 그것도 엄청난 시간의...
다만 다른 브루트 포싱보다는 시간이 조금 덜 드는데 그 이유는 역연산이 가능해서이다. (이부분은 리버싱케알 crc1문제 풀이와 매우 밀접하니 궁금하면 비밀댓글로 물어봐주시길)

참고로 조작할수 있는 값이 중간에 있다면 역연산을 이용하면 된다

abcd????efgh 의 crc값을 0x11223344 로 만들려면(?는 조작가능 부분) abcd???? 의 crc결과를 역연산을 통해서 구하고 위에서 말한 방법을 이용해서 ???? 부분을 결정해주면 된다


====

7.3 내용 약간 추가

저작자표시비영리동일조건

'컴퓨터_etc' 카테고리의 다른 글

만시간의 법칙 사이트(목표 시간 관리 사이트)를 만들어봤습니다  (2) 2014.06.23
crc 알고리즘과 취약점  (11) 2014.06.03
페이스북 페이지 광고,추천 제거 크롬 확장 프로그램  (0) 2014.04.20
LeaveRet 멤버 모집 안내  (0) 2014.04.05
크롬 유저 데이터 추출.py  (0) 2014.03.14
페이스북 동영상 다운로더.py  (0) 2014.02.27
Response : 0 Trackbacks , 11 Comments

Trackback URL :

  1. # xeros 2014.06.05 11:01 신고 Delete Reply

    오 감사합니다 ㅎ

  2. # levs 2014.06.05 11:27 신고 Delete Reply

    테이블 생성에 관한 좋은 자료나 문서 있으면 알려주시면 감사하겠습니다

  3. # 2014.07.10 18:00 Delete Reply

    비밀댓글입니다

    1. Re: # anch0vy 2014.07.21 12:19 신고 Delete

      브루트포싱 문제가 맞습니다
      어떻게 하면 브루트포싱 수를 낮출수 있는지에 중점을 두고 생각해보세요

  4. # 2014.07.21 12:34 Delete Reply

    비밀댓글입니다

    1. Re: # anch0vy 2014.07.22 18:16 신고 Delete

      저도 그방법으로 풀었습니다
      다만 말하신대로 그렇게 해도 오래 걸리기에..
      힌트를 드려보자면 소팅을 해보세요
      그리고 해시를 문자가 아니라 숫자로 생각해보세요 00 00 00 00 은 0 이런식으로요
      그러면 비교 횟수가 정말 획기적으로 줄어듭니다

  5. # 2014.08.28 10:58 Delete Reply

    비밀댓글입니다

  6. # 2014.12.09 16:31 Delete Reply

    비밀댓글입니다

  7. # 2015.06.01 10:00 Delete Reply

    비밀댓글입니다

  8. # Qusenn 2015.08.21 11:38 신고 Delete Reply

    대단하시네요.. 이런 것들을 정확하게 이해하고 문제를 해결할 수 있으려면
    쌓아야 하는 기초가 어떤 어떤 것들이 있을까요?

  9. # 2016.01.26 17:39 Delete Reply

    비밀댓글입니다

Leave a comment

광고를 단지 3일만에 없앴습니다

Posted 2014.05.14 02:23, Filed under: 일상사

돈도 거의 안들어오고


보기도 싫고


게다가 내가 보면 아래처럼 보임



아무래도 일본에 있어서 그런지 위치기반 광고의 경우는 항상 일본어로 된 일본게임광고가 뜨는것 같다


쨋든 내림

저작자표시비영리동일조건

'일상사' 카테고리의 다른 글

광고를 단지 3일만에 없앴습니다  (0) 2014.05.14
Response : 0 Trackbacks , 0 Comments

Trackback URL :

Leave a comment

페이스북 페이지 광고,추천 제거 크롬 확장 프로그램

Posted 2014.04.20 14:37, Filed under: 컴퓨터_etc

가끔 친구가 좋아요 또는 댓글을 다는 바람에 이상한 내용의 페이지가 타임라인에 올라오곤 합니다


그런 내용을 삭제해주는 크롬 확장 프로그램입니다.


자신은 이미 충분히 구독하는 페이지를 가지고 있다, 더이상 구독할 페이지는 없다 하시는분에겐 강력 추천!


광고제거는 덤!






(위 사진 보면 다른사람이 좋아요 눌러서 뜬 페이지를 삭제함)


유의할점

-이 확장프로그램이 활성화 되어 있을때는 페이지의 좋아요를 못누릅니다! (그러려고 만든거지만요)

-개인이 개인의 게시물을 누른경우는 삭제를 안합니다


no_facebook_page.zip


사용법

1. 적당한 곳에 압축을 푼다

2. 크롬-설정-좌측 확장프로그램 클릭

3. 개발자 모드에 체크



4. 압축해제된 확장 프로그램 로드 선택



5. 아까 압축 푼 폴더 선택후 확인하면 끝



설정 해제,삭제법



-아까 연 확장프로그램 창에서 빨간색 부분을 찾아서 체크해제하면 임시 사용 해제, 쓰레기통을 클릭하면 삭제됩니다



버튼이 걸리적 거릴떈



-버튼숨기기를 선택하면 된다



[+]이야기


프로그램의 핵심은 facebook_block.js 파일로, 자바스크립트를 조금이라도 공부했던 사람이라면 바로 이해가 될 것이다(핵심부분은 3줄밖에 안됨 ㅋㅋ)


만들게 된 계기는 이번 세월호 사건으로 각종 페이지들이 좋아요를 얻으려고 검증이 안된 자극적인 내용을 올리는걸 보고 짜증나서 만들게 되었다


사실 그 전부터 가끔 친구들이 좋아요 누르는 무서운게 갑툭튀하는 영상이나 혐오영상이 나오는게 맘에 들지 않았었다


이번기회에 만들어서 잘 써먹게 될듯


혹시 프로그램을 개선해주신 분이 있다면 댓글 달아주세요 홍보해드립니다


[+]

고인의 명복을 빕니다..

저작자표시비영리동일조건

'컴퓨터_etc' 카테고리의 다른 글

만시간의 법칙 사이트(목표 시간 관리 사이트)를 만들어봤습니다  (2) 2014.06.23
crc 알고리즘과 취약점  (11) 2014.06.03
페이스북 페이지 광고,추천 제거 크롬 확장 프로그램  (0) 2014.04.20
LeaveRet 멤버 모집 안내  (0) 2014.04.05
크롬 유저 데이터 추출.py  (0) 2014.03.14
페이스북 동영상 다운로더.py  (0) 2014.02.27
Response : 0 Trackbacks , 0 Comments

Trackback URL :

Leave a comment

2014 plaidctf hudak write up

Posted 2014.04.14 17:00, Filed under: 리버싱 문제 풀이

블로그 유입을 위해서 제목을 영어로 지었다 ㅋ

알고리즘 공부와 IQ의 중요성을 느낀 문제인것 같다

잡담은 여기까지


===== write up =======


문제의 전체적인 형태는 다음과 같다




입력한 값을 읽고 맨 마지막에 0xff 를 붙이고 나서 길이가 30인지 체크를 한다


-> len(flag)==29


그다음 malloc 을 꽤 많이 호출하면서 힙을 할당받은 후 문자열을 채워넣는다


이게 어디서 일어나냐면 sub_8048A70 함수에서 일어나게 된다




func1 은 뭘 하는지 기억이 안난다

func2 는 할당된 힙을 채운다

그런데 좀 특이하게 채우는데 다음과 같이 채우게 된다

ex) input: abcdefghijklmnopqrstuvwxyz123

result: // * == 0xff

list[0] abcdefghijklmnopqrstuvwxyz123*

list[1] bcdefghijklmnopqrstuvwxyz123*a

list[2] cdefghijklmnopqrstuvwxyz123*ab

list[3] defghijklmnopqrstuvwxyz123*abc

list[4] efghijklmnopqrstuvwxyz123*abcd

list[5] fghijklmnopqrstuvwxyz123*abcde

list[6] ghijklmnopqrstuvwxyz123*abcdef

list[7] hijklmnopqrstuvwxyz123*abcdefg

list[8] ijklmnopqrstuvwxyz123*abcdefgh

list[9] jklmnopqrstuvwxyz123*abcdefghi

list[10] klmnopqrstuvwxyz123*abcdefghij

list[11] lmnopqrstuvwxyz123*abcdefghijk

list[12] mnopqrstuvwxyz123*abcdefghijkl

list[13] nopqrstuvwxyz123*abcdefghijklm

list[14] opqrstuvwxyz123*abcdefghijklmn

list[15] pqrstuvwxyz123*abcdefghijklmno

list[16] qrstuvwxyz123*abcdefghijklmnop

list[17] rstuvwxyz123*abcdefghijklmnopq

list[18] stuvwxyz123*abcdefghijklmnopqr

list[19] tuvwxyz123*abcdefghijklmnopqrs

list[20] uvwxyz123*abcdefghijklmnopqrst

list[21] vwxyz123*abcdefghijklmnopqrstu

list[22] wxyz123*abcdefghijklmnopqrstuv

list[23] xyz123*abcdefghijklmnopqrstuvw

list[24] yz123*abcdefghijklmnopqrstuvwx

list[25] z123*abcdefghijklmnopqrstuvwxy

list[26] 123*abcdefghijklmnopqrstuvwxyz

list[27] 23*abcdefghijklmnopqrstuvwxyz1

list[28] 3*abcdefghijklmnopqrstuvwxyz12

list[29] *abcdefghijklmnopqrstuvwxyz123


그 후 거품정렬(bubble sort) 를 하게 된다


코드는 다음과 같다




자 그럼 메모리 구조는 어떻게 되어 있을까

다음과 같다



list[29] -> *abcdefghijklmnopqrstuvwxyz123

list[26] -> 123*abcdefghijklmnopqrstuvwxyz

list[27] -> 23*abcdefghijklmnopqrstuvwxyz1

list[28] -> 3*abcdefghijklmnopqrstuvwxyz12

list[0] -> abcdefghijklmnopqrstuvwxyz123*

list[1] -> bcdefghijklmnopqrstuvwxyz123*a

list[2] -> cdefghijklmnopqrstuvwxyz123*ab

list[3] -> defghijklmnopqrstuvwxyz123*abc

list[4] -> efghijklmnopqrstuvwxyz123*abcd

list[5] -> fghijklmnopqrstuvwxyz123*abcde

list[6] -> ghijklmnopqrstuvwxyz123*abcdef

list[7] -> hijklmnopqrstuvwxyz123*abcdefg

list[8] -> ijklmnopqrstuvwxyz123*abcdefgh

list[9] -> jklmnopqrstuvwxyz123*abcdefghi

list[10] -> klmnopqrstuvwxyz123*abcdefghij

list[11] -> lmnopqrstuvwxyz123*abcdefghijk

list[12] -> mnopqrstuvwxyz123*abcdefghijkl

list[13] -> nopqrstuvwxyz123*abcdefghijklm

list[14] -> opqrstuvwxyz123*abcdefghijklmn

list[15] -> pqrstuvwxyz123*abcdefghijklmno

list[16] -> qrstuvwxyz123*abcdefghijklmnop

list[17] -> rstuvwxyz123*abcdefghijklmnopq

list[18] -> stuvwxyz123*abcdefghijklmnopqr

list[19] -> tuvwxyz123*abcdefghijklmnopqrs

list[20] -> uvwxyz123*abcdefghijklmnopqrst

list[21] -> vwxyz123*abcdefghijklmnopqrstu

list[22] -> wxyz123*abcdefghijklmnopqrstuv

list[23] -> xyz123*abcdefghijklmnopqrstuvw

list[24] -> yz123*abcdefghijklmnopqrstuvwx

list[25] -> z123*abcdefghijklmnopqrstuvwxy


실제 문자열의 위치는 안바뀌었고 다만 포인터의 위치만 바뀐 것이다 (참고로 *는 0xff이므로 실제론 list[29]가 맨 뒤로 가있다)


자 그럼 정렬을 한 후 마지막 func4 에선 각 포인터에서 맨 끝 글자를 가져와서 xor(0x37)을 한다


중요한건! 저 위 포인터 순서대로 말이다


그러므로 저 위 메모리 맵을 사용하자면 xor하는 순서는


3z12*abcde.....wxy 가 된다


그리고 이걸 xor한 값을 무언가와 비교하는데 바로 이게 이 부분이다(memcmp)




unk_8048D60 이 xor된 flag 가 저장되어 있는 곳이다


가서 30글자를 가져온 후 xor복호화 해주면


이런 글자가 나온다


3.._tvl3*stttwrp__1mea4as4i1_. (*==0xff)


자 그럼 생각해보자


저 글자들은 맨 앞글자가 정렬된 상태에 가져온 맨 마지막 글자이다


그럼 이렇게 되겠지


?????????????????????????????3

?????????????????????????????.

?????????????????????????????.

?????????????????????????????_

?????????????????????????????t

?????????????????????????????v

?????????????????????????????l

?????????????????????????????3

?????????????????????????????ÿ

?????????????????????????????s

?????????????????????????????t

?????????????????????????????t

?????????????????????????????t

?????????????????????????????w

?????????????????????????????r

?????????????????????????????p

?????????????????????????????_

?????????????????????????????_

?????????????????????????????1

?????????????????????????????m

?????????????????????????????e

?????????????????????????????a

?????????????????????????????4

?????????????????????????????a

?????????????????????????????s

?????????????????????????????4

?????????????????????????????i

?????????????????????????????1

?????????????????????????????_

?????????????????????????????.


그리고 전체 문자열 집합은 다음과 같다


...113344____aaeilmprssttttvw\xff (정렬을 했다)


그렇다면 지금 위에 ???? 들의 상태는 다음과 같다는걸 알 수 있다


.????????????????????????????3

.????????????????????????????.

.????????????????????????????.

1????????????????????????????_

1????????????????????????????t

3????????????????????????????v

3????????????????????????????l

4????????????????????????????3

4????????????????????????????ÿ

_????????????????????????????s

_????????????????????????????t

_????????????????????????????t

_????????????????????????????t

a????????????????????????????w

a????????????????????????????r

e????????????????????????????p

i????????????????????????????_

l????????????????????????????_

m????????????????????????????1

p????????????????????????????m

r????????????????????????????e

s????????????????????????????a

s????????????????????????????4

t????????????????????????????a

t????????????????????????????s

t????????????????????????????4

t????????????????????????????i

v????????????????????????????1

w????????????????????????????_

ÿ????????????????????????????.


왜냐하면 맨 앞글자는 정렬된 상태이기 때문이다


그럼 이제 조각난 2글자짜리 문자열을 얻을 수 있다


3.

..

..

_1

t1

v3

l3

34

ÿ4

s_

t_

t_

t_

wa

ra

pe

_i

_l

1m

mp

er

as

4s

at

st

4t

it

1v

_w

.ÿ


왜냐하면 1번째 줄의경우 뺑뺑 도는거기 때문에 3다음엔 . 이 와야하고 두번째엔 같은식으로  . 다음엔 . 이런식으로 하면 위의 문자열처럼 나온다


이걸 연결하면 키값이 나오는데 경우의 수가 너무 많다


그럼 어떻게 하느냐.... 3글자 짜리 뭉치를 구하면 된다(위의것은 2글자 짜리 뭉치)


3????????????????????????????v

3????????????????????????????l

이와같은 메모리 값이 있을때 3 다음 ? 부분도 정렬이 되어 있을 것이다


그리고 위의 2글자 짜리 뭉치로부터 우린 3다음 올수 있는 문자열이 4와 . 이라는걸 알 수 있다 (34 과 3.)


그럼 어떻게 하느냐?


4 와 .을 정렬해서 저기 위에 넣어주면 된다


그러면 


3.???????????????????????????v -> v3.

34???????????????????????????l -> l34


이런식이 되고 3글자 짜리 뭉치가 완성되었다


이런식으로 3글자 짜리 뭉치를 30개 만들고 전부 다 이어준 뒤 0xff 를 기준으로 자르면 플래그가 나오게 된다


4t_l34st_it_was_1mperat1v3...



저작자표시비영리동일조건

'리버싱 문제 풀이' 카테고리의 다른 글

[plaid 2014] paris 1  (5) 2014.07.03
2014 plaidctf hudak write up  (0) 2014.04.14
[코드게이트 2012] bin 300  (0) 2014.02.17
[코드게이트 2011] bin 200  (0) 2014.02.15
[코드게이트 2012] Bin 100  (0) 2014.02.15
[YISF Pre Qual 2013] bin300  (0) 2014.02.12
Response : 0 Trackbacks , 0 Comments

Trackback URL :

Leave a comment

드디어 ROP 성공했다 ㅠㅠ

Posted 2014.04.06 18:09, Filed under: 버퍼 오버플로우



일부로 공부될겸 문서는 가능한 조금만 보고 함수도 system함수를 썻다.


그리고 그렇게 하다보니 printf를 기준으로 하면 스테이지 0을 못만들어서 getuid를 기준으로 오프셋을 잡았다


stage0 생성은 ropme 코드를 가져와서 자동화 시킴 


그런데 ropme에선 signed int(struct.pack(">l",value)) 를 쓰는데 나같은 경우는 코드에서 


ebp = (0x80497f0 - 0x5b042464)&0xffffffff


이런식으로 음수를 양수로 바꿔서 쓰기 때문에 unsigned int (struct.pack(">L",value)) 로 모두 바꿔주었다


커스텀스텍: bss위치+0x20


#$1 = {<text variable, no debug info>} 0xb7e63280 <system>

#$2 = {<text variable, no debug info>} 0xb7e707f0 <printf> x

#$1 = {<text variable, no debug info>} 0xb7edd6d0 <setuid> x

#$1 = {<text variable, no debug info>} 0xb7edd640 <getuid>

#0xb7edd640 + offset = 0xb7e63280

offset=(0xb7e63280-0xb7edd640)&0xffffffff


#add [ebp+0x5b042464] ecx ; pop ebp ;;

#0x80497f0 <getuid@got.plt>: 0x080483ee

#0x80497f0 <getuid@got.plt>: 0xb7edd640

ebp = (0x80497f0 - 0x5b042464)&0xffffffff


이 윗부분서 헷갈렸는데 처음엔 got를 오버라이팅한게 아니라 plt를 오버라이팅 했다

그 다음엔 PLT로 리턴한게 아니라 GOT로 리턴했다

덕분에 삽질좀 했다

어휴...


그 후는 간단한 RTL이다

[setuid][system][0]["sh" 문자열 주소]


이제 몇번 더 연습해서 ROP 익스플로잇 짜는거 익숙해진후에 코게문제 풀러 가야겠다

저작자표시비영리동일조건

'버퍼 오버플로우' 카테고리의 다른 글

드디어 ROP 성공했다 ㅠㅠ  (0) 2014.04.06
Response : 0 Trackbacks , 0 Comments

Trackback URL :

Leave a comment

LeaveRet 멤버 모집 안내

Posted 2014.04.05 02:07, Filed under: 컴퓨터_etc

< LeaveRet 팀원 모집 안내 >

1. 모집 기간 : 3월29일 ~ 4월 6일

2. 모집 분야 : 제한X

3. 모집 방식 :

  1. 서류 ( 약 20명 선발 )

  2. 개인 이론&기술 면접 (오프라인) (4월 12~13, 19~20)

  3. 이후 스케쥴은 합격자에 한해 통보

4. 지원서 :

http://goo.gl/jtYWm5

위 링크로 들어가 docx파일로 다운받으시고 내용을 기입 하신 후 pdf파일로 변환하여

leaveret.team@gmail.com으로 보내주시면 됩니다

 

LeaveRet에 대한 정보는  LeaveRet 위키를 참고해주세요.

http://wiki.ctfagain.kr/index.php/


=====


제가 속해있는 팀입니다

리버서(리눅스), 시스햌커를 정말 간절하게 원하고 있습니다

많이 지원해주세요!

저작자표시비영리동일조건

'컴퓨터_etc' 카테고리의 다른 글

crc 알고리즘과 취약점  (11) 2014.06.03
페이스북 페이지 광고,추천 제거 크롬 확장 프로그램  (0) 2014.04.20
LeaveRet 멤버 모집 안내  (0) 2014.04.05
크롬 유저 데이터 추출.py  (0) 2014.03.14
페이스북 동영상 다운로더.py  (0) 2014.02.27
웹툰이 언제 올라왔나 확인할 수 있는 사이트  (2) 2014.01.28
Response : 0 Trackbacks , 0 Comments

Trackback URL :

Leave a comment

크롬 유저 데이터 추출.py

Posted 2014.03.14 19:58, Filed under: 컴퓨터_etc

크롬에 저장되는 여러가지 중요한 유저 데이터를 추출해주는 프로그램


XP는 이제 4월에 지원 끝난다고 하니 나도 지원 안하기로 했다


사실 PyQt GUI 연습할겸 만들려고 했던거지만 생각보다 난이도가 높아서 나중에 하기로 함


추출하는 데이터

-url 자동완성

-자주 접속한 사이트

-각종 자동완성들(아이디, 비밀번호, 신용카드 정보, 이름, etc...)

-오랬동안 머물렀던 사이트


그리고 이상하게 코드를 그냥 더블클릭해서 실행하면 인코딩 문제가 뜬다


해결방법 아는사람은 좀 알려주시길...


win32crypt 라이브러리는 http://sourceforge.net/projects/pywin32/ 에서 적당히 받으면 된다



 
# -*- coding: utf-8 -*-
import os
import shutil
import sqlite3
import win32crypt


def read_db(fname,sql):
	if os.path.isfile(fname):
		shutil.copy(fname,fname+'_')
		db=sqlite3.Connection(fname+'_')
		c=db.cursor()
		r=[]
		for x in c.execute(sql):
			r+=[x]
		db.close()
		os.remove(fname+'_')
		return r
	else:
		db.close()
		os.remove(fname+'_')
		return 0


appdata=os.environ['appdata']
chrome_path=appdata+'\..\Local\Google\Chrome\User Data\Default'
files=[
#'Archived History',
'History',
'Login Data',
'Network Action Predictor',
#'Shortcuts',
'Web Data',
]
#Archived History -> ????
#	select * from urls order by visit_count desc limit 20
#	select * from (SELECT urls.url, urls.title, visits.visit_duration/1000000 as du FROM urls, visits WHERE urls.id = visits.url) order by du desc

#History
#	select * from (SELECT urls.url, urls.title, visits.visit_duration/1000000 as du FROM urls, visits WHERE urls.id = visits.url) order by du desc limit 100
#	select url,title,visit_count from urls order by visit_count desc limit 20
#	select * from keyword_search_terms -> x
#	SELECT name,visit_count FROM segment_usage,segments WHERE segment_usage.segment_id=segments.id ORDER BY visit_count desc limit 20 -> x

#Login Data
#	select origin_url,username_value,times_used from logins order by times_used desc

#Network Action Predictor
#	SELECT user_text,url,number_of_hits FROM network_action_predictor WHERE (LENGTH(user_text)=1 or LENGTH(user_text)=2) and number_of_hits>10 ORDER BY number_of_hits desc

#Shortcuts
#	select * from omni_box_shortcuts order by number_of_hits desc -> ?

#Web Data
#	select * from credit_cards
#	select * from autofill_profiles
#	select first_name,middle_name,last_name from autofill_profile_names
#	select email from autofill_profile_emails
#	select number from autofill_profile_phones


os.chdir(chrome_path)
print 'url, title, visit_duration(sec)'
db=read_db('History','SELECT * from (SELECT urls.url, urls.title, visits.visit_duration/1000000 as du FROM urls, visits WHERE urls.id = visits.url) order by du desc limit 100')
for x in db:
	print x[0],x[1],x[2]

print '=========='
print 'url, title, visit_count'
db=read_db('History','SELECT url,title,visit_count from urls order by visit_count desc limit 20')
for x in db:
	print x[0],x[1],x[2]

print '=========='
print 'name,visit_count'
db=read_db('History','SELECT name,visit_count FROM segment_usage,segments WHERE segment_usage.segment_id=segments.id ORDER BY visit_count desc limit 20')
for x in db:
	print x[0],x[1]

print '=========='
print 'url, times_used, id, password'
db=read_db('Login Data','select origin_url,times_used,username_value,hex(password_value) from logins order by times_used desc')
for x in db:
	password = win32crypt.CryptUnprotectData(x[3].decode('hex'), None, None, None, 0)[1]
	print x[0],x[1],x[2],password

print '=========='
print 'user_text, url, number_of_hits'
db=read_db('Network Action Predictor','SELECT user_text,url,number_of_hits FROM network_action_predictor WHERE (LENGTH(user_text)=1 or LENGTH(user_text)=2) and number_of_hits>10 ORDER BY number_of_hits desc')
for x in db:
	print x[0],x[1],x[2]

print '=========='
print 'first_name, middle_name, last_name'
db=read_db('Web Data','select first_name,middle_name,last_name from autofill_profile_names')
for x in db:
	print x[0],x[1],x[2]

print '=========='
print 'email'
db=read_db('Web Data','select email from autofill_profile_emails')
for x in db:
	print x[0]

print '=========='
print 'number'
db=read_db('Web Data','select number from autofill_profile_phones')
for x in db:
	print x[0]

print '=========='
print 'credit_cards'
db=read_db('Web Data','select * from credit_cards')
for x in db:
	for y in x:
		print y,
print ''

print '=========='
print 'profiles'
db=read_db('Web Data','select * from autofill_profiles')
for x in db:
	for y in x:
		print y,
print ''

print 'end'
저작자표시비영리동일조건

'컴퓨터_etc' 카테고리의 다른 글

페이스북 페이지 광고,추천 제거 크롬 확장 프로그램  (0) 2014.04.20
LeaveRet 멤버 모집 안내  (0) 2014.04.05
크롬 유저 데이터 추출.py  (0) 2014.03.14
페이스북 동영상 다운로더.py  (0) 2014.02.27
웹툰이 언제 올라왔나 확인할 수 있는 사이트  (2) 2014.01.28
워게임 사이트 만들었습니다! CTFagain.kr  (4) 2014.01.19
Response : 0 Trackbacks , 0 Comments

Trackback URL :

Leave a comment

페이스북 동영상 다운로더.py

Posted 2014.02.27 17:56, Filed under: 컴퓨터_etc

간단하게 소스 짜봤습니다


파이썬 2.7에서 작동하고 저장할 폴더를 save_dir에 지정해서 쓰면 ㅇㅋ



 
# -*- coding: utf-8 -*-
import urllib
import re
import sys
import time
def	download(url):
	save_dir='D:\\nyan\\'
	try:
		url=urllib.urlopen(url).read()
		url=url.decode('unicode-escape')
		url=urllib.unquote(url)
		url=re.findall('"hd_src":"?(.*?)","',url,re.DOTALL)[0]
		url=url.replace('\\/','/')
		url=url.replace('https','http')
		if 'null' in url:
			print "no hd"
			url=url.split('sd_src":"')[1]
		t=time.localtime()
		f=time.strftime('%y_%m_%d_%H_%M_%S',t)+'.mp4'
		fp=open(save_dir+f,'wb')
		print save_dir+f,
		c=urllib.urlopen(url).read()
		fp.write(c)
		fp.close()
		del(c)
		print 'ok'
	except:
		print "fail:", sys.exc_traceback.tb_lineno, sys.exc_info()[0]

while True:
	download(raw_input('url:'))


저작자표시비영리동일조건

'컴퓨터_etc' 카테고리의 다른 글

LeaveRet 멤버 모집 안내  (0) 2014.04.05
크롬 유저 데이터 추출.py  (0) 2014.03.14
페이스북 동영상 다운로더.py  (0) 2014.02.27
웹툰이 언제 올라왔나 확인할 수 있는 사이트  (2) 2014.01.28
워게임 사이트 만들었습니다! CTFagain.kr  (4) 2014.01.19
리버싱 케알 올클  (0) 2014.01.01
Response : 0 Trackbacks , 0 Comments

Trackback URL :

Leave a comment

« Previous : 1 : 2 : 3 : 4 : ··· : 6 : Next »

anch0vy
  • 자기소개

Tag cloud

Categories

  • 전체보기 (55)
    • 리버싱 (12)
    • 리버싱 문제 풀이 (18)
    • 익스플로잇 분석 (1)
    • 버퍼 오버플로우 (1)
    • 컴퓨터_etc (22)
    • 일상사 (1)
      • 이야기 (0)
      • etc (0)

Recent Posts

  1. [plaid 2014] paris 1
  2. 만시간의 법칙 사이트(목표 시간 관리..
  3. crc 알고리즘과 취약점
  4. 광고를 단지 3일만에 없앴습니다
  5. 페이스북 페이지 광고,추천 제거 크롬..
  6. 2014 plaidctf hudak write up
  7. 드디어 ROP 성공했다 ㅠㅠ
  8. LeaveRet 멤버 모집 안내

Recent Comments

  1. 안녕하세요! 어렸을 때 재밌게 읽었던.. 12월23일 2018
  2. 잘 읽고 가여~ 1465977699 2016
  3. 좋은글 감사 1465911709 2016
  4. 좋은 정보 잘보고 갑니다 반가 2016
  5. 감사드립니다 빡빡이 2016
  6. 무게타소설 중에 중독,섀도우메이커.. 김승윤 2015
  7. Themida는 금방 디컴 가능해요. 간단.. :) 2015
  8. 대단하시네요.. 이런 것들을 정확하게.. Qusenn 2015

Recent Trackbacks

Calendar

«   2019/02   »
일 월 화 수 목 금 토
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28    

Bookmarks

Blog

  • Control Panel
  • Write an Article

Site Stats

TOTAL 303,903 HIT
TODAY 2 HIT
YESTERDAY 20 HIT

Tattertools and modified by 오드리햇반

Subscribe to RSS

  • 페이스북 공유하기
  • 카카오톡 공유하기
  • 카카오스토리 공유하기
  • 트위터 공유하기