촉촉한초코칩

[Dreamhack] rev-basic-4 본문

Study/Reversing

[Dreamhack] rev-basic-4

햄친구베이컨 2024. 7. 27. 12:38

 

구조는 rev-basic 이전 문제와 동일하다. 

 

메인 함수를 디컴파일링 해준다. (F5)

 

sub_140001000에서 문자를 비교하는 것 같아서 들어가보았다. 

i가 28이 될 때까지 반복문을 돌리고
if문에 맞으면, 정답인 것 같다.. 

if문에 저 코드가 뭔지 모르겠어서 gpt에 물어보았다..ㅎㅎ 

 

이 조건문은 a1 포인터와 byte_140003000 배열의 i번째 요소를 비교하는 것입니다. 구체적으로는, a1 + i 주소에서 1바이트 값을 가져와서 두 가지 연산을 수행합니다:

  1. 가져온 값을 16배하고 8비트 부호 없는 정수로 캐스팅합니다.
  2. 가져온 값을 8비트 부호 없는 정수로 캐스팅하고, 32비트 정수로 캐스팅한 후 4비트 오른쪽으로 시프트합니다.
  3. 두 결과를 비트 OR 연산합니다.
  4. 이 결과가 byte_140003000[i]와 다른지 비교합니다.

 

그렇다면 byte_140003000의 값이 뭔지 알아내고 연산을 수행해야 할 것 같다. 

24h, 27h, 13h, 2 dup(0c6h), 13h, 16h, 0E6h, 47h, 0F5h, 26h, 96h, 47h, 0F5h, 46h, 27h, 13h, 2 dup(26h), 0C6h, 56h, 0F5h, 2 dup(0C3h), 0F5h, 2 dup(0E3h), 5 dup(0)

0x24, 0x27, 0x13, 0xc6, 0xc6, 0x13, 0x16, 0xE6, 0x47, 0xF5, 0x26, 0x96, 0x47, 0xF5, 0x46, 0x27, 0x13, 0x26, 0x26 0xC6, 0x56, 0xF5, 0xC3, 0xc3, 0xF5, 0xE3, 0xe3

* 2 dup → 2번 반복 

파이썬으로 코드를 만들어보았다. 

ans = [0x24, 0x27, 0x13, 0xC6, 0xC6, 0x13, 0x16, 0xE6, 0x47, 0xF5, 0x26, 0x96, 0x47, 0xF5, 0x46, 0x27, 
       0x13, 0x26, 0x26, 0xC6, 0x56, 0xF5, 0xC3, 0xc3, 0xF5, 0xE3, 0xE3]

for i in range(len(ans)):
    print(chr((ans[i]<<4 | ans[i]>>4) % (16 * 16)), end='')

 

다음엔 코드 분석도 직접 해보기...!

 

참고 https://velog.io/@helenason/dreamhack-wargame-rev-basic-4

'Study > Reversing' 카테고리의 다른 글

[Dreamhack] Secure Mail  (0) 2024.08.15
[Dreamhack] simple-operation  (0) 2024.07.31
[Dreamhack] rev-basic-2  (1) 2024.07.22
[Dreamhack] Easy Assembly  (0) 2024.07.07
CodeEngn Basic RCE L16  (0) 2022.11.25