Description

Category: Reversing/Binary

Source: Pragyan CTF 19

Points: 150

Author: Jisoon Park(js00n.park)

Description:

Can you cook the most delicious recipe?

nc 159.89.166.12 9800

challenge1

Write-up

main() 함수를 보면 임의로 생성된 세 숫자를 보여주고 '-' 또는 숫자로만 구성된 입력을 받는데, 길이제한 없이 "%s"로 받아서 bof 가 가능한 형태이다.

[...]

  char s[10]; // [rsp+32h] [rbp-6Eh]
  char nptr; // [rsp+3Ch] [rbp-64h]
  char v15; // [rsp+46h] [rbp-5Ah]

  [...]

  __isoc99_scanf("%s", s);
  for ( i = 0; i < strlen(s); ++i )
  {
    if ( (s[i] <= 0x2F || s[i] > 0x39) && s[i] != 45 )// '-' and numbers only
    {
      puts("Invalid input :( ");
      return 0;
    }
  }
  v9 = atoi(s);
  v10 = atoi(&nptr);
  v11 = atoi(&v15);
  if ( v6 == v9 + v10 )
  {
    if ( v7 == v10 + v11 )
    {
      if ( v8 == v11 + v9 )
      {
        stream = fopen("flag.txt", "r");
        if ( !stream )
        {
          fwrite("\nflag.txt doesn't exist.\n", 1uLL, 0x19uLL, stderr);
          exit(0);
        }
        fgets(&v16, 50, stream);
        printf("That's yummy.... Here is your gift:\n%s", &v16);

[...]

bof로 값을 덮어쓸 수 있는 변수는 s, nptr, v15 세 가지로, 각각 10 byte의 크기를 갖는다. (그 이후는 의미가 없거나 canary가 있다.)

값을 마음대로 줄 수 있는 세 변수에 대해 atoi()를 수행하고, 그 값을 이용한 if 조건문을 통과하면 간단히 flag를 준다.

if 조건문 세가지는 처음에 알려준 v6, v7, v8에 대한 것으로, 손으로도 쉽게 풀 수 있다.

한 가지 생각해야 하는건 '-'와 숫자만 입력받기 때문에, 앞을 0으로 채워서 길이를 맞춰줘야 한다.

간단히 방정식을 해결하고 payload를 구성하여 전송하는 exploit을 만들어서 flag를 얻었다.

Flag : pctf{p1zz4_t0pp3d_w1th_p1n34ppl3_s4uc3}

'writeups > Reversing' 카테고리의 다른 글

ELF Crumble  (0) 2019.11.26
Super Secure Vault  (0) 2019.11.26
Snakes over cheese  (0) 2019.11.25
Secrets  (0) 2019.11.25
Local News  (0) 2019.11.25

+ Recent posts