1개 겨우 풀었습니다 ㅎㅎ..
REV
jumpout
IDA로 디컴파일이 잘 안되어서 어셈블리와 gdb로 분석한 결과
입력한 값의 길이가 29(0x1d)인지 검증한 뒤
다음과 같은 3번의 xor 연산을 거친 뒤 값을 비교하여 동일하면 정답으로 처리해주는 로직이었습니다.
# r8d에 입력한 값이 들어감
r8d ^ esi # esi는 0 ~ 0x1c
r8d ^ 0x55
# r9d는 [0x555555558010 + rdi] (0~0x1c)
r8d ^ r9d
pwndbg> x/4gx 0x555555558010
0x555555558010: 0x68141581c831f5f6 0xf1ca09823ee535f6
0x555555558020: 0x816d2a33dfdfa98a 0x00000017df85a6f5
# 아래 배열과 비교해서 같으면 정답으로 처리됨
pwndbg> x/4gx 0x555555558030
0x555555558030: 0x503c0b9fdd25e4f0 0xc7f330af3fca04de
0x555555558040: 0xb4571817effdb2aa 0x00000023f4b88fd0
따라서 위 연산을 역연산하면 플래그 값이 나옵니다.
xor_li = 'F6F531C881151468F635E53E8209CAF18AA9DFDF332A6D81F5A685DF17'
li = []
xor_li2 = 'F0E425DD9F0B3C50DE04CA3FAF30F3C7AAB2FDEF171857B4D08FB8F423'
li2 = []
for i in range(len(xor_li)//2):
li.append(xor_li[i*2:(i+1)*2])
for i in range(len(xor_li2)//2):
li2.append(xor_li2[i*2:(i+1)*2])
for x in range(29):
print(chr(int(li[x],16)^int(li2[x],16)^x^0x55),end='')
SECCON{jump_table_everywhere}
'CTF' 카테고리의 다른 글
vsCTF 2023 (0) | 2023.09.25 |
---|---|
CSAW CTF Qualification Round 2023 (0) | 2023.09.18 |
BDSec CTF 2023 (0) | 2023.07.22 |
AmateursCTF 2023 (0) | 2023.07.20 |
ångstrom CTF 2023 (0) | 2023.05.02 |