콘텐츠로 건너뛰기

simple-operation

Description

우리의 친구 아모가 미션을 주었습니다. "내가 원하는 결과가 나오도록 값을 입력해 줘!"

주어진 바이너리를 분석하고 알맞은 값을 입력하면 플래그가 출력됩니다. 플래그는 flag 파일에 있습니다.

플래그 형식은 DH{…} 입니다.


문제 파일을 받아보면 chall 실행파일과 flag 파일이 주어진다.

main 함수

int __cdecl main(int argc, const char **argv, const char **envp)
{
  char s1[9]; // [rsp+6h] [rbp-3Ah] BYREF
  char s[9]; // [rsp+Fh] [rbp-31h] BYREF
  unsigned int v6; // [rsp+18h] [rbp-28h] BYREF
  unsigned int v7; // [rsp+1Ch] [rbp-24h] BYREF
  char *s2; // [rsp+20h] [rbp-20h]
  int fd; // [rsp+2Ch] [rbp-14h]
  void *buf; // [rsp+30h] [rbp-10h]
  unsigned int v11; // [rsp+38h] [rbp-8h]
  int i; // [rsp+3Ch] [rbp-4h]

  v7 = 0;
  v6 = 0;
  v11 = 0;
  initialize(argc, argv, envp);
  buf = malloc(0x45uLL);
  fd = open("./flag", 0);
  read(fd, buf, 0x45uLL);
  close(fd);
  get_rand_num(&v6);
  printf("Random number: %#x\n", v6);
  printf("Input? ");
  __isoc99_scanf("%d", &v7);
  v11 = v6 ^ v7;
  snprintf(s, 9uLL, "%08x", v6 ^ v7);
  for ( i = 0; i <= 7; ++i )
    s1[i] = s[7 - i];
  printf("Result: %s\n", s1);
  s2 = "a0b4c1d7";
  if ( !strcmp(s1, "a0b4c1d7") )
  {
    puts("Congrats!");
    puts((const char *)buf);
  }
  else
  {
    puts("Try again");
  }
  return 0;
}

먼저 random number를 생성해서 16진수로 다음과 같이 수를 출력한다.
Random number: 0xXXXXXXXX

그리고 사용자로부터 10진수 형식으로 수를 입력받는다.
10진수 형식으로 입력받은 수는 random number와 XOR 연산하고,
연산한 값을 16진수로 변환하여 문자열 형식으로 s 배열에 저장한다.

마지막으로 s1배열에 s 배열에 있는 문자를 역순으로 하나씩 저장하는걸 8번 반복해서
s1배열에 a0b4c1d7 문자열이 담겨있는지 비교한다.

ubuntu@wh1te4ever-main:~/Desktop/simple-operation$ ./chall
Random number: 0xdd717d7e
Input? 12345678
Result: 03c1dcdd
Try again
ubuntu@wh1te4ever-main:~/Desktop/simple-operation$ python3
Python 3.10.6 (main, May 29 2023, 11:10:38) [GCC 11.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> hex(0xdd717d7e ^ 12345678)
'0xddcd1c30' #역순으로 Result 출력됨

풀이

a0b4c1d7 문자열을 역순으로 배열시키고
그 수를 random number와 XOR 시킨 수를 10진수로 입력하면 해결된다.

0x7d1c4b0a ^ (random number)

from pwn import *
import re

corrected_str = "a0b4c1d7"
converted_str = int("0x" + corrected_str[::-1], 16) #0x7d1c4b0a

context.log_level = 'debug'

p = remote("host3.dreamhack.games", 20312)
data = p.recvuntil('Input? ') #data = b'Random number: 0xXXXXXXXX\nInput? '
random_num = re.search(': (.+?)\n', data.decode('utf-8')).group(1)
print("Random Number:", random_num)

input_num = int(random_num, 16) ^ converted_str

p.sendline(str(input_num))
p.recvall()
myMac@MacBook-Pro Desktop % python3 str.py
[+] Opening connection to host3.dreamhack.games on port 20312: Done
[DEBUG] Received 0x1a bytes:
    b'Random number: 0xff5f6dbe\n'
[DEBUG] Received 0x7 bytes:
    b'Input? '
Random Number: 0xff5f6dbe
[DEBUG] Sent 0xb bytes:
    b'2185438900\n'
[+] Receiving all data: Done (96B)
[DEBUG] Received 0x11 bytes:
    b'Result: a0b4c1d7\n'
[DEBUG] Received 0x4f bytes:
    b'Congrats!\n'
    b'DH{cc0017076ad93f32c8aaa21bea38af5588d95d2cdc9cf48760381cc84df4668e}\n'
[*] Closed connection to host3.dreamhack.games port 20312
태그:

답글 남기기