쉘코드를 직접 다루어 본적이 없어 많이 헤맸다. 여러 방법을 시도하다가 결국에는 pwntools를 이용했다. pwntools의 AMD64 아키텍처 Shell Code 목록 https://docs.pwntools.com/en/stable/shellcraft/amd64.html pwnlib.shellcraft.amd64 — Shellcode for AMD64 — pwntools 4.7.0 documentation Parameters: key (int,str) – XOR key either as a 8-byte integer, If a string, length must be a power of two, and not longer than 8 bytes. Alternately, may be a register..
디버깅을 해보면, 연속하는 두개의 입력값의 합이 메모리에 저장된 문자와 일치하는지를 확인하는 코드이다 예를 들어서 입력값으로 문자열 abcdef...를 집어넣으면, -> a+b 즉 0x61 + 0x62가 0xAD 인지 확인 (다르면 종료) -> b+c 즉 0x62 + 0x63이 0xD8 인지 확인 (다르면 종료) -> c+d 즉 0x63 + 0x64가 0xCB 인지 확인. (다르면 종료) -> 계속 반복된다 00007FF7809E3000 AD D8 CB CB 9D 97 CB C4 92 A1 D2 D7 D2 D6 A8 A5 .ØËË..ËÄ.¡Ò×ÒÖ¨¥ 00007FF7809E3010 DC C7 AD A3 A1 98 4C 00 00 00 00 00 00 00 00 00 ÜÇ.£¡.L......... 그렇다면..
Dreamhack - rev-basic-4 기본적인 구조 설명은 생략하고 키를 찾는 부분만 설명합니다. 어셈블리 코드 입력값을 받아서 한바이트씩 연산하여 아래의 메모리에 있는 값과 비교한다. 연산 1) sar eax, 4 -> 입력값을 오른쪽으로 4칸 비트 밀기 -> 연산 결과가 저장된 eax는 건드리지 않음 연산 2) shl ecx, 4 및 and ecx, F0 -> 입력값에 왼쪽으로 4칸 비트 밀기 -> 그리고 다시 ecx를 F0과 and 연산 연산 3) or eax, ecx -> 연산1과 연산2의 결과에 OR 연산 사용 -> eax에 저장됨 연산 4) lea ~ 부터 cmp eax, ecx -> 연산3의 결과와 메모리 [7FF7FCAE3000]에 저장된 값을 비교한다 중간에 적용된 OR 연산은 역원..