본문 바로가기

호그와트

(366)
드림핵 rev-basic-7 import string import integer #RotateLeft Function ​ def rotateLeft(x, n): ​ shiftBit = x > 8 - n ​ result= shiftBit | carryBit ​ return result ​ #RotateRight Function def rotateRight(x, n): ​ shiftBit = x >> n ​ carryBit = x
드림핵 rev-basic-6 import string secretData = [0x00, 0x4D, 0x51, 0x50, 0xEF, 0xFB, 0xC3, 0xCF, 0x92, 0x45, 0x4D, 0xCF, 0xF5, 0x04, 0x40, 0x50, 0x43, 0x63, 0x0E] strangeData = [0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76, 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0, 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0..
드림핵 rev-basic-5 IDA를 통해 검증하는 함수를 보면 ​ __int64 __fastcall sub_140001000(__int64 a1) { int i; // [rsp+0h] [rbp-18h] ​ for ( i = 0; (unsigned __int64)i < 0x18; ++i ) { if ( *(unsigned __int8 *)(a1 + i + 1) + *(unsigned __int8 *)(a1 + i) != byte_140003000[i] ) return 0i64; } return 1i64; } 사용자 입력값을 a 라고 했을 때, a[n] 과 a[n+1] 을 더한 값이 byte_140003000 값과 같아야 한다고 한다. ​ byte_140003000 의 모습은 아래와 같은데, 이전 코드와의 모습을 볼 때 이것도 하나의..
드림핵 funjs 주어진 파일을 보면 로그인 창이 막 날라다니면서 값도 복잡하게 나온다 var box; window.onload = init; function init() { box = document.getElementById("formbox"); setInterval(moveBox,1000); } function moveBox() { box.posX = Math.random() * (window.innerWidth - 64); box.posY = Math.random() * (document.documentElement.scrollHeight - 64); box.style.marginLeft = box.posX + "px"; box.style.marginTop = box.posY + "px"; debugger; } ​..
드림핵 rev-basic-0 open subviews에서 새로운 string를 들어가서 input, correct, wrong이라는 가장 기본적인 함수에 기초한 필터링이 무엇인지를 파악한 하는 순간 답이 나온다 ​ 물론 그렇게 파악할 수도 있지만 맨처음에 제공하는 view-a형식에 나와있는 그래프를 보면 전체적인 함수가 무엇을 가리키는지 너무나 명확하게 나와있음을 알 수 있다 거기서 핵심적인 함수가 sub-140001190이라는 것 역시 어렵지 않게 알아낼 수 있다 그런 식으로 접근해보면 F5키를 눌러서 핵심적인 함수의 c언어 형태를 알아낼 수 있는데 그걸 보는 순간 if ( (unsigned int)sub_140001000(v4) ) puts("Correct"); else puts("Wrong"); return 0; 라는 단순한 ..
드림핵 rev-basic-1 rev - basic 00과 본질적으로 같은 문제였다 들어오는 값을 비교해서 맞으면 correct 틀린 경우 wrong 값을 출력하는 간단한 함수에 기반한 문제였다 00과 똑같은 방식으로 분석해보면 대략적인 if 문이 나오고 결정적인 함수가 나온다 숫자로 봤을 때 if문에 값이 무엇인지 한 눈에 들어오지 않았지만 r을 연속적으로 눌러주어서 비교하는 값이 무엇인지 차례대로 변경해주면 flag값을 간단히 얻을 수 있다
드림핵 rev-basic-2 if ( *(_DWORD *)&aC[4 * i] != *(unsigned __int8 *)(a1 + i) ) 비교문을 보면 대략 이런식으로 구성되어 있다 이 때 aC로 들어가보면 비교하는 flag가 나온다
드림핵 rev-basic-3 __int64 __fastcall sub_140001000(__int64 a1) { int i; // [rsp+0h] [rbp-18h] ​ for ( i = 0; (unsigned __int64)i < 0x18; ++i ) { if ( byte_140003000[i] != (i ^ *(unsigned __int8 *)(a1 + i)) + 2 * i ) return 0i64; } return 1i64; } 기본적인 분석방법에 의거해 위와 같은 함수가 나왔다 당연히 byte 부분이 핵심이 되는 부분이라는 것을 알 수 있었고 더블 클릭해서 ​ .data:0000000140003000 byte_140003000 db 49h, 60h, 67h, 74h, 63h, 67h, 42h, 66h, 80h, 78h, 2 d..