fd = open("./flag", 0);
read(fd, buf, 0x45uLL);
buf에 flag 내용을 복사한다.
if ( !strcmp(s1, "a0b4c1d7") )
{
puts("Congrats!");
puts((const char *)buf);
}
s1이 a0b4c1d7과 동일하면 flag 내용을 출력한다.
s1은 a0b4c1d7이어야 한다.
snprintf(s, 9uLL, "%08x", v6 ^ v7);
for ( i = 0; i <= 7; ++i )
s1[i] = s[7 - i];
s = v6 ^ v7 (v6: rand_num, v7:input num)
인데, s의 7번 인덱스부터 0번 인덱스를 s1에 넣으므로, 즉 역순으로 넣은 결과이므로 s는 7d1c4b0a이다.
a ⊕ b = c일 때
XOR 연산은 a = b ⊕ c, b = a ⊕ c의 성질을 갖는다.
따라서 random_num,input가 있을 때
0x7d1c4b0a = random_num ⊕ input이므로
random_num과 0x7d1c4b0a는 알고있으므로
input = 0x7d1c4b0a ⊕ random_num 으로 구할 수 있다.
from pwn import *
p = remote('host1.dreamhack.games', 21598)
s1=b'a0b4c1d7'
s=''
#random_num=0xa17e3d2e
for i in reversed(range(len(s1))):
s+=chr(s1[i])
# random_num ^ inputs = 7d1c4b0a
# inputs = random_num ^ 0x7d1c4b0a , random_num = inputs ^ 0x7d1c4b0a
p.recvuntil(b'Random number: ')
random_num = int(p.recv(10),16)
log.info(f'random_num: {random_num}')
inputs = random_num ^ int(s,16)
log.info(f'input: {inputs}')

random_num을 가져와서 inputs를 구해보면 위와 같으며,

계산기로 구해보면 s가 나오는걸 알 수 있다.
from pwn import *
p = remote('host1.dreamhack.games', 21598)
s1=b'a0b4c1d7'
s=''
#random_num=0xa17e3d2e
for i in reversed(range(len(s1))):
s+=chr(s1[i])
# random_num ^ inputs = 7d1c4b0a
# inputs = random_num ^ 0x7d1c4b0a , random_num = inputs ^ 0x7d1c4b0a
p.recvuntil(b'Random number: ')
random_num = int(p.recv(10),16)
log.info(f'random_num: {random_num}')
inputs = random_num ^ int(s,16)
log.info(f'input: {inputs}')
p.sendafter(b'Input? ', str(inputs))
p.interactive()

| Dreamhack CTF Season 7 Round #6 (🌱Div2) flag printer write up (0) | 2025.03.30 |
|---|---|
| [Dreamhack] rev-basic-2 (0) | 2021.03.15 |
| [Dreamhack] rev-basic-1 (0) | 2021.03.15 |
| [Dreamhack] rev-basic-0 (0) | 2021.03.15 |