반응형

IDA로 우선까보자

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;
}

 

1. get_rand_num()에 의해 난수를 생성하고 생성된 난수를 16진수로 출력

2. Input? 이후에 사용자에게 입력받음

3. 입력받은 정수를 난수와 XOR연산을 수행한다.

4. 결과를 8자리 16진수형태의 문자열로 변환하여 저장

5. 저장한 문자열을 역순으로 읽고, a0b4c1d7과 비교한다.

 

 

cf.

argc: 명령줄에 전달된 인자의 갯수(임수 값을 가지지 않음)

argv: 인자의 내용이 저장되는 포인터형 배열

envp: 인자 값 중 환경변수 값이 들어가는 포인터형 배열

-예시-

code

#include <stdio.h>

int main(int argc, char *argv[]) {
    printf("%d\n", argc);
    printf("%s\n", argv[0]);
    printf("%s\n", argv[1]);
    return 0;
}

 

 

 

exploit code

from pwn import *

context.log_level = "DEBUG"
p = remote("host3.dreamhack.games", 10336)

p.recvuntil("number: ")

rand_num = p.recvn(10)
rand_num = int(rand_num, 16)  ^ 0x7d1c4b0a
rand_num = str(rand_num)

p.sendlineafter("Input? ", rand_num)

p.interactive()

반응형

'wargame' 카테고리의 다른 글

likeb64  (0) 2024.03.15
bypassIF  (0) 2024.03.10
Broken Buffalo Wings  (0) 2023.09.10
LoS - zombie assassin  (0) 2023.08.27
phpreg  (0) 2023.08.27

+ Recent posts