반응형

이 문제는 QR코드를 퍼즐처럼 맞추는 것처럼 보인다.


하지만 소스코드를 보면


$('#join_img').attr('src',unescape('.%2f%69%6d%67%2f%71%72%2e%70%6e%67'));


와 같은 src 값이 보인다.


url decode를 해서 접속하고 QR코드 해석후 인증하면 성공~

'Write up > Wargame' 카테고리의 다른 글

[Wargame.kr] login filtering (450p)  (0) 2016.04.27
[Wargame.kr] flee button (450p)  (0) 2016.04.27
[Wargame.kr] already got (200p)  (0) 2016.04.27
[Webhacking.kr]12번 문제  (0) 2014.10.30
[Webhacking.kr]11번 문제  (0) 2014.10.30
블로그 이미지

KuroNeko_

KuroNeko

,
반응형

문제 제목 그대로 웹사이트 접속할 때 FLAG를 resopne Header에 넣어서 준다.


그 값을 auth하면 성공~

'Write up > Wargame' 카테고리의 다른 글

[Wargame.kr] flee button (450p)  (0) 2016.04.27
[Wargame.kr] QR CODE PUZZLE (300p)  (0) 2016.04.27
[Webhacking.kr]12번 문제  (0) 2014.10.30
[Webhacking.kr]11번 문제  (0) 2014.10.30
[Webhacking.kr]10번 문제  (0) 2014.10.30
블로그 이미지

KuroNeko_

KuroNeko

,
반응형

Google에


url:research.hackerschool.org/



검색



'자료' 카테고리의 다른 글

[C++] 브루트 포싱(Brute Forcing)  (0) 2016.07.30
주로 사용하는 헤더들  (0) 2016.05.18
ARM Assembly 명령어 정리(펌)  (0) 2016.03.17
[STL] vector구현(수정)  (0) 2016.02.09
Heap 기반 free() & malloc() Exploit 작성하기  (0) 2015.12.26
블로그 이미지

KuroNeko_

KuroNeko

,
반응형

※ 용어 정의
     Rd: Destination Register   /   Rn: Operand1 Register   /   Rm: Operand2 Register
     <cond>: Execution Condition code
     <S>: S-Suffix - Status Update Suffix - SPSR의 값을 CPSR로 불러와서 Status를 Update
     <!> : ! - Suffix - Writeback Suffix - [,]내의 선처리 연산 수행 후 값을 갱신
     <Operand2>: Operand2가 가질 수 있는 형식
          ㄱ. #Immediate: 32bit  명령에서 Immediate값은 8-bit pattern의 짝수 shift 값 만을 허용
          ㄴ. Rm{, shift연산 #immediate}: Register(Rm)값에 #immediate 값으로 Shift 연산
               

                 § Shift 연산의 종류
               - asr(Arithmetic Shift Right): Immediate의 값 만큼 right shift, 앞에 bit는 Sign Extension
               - lsr(Logical Shift Right): Immediate의 값 만큼 right shift, 앞에 bit는 0으로 채움
               - lsl(Logical Shift Left): Immediate의 값 만큼 left shift, 뒤에 bit는 0으로 채움
               - ror(ROtate Right): Immediate의 값 만큼 rotate right, rotate후 bit 0값은 carry에 저장
               - rrx(Rotate Right eXtend): rrx는 1bit 씩 rotate right, bit 0값은 carry에 저장


1. 데이터 처리 명령(General Data Processing Instruction)

     1.1 산술 연산
Syntax: add<cond><S> Rd, Rn, <Operand2>

          add: Rd := Rn + <Operand2> 
          sub: Rd := Rn - <Operand2>
          adc(ADd with Carry), sbc(SuBtract with Carry): Carry를 포함한 add, sub 연산
         
          rsb(Reverse SuBtract): Rd := <Operand2> - Rn
          rsc(Reverse Subract with Carry): Carry를 포함한 역 sub 연산

     1.2 논리 연산
Syntax: and<cond><S> Rd, Rn, <Operand2>

          and: Rd := Rn & <Operand2>
          orr:  Rd := Rn | <Operand2>
          eor: Rd := Rn ^ <Operand2>
          bic: Rd := Rn & !<Operand2>
     1.3 Register 값 저장
Syntax: mov<cond><S> Rd, <Operand2>

          mov: Rd := <Operand2>
          mvn: Rd := !<Operand2>

     1.4 비교
Syntax: cmp<cond><S> Rn, <Operand2>

          cmp: Rn값에서 Opeand2값을 빼서 그 결과를 Status flag에 반영, SUBS와 동일한 명령
          cmn: Rn값에서 Operand2값을 더해서 그 결과를 Status flag에 반영, ADDS와 동일한 명령

          tst: Rn과 Opearand2를 bit and 연산을 수행해서 그 결과를 Status flag에 반영, ANDS와 동일한 명령
          teq: Rn과 Operand2를 bit xor 연산을 수행해서 그 결과를 Status flag에 반영, EORS와 동일한 명령

2. 메모리 접근 명령(Memory Accesss Instruction)

          Syntax: ldr<cond><B> Rd, label
                       ldr<cond><B><T> Rd, [Rn]
                       ldr<cond><B> Rd, [Rn, FlexOffset]<!>         ;Pre-Indexed<Auto-Indexing>
                       ldr<cond><B><T> Rd, [Rn], FlexOffset        ;Post-Indexed

          <B>: B Suffix가 있을 경우 8-bit Unsigned byte 단위로 Access, 없을 경우 32-bit word로 Access
          <T>: T suffix가 있을 경우 Processor가 User mode에서 memory access 처리
          FlexOffset:
               ㄱ.#Immediate: -4095 부터 -4096사이의 상수 값
               ㄴ.{-}Rm{, shift연산}: Rm은 음의 부호를 가질 수 있으며, Rm의 Shift 연산도 가능함

     2.1 Load 또는 Store 명령 예제

          ldr r0, [r1]: r1에 저장된 주소를 이용해서 메모리로부터 r0로 값을 불러옴
          str r0, [r1], #4: r0의 값을 메모리의 r1의 주소에 저장하고 r1을 +4함.
          참고) 부호가 있는 Halfword, Byte로 읽을 때는 SH(Signed Halfword), SB(Signed Byte) <--(ldr only)
                  Unsigned Halfword로 읽거나 저장할 때는 H를 사용.
                  Doubleword의 경우 D 를 사용, 이 때의 Offset은 {-}Rm 만 허용함.

     2.2 Multiple Load 또는 Store 명령

Syntax: ldm<cond><addrmode> Rn<!>, {reglist}<^>

          <addrmode>: address mode에는 총 8가지가 있으며, 4가지는 address의 연상 방식에 따른
                                구분이며 4가지는 stack의 특성에 따른 구분이다.
              - IA(Increment Address after each transfer), - IB(Increment Address after each transfer)
              - DA(Decrement Address after each transfer), - DB(Decrement Address after each transfer)

              - FD(Full descending stack): stack의 주소에 data가 저장이 된 상태이고, 주소가 감소하면서 저장
              - ED(Emtpy descending stack): stack의 주소에 data가 없는 상태이고, 주소가 감소하면서 저장
              - FA(Full ascending stack): stack의 주소에 data가 저장이 된 상태이고, 주소가 증가하면서 저장
              - EA(Emtpy ascending stack): stack의 주소에 data가 없는 상태이고, 주소가 증가하면서 저장

          <!>: ! - Suffix가 있을 경우 마지막 주소(최종으로 이동한 주소)를 Rn에 저장함
          <^>: SPSR의 값을 CPSR에 넣어줌, S-Suffix와 동일한 기능을 수행함.

          ldm: Rn으로 부터 reglist에 지정한 register 수 만큼 값을 불러옴
          stm: reglist에 있는 register의 값들을 Rn에 저장함.

          [주의] Reglist에 지정한 Register의 순서와 상관없이 Register의 번호가 낮은 값이
                    메모리의 낮은 주소에 저장 또는 읽어진다. reglist는 'r1,r2,r3' 또는 'r1-r3'으로 표현
          [자주 사용되는 형식] STMFD sp!, {r4-r7,lr} / LDMFD sp!, {r4-r7,pc}

3. 분기 명령(Branch Instruction)

Syntax
: b<cond> label

     b: label이 있는 주소로 branch(PC값에 label의 주소를 입력)
     bl: 다음 명령의 주소를 lr에 저장하고, b와 같이 label의 주소로 branch

4. 기타 명령어
     4.1 Software Interrupt
Syntax: swi<cond> Immediate_24bit

          swi: 지정한 번호를 갖는 Software Interrupt를 발생시킴, 해당 번호에 맞는 SWI vector로 branch
               (Software Interrupt가 걸리면 프로세서의 모드는 Supervisor로 변경됨)

     4.2 PSR Access
Syntax: mrs<cond> Rd, psr

                    psr에 지정한 값(cpsr 또는 spsr)로 부터 값을 불러와서 Rd에 저장 (Register <- PSR)

Syntax: msr<cond> psr_(field), #Immediate_8bit
msr<cond> psr_fields, Rm      

                    Register(Rm)의 값 또는 8bit Immediate값을 psr(cpsr 또는 spsr)에 저장 (Register -> PSR)
                    (field): f, s, x, c 값이 선택적으로 올 수 있음. 지정한 field 영역에만 값을 저장함.

          [주의] 프로세서가 User 또는 System mode일 때는 SPSR에 엑세스 하지 말아야 한다.
          [자주 사용되는 형식] msr CPSR_c,r0
5. 상태 플래그와 실행 조건 코드(Status Flags & Execution Condition Codes)
     N: 연산 결과가 음의 값을 가질 때 Set '1'
     Z: 연산 결과가 영일 때 Set '1'
     C: 연산 결과가 캐리(Carry)를 가질 때 Set '1'
     V: 연산 결과 오버플로우(Overflow)를 발생시킬 때 Se
사용자 삽입 이미지

<ARM Instructioin Set>

사용자 삽입 이미지

     ① opcode<cond><S> Rd, Rn, #Immediate
     ② opcode<cond><S> Rd, Rn, Rm OP #Imm
     ③ opcode<cond><S> Rd, Rn, Rm OP Rs
          - cmp, cmn 명령에서는 Rd는 무조건 '0' 값을 넣어줘야 함.(SBZ(Should Be Zero))

     ④ opcode<cond> Rd, Rn, #Immediate
     ⑤ opcode<cond> Rd, Rn, Rm OP #Imm
     ⑥ opcode<cond> Rd, <address>
     ⑦ opcode<cond><addrmode> Rm, Register_List^
     ⑧ opcode<cond><addrmode> Rm<!>, Register_List
     ⑨ opcode<cond><addrmode> Rm<!>, Register_List^
          - P='1' Pre, P='0' Post / U='1' Increment, U='0' Decrement / B='1' Byte load, B='0' Word load /
            W='1' Write-back(Auto-Index) W='0' / L='1' opcode는 ldr, L= '0' str /
            I='1' Addr_mode가 모두 Offset field I='0' 앞에 Addr_mode는 '0' 뒤에 Addr_mode는 Rm /
            S='1' Signed, S='0' Unsigned / H='1' Half Word, H='0' Word or Byte

     ⑩ b<cond> #Target Address(24bit Offset) - L의 값이 '1'이면 bl 명령

     ⑪ SWI #SWI Number

     ⑫ mrs<cond><S> Rd, PSR
     ⑬ msr<cond><S> PSR_<Field_Mask>, Rm
     ⑭ msr<cond><S> PSR_f, #Immediate
          - S의 값이 '1'이면 SPSR에서, '0'이면 CPSR.
          - SBO(Should Be One) 영역은 '1'로, SBZ(Should Be Zero) 영역은 '0'의 값을 넣어줘야 함

<ARM Assembly 명령어 정리표>
<참고자료>
  - ARM Developer Suite 1.2 Assembler Guide(ARM DUI 0068B):
    http://infocenter.arm.com/help/topic/com.arm.doc.dui0068b/DUI0068.pdf
  - ARM Asssembly Language Programming: http://www.arm.com/miscPDFs/9658.pdf
  - kkamagui의 프로그래밍 작업실 ARM 어셈블리: http://kkamagui.springnote.com/pages/432792
  - ARM Instruction Quick Finder: http://www.heyrick.co.uk/assembler/qfinder.html
  - ARM Reference - rE Ejected: http://re-eject.gbadev.org/ =>ARM_Reference-rE.Ejected.pdf 자료 출처


블로그 이미지

KuroNeko_

KuroNeko

,

[Project] Interpret Nyan

Project 2016. 3. 13. 19:44
반응형

군대에서 너무 할게 없는 와중에 인터프리터를 만들어보자고 생각하고 한 일주일정도 지나서 print명령어를 만들었는데 미흡한 부분이 많다.

물론 심심해서 만드는 거기 때문에 성능은 보장못한다ㅋㅋㅋㅋㅋ



아직 함수와 포인터 부분을 구현하지 않았지만 나중에 점점 추가할 예정이다.


사용 방법은 아래와 같다.

#include <iostream>

#include "interpret"


using namespace std;


int main(){

    translator N("ReadFile");

    N.interpret();


    return 0;

}


ReadFile 내용

print "Neko_Plus__:3" + "NekoP" + " This is My Language Nyan"

print "HAHA! ++ || ))"

블로그 이미지

KuroNeko_

KuroNeko

,
반응형

펜윅 트리(Fenwick Tree) == BIT(Binary Indexed Tree)

- 구간합을 구할 때 log(n)정도의 복잡도를 가지고 있다.


구현을 하기 위해서는 입력받은 값의 2진수에서 처음 1이 나오는 곳의 값을 알아야 한다.

예를 들어서 5의 2진수는 101 이고 처음 1이 나오는 곳의 값은 1이다.

또 다른 예.

3 == 11    -> 1

4 == 100   -> 4

7 == 111   -> 1

12 == 1100-> 4

이렇게 N개를 받은 배열을 A[N]이라고 치면 L[N]은 A의 원소들마다 처음 1이 나오는 곳의 값이다.

또, Tree[i]는 A[i] 부터 앞으로 L[i]개의 합을 저장해놓았다.


L[i]를 구하기 위해서는 아래의 공식이 적용된다.

L[i] = (i & -i);

왜냐하면, 아래의 예시를 보자.

      -num = ~num + 1
       num = 100110101110101100000000000
      ~num = 011001010001010011111111111
      -num = 011001010001010100000000000
num & -num = 000000000000000100000000000

~num은 num의 1의 보수고, +1한게 2의 보수인데 AND를 했을 때 처음 1이 나오는 곳의 값을 얻을 수 있다.


그럼 Tree배열을 사용해서 어떻게 구간합을 구하냐면, 앞서 말했듯이 Tree배열은 A[i]부터 앞으로 L[i]개의 합을 저장해놓았다.

Tree[i]     = A[i] + A[i + 1] + ... + A[i + L[i] - 1]

Tree[i - k - 1] =A[i - k - 1] + A[i - k] + ... + A[i - k - 1 + L[i] - 1]

Tree[i] - Tree[i - k - 1] =  A[i - k] + A[i - k + 1] + ... + A[i + L[i] - 1]

즉, i까지 합 - (k - 1)까지 합 = k부터 i까지의 합 이기때문에 빼주기만 하면 된다.

'Programming > 자료구조' 카테고리의 다른 글

퀵소팅(Quick sorting)  (0) 2015.12.07
버블 소팅(Bubble Sorting)  (0) 2015.08.06
블로그 이미지

KuroNeko_

KuroNeko

,

[pwnable.kr] 주저리

공부 2016. 2. 25. 23:59
반응형

md5_calculator 에서 관건인게

base64 encoded string 을 받아서 decode하고 md5를 하게 되는데..

decode해서 받는 배열의 크기가 512byte 밖에 안되고, base64_encodestring같은 경우에는 최대 1024byte를 받는데

이걸 decode했을 때 길이가 512byte보다는 길기때문에 overflow가 발생함.


또 분석해보면

my_hash를 통해서 srand(time())과 rand()로 더하기 빼기를 하면서 계산을 하는데, canary도 같이 넣어서 계산하게 된다.

이거 역분석 하면 canary 우회 가능함 <-- 여기부터 집가서 해야지

'공부' 카테고리의 다른 글

gs 베이스 주소 구하기  (0) 2016.05.09
[Codegate] 주저리  (0) 2016.05.06
Kernel Exploit  (0) 2016.02.22
Template 공부  (0) 2016.02.09
[MSDN] Allocator  (0) 2016.02.02
블로그 이미지

KuroNeko_

KuroNeko

,

Kernel Exploit

공부 2016. 2. 22. 22:00
반응형
일단 공부시작하자
commit_creds(prepare_kernel_cred(0));  


'공부' 카테고리의 다른 글

[Codegate] 주저리  (0) 2016.05.06
[pwnable.kr] 주저리  (0) 2016.02.25
Template 공부  (0) 2016.02.09
[MSDN] Allocator  (0) 2016.02.02
GOT 입력 ( _dl_runtime_reslove )  (0) 2015.12.29
블로그 이미지

KuroNeko_

KuroNeko

,