촉촉한초코칩
[Dreamhack] rev-basic-4 본문
구조는 rev-basic 이전 문제와 동일하다.
메인 함수를 디컴파일링 해준다. (F5)
sub_140001000에서 문자를 비교하는 것 같아서 들어가보았다.
i가 28이 될 때까지 반복문을 돌리고
if문에 맞으면, 정답인 것 같다..
if문에 저 코드가 뭔지 모르겠어서 gpt에 물어보았다..ㅎㅎ
이 조건문은 a1 포인터와 byte_140003000 배열의 i번째 요소를 비교하는 것입니다. 구체적으로는, a1 + i 주소에서 1바이트 값을 가져와서 두 가지 연산을 수행합니다:
- 가져온 값을 16배하고 8비트 부호 없는 정수로 캐스팅합니다.
- 가져온 값을 8비트 부호 없는 정수로 캐스팅하고, 32비트 정수로 캐스팅한 후 4비트 오른쪽으로 시프트합니다.
- 두 결과를 비트 OR 연산합니다.
- 이 결과가 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 |