숨겨진 문자열 표시

요전날 개최된 한 워크숍에서 출제된 문제.

어느 메모리 영역에 있는 수치를 XOR(어셈블리에서는 not***) 하면 숨겨져 있던 문자열이 나온다. (이미지 2의 obj.flag에 있다)

[이미지 1]

예를 들면, 0x562c76088012의 「9e」에 대해서, 화상 2에서는 rax에 「9e」가 들어 있다.
레지스터 rax 0x0000009e

[이미지 2]

not eax를 실행 후는 rax의 하위 8비트에 「61」이 들어 있다.
레지스터 rax 0xffffff61

[이미지 3]

그런 다음 rax의 값을 rcx에 넣고 cl (rcx의 하위 8 비트)을 버퍼링하여 문자열을 생성합니다. (여기에서는 이미지 2의 obj.buf)
mov byte [rdx + rax], cl

ascii 코드에서 "61"은 "a"

[이미지 4]

모두 알아보기 위해 파이썬에서 다음과 같이 계산해 보았다.
>>> hex(0x9e ^ 0xff)
'0x61'

이것을 이용하여 화상 1의 메모리의 수치를 변환해 보면 다음과 같이 되었다.

[이미지 5]

결과 숨겨진 문자열은
"flag{Hidden_Message!}"
이었다. radare2 사랑 해요.

<계속>
ghidra로 디컴파일 해 보니 대단했다. 어셈블리로 쫓은 내용이 바삭바삭하고 몇 줄의 코드로 표시되어 있다.

Deep ghidra decompiler integration for radare2
htps : // 기주 b. 코 m / 라다레 오 rg / r2g

Cutter: Presenting r2ghidra Decompiler | r2con 2019
htps: //같다. 베 / 에 Ht 미에 zr7l8? t=948

설치 및 사용법 데모
htps: //같다. 베 / 에 Ht 미에 zr7l8? t=1945


추가:2021/09/28
asm 처리를 파이썬으로 작성했습니다.

python3
import math
sbuf = '99939e9884b7969b9b9a91a0b29a8c8c9e989ade82'
num = math.floor(len(sbuf)/2)
sret = ""
for i in range(num):
    sret += chr(~int(sbuf[i*2:(i*2+2)],16)&0xFF)
print(sret)

out
flag{Hidden_Message!}

좋은 웹페이지 즐겨찾기