본문 바로가기

Reversing6

rev-basic-6 [rsp+20]을 buffer rsp를 count 7FF60B753020을 data 7FF60B753000을 data2라고 하겠다. 1. buffer[count]를 eax에 저장한다. 2. data를 rcx에 저장한다. 3. 입력받은 문자열과 data를 더한다. 4. data2[count]를 ecx에 저장한다. 5. 3번의 값과 4번의 값을 비교한다. data를 반복문을 돌려 data2와 값이 같을 때 data의 인덱스 값을 찾아준다. #include int main() { int data2[] = { 0x00, 0x4D, 0x51, 0x50, 0xEF, 0xFB, 0xC3, 0xCF, 0x92, 0x45, 0x4D, 0xCF, 0xF5, 0x04, 0x40, 0x50, 0x43, 0x63 };//18개.. 2020. 7. 6.
rev-basic-5 [rsp+20]을 buffer rsp를 count 7FF7498C3000에 저장된 값을 data라고 하겠다. 연산 루틴이다. 1. buffer[count]를 eax에 저장한다. 2. count+=1을 한다. 3. buffer[count+1]을 ecx에 저장한다. 4. 1번의 값과 3번의 값을 더해준다. 5. data[count]의 값을 ecx에 저장한다. 6. 4번의 값과 5번의 값을 비교한다. data의 값이다. cmp rax, 18을 통해 마지막 암호가 0x00이라는 것을 알 수 있다. 이를 이용해 역연산을 해준다. data = [0xAD, 0xD8, 0xCB, 0xCB, 0x9D, 0x97, 0xCB, 0xC4, 0x92, 0xA1, 0xD2, 0xD7, 0xD2, 0xD6, 0xA8, 0xA5, .. 2020. 7. 6.
rev-basic-4 사용자로부터 입력받은 문자열을 [rsp+8]에 저장한다 sub rsp, 18을 해줬기 때문에 접근을 할 때에는 [rsp+20]으로 해준다. [rsp+20]을 편의상 buffer, rsp를 count라 하겠다. 연산 루틴이다. 1. eax에 buffer[count]를 저장한 뒤 sar eax, 4를 해준다. 2. ecx에 buffer[count]를 저장한 뒤 shl ecx, 4를 한 뒤 and ecx, F0을 해준다. 3. or 1번의 값, 2번의 값을 해준다. 4. 7FF6A6573000에 저장된 값을 rdx에 저장한 뒤 count를 사용하여 ecx에 저장한다. 5. 3번의 값과 4번의 값을 비교해준다. data = [0x24, 0x27, 0x13, 0xC6, 0xC6, 0x13, 0x16, 0xE6, .. 2020. 7. 6.
[Reversing.kr] easy crackme 프로그램을 실행하면 창이 뜬다. 메시지 창을 호출하는 모듈을 찾아보자 는 사용자로부터 텍스트를 입력받는 함수이다. 해당 부분으로 가면 사용자로부터 문자열을 입력받은 뒤 문자열을 비교한다. a 5y R3versing를 스택에 푸시한 뒤 그 인자를 이용하여 비교한다. 근데 첫번째첫 번째 비교문을 보면 [esp+4]가 아닌 [esp+5]이다. 첫 번째 문자가 아닌 두 번째 문자부터 비교한다. _a5yR3versing가 플래그이다. 아래로 좀만 더 내리면 첫번째 문자를 알 수 있다. Flag는 Ea5yR3versing 2020. 7. 2.