상세 컨텐츠

본문 제목

[Dreamhack] simple-operation (REVERSING)

REVERSING/Dreamhack

by koharin 2025. 4. 30. 16:24

본문

728x90
반응형
  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()

728x90
반응형

'REVERSING > Dreamhack' 카테고리의 다른 글

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

관련글 더보기