[HackCTF] :pwn: g++pwn

두비니

·

2021. 3. 17. 01:25

 

 

 

 

 

 

 

보면 바로 알수있다시피 c++인걸 대충 어림짐작할 수 있습니다.

 

 

 

vuln안을 봅시다

 

 

 

c++을 아이다로 처음 봤으면 조금 당황스러워할 수도 있는데, 놀라진 마시고 그냥 큰 줄기만 보시면 됩니다.

 

1. fgets로 s에 입력받음

2. replace(사용자지정)함수로 선서대로 v4, input, v7을 넣음

2.1. input은 1번에서 입력한 s의 값이 들어가있고, v7은 "I"라는 값이 들어가있음

3. v1의 값이 s로 복사됨

3.1. v1의 값은 input의 값임

 

결국 뭔가 replace함수로 입력값을 바꾼 뒤 s를 출력시키는 걸 확인할 수 있습니다.

replace함수를 봅시다.

 

 

std::string *__stdcall replace(std::string *a1, std::string *a2, std::string *a3)
{
  int v4; // [esp+Ch] [ebp-4Ch]
  char v5; // [esp+10h] [ebp-48h]
  char v6; // [esp+14h] [ebp-44h]
  char v7; // [esp+1Bh] [ebp-3Dh]
  int v8; // [esp+1Ch] [ebp-3Ch]
  char v9; // [esp+20h] [ebp-38h]
  int v10; // [esp+24h] [ebp-34h]
  int v11; // [esp+28h] [ebp-30h]
  char v12; // [esp+2Fh] [ebp-29h]
  int v13; // [esp+30h] [ebp-28h]
  int v14; // [esp+34h] [ebp-24h]
  char v15; // [esp+38h] [ebp-20h]
  int v16; // [esp+3Ch] [ebp-1Ch]
  char v17; // [esp+40h] [ebp-18h]
  int v18; // [esp+44h] [ebp-14h]
  char v19; // [esp+48h] [ebp-10h]
  char v20; // [esp+4Ch] [ebp-Ch]

  while ( std::string::find(a2, a3, 0) != -1 )
  {
    std::allocator<char>::allocator(&v7);
    v8 = std::string::find(a2, a3, 0);
    std::string::begin((std::string *)&v9);
    __gnu_cxx::__normal_iterator<char *,std::string>::operator+(&v10);
    std::string::begin((std::string *)&v11);
    std::string::string<__gnu_cxx::__normal_iterator<char *,std::string>>(&v6, v11, v10, &v7);
    std::allocator<char>::~allocator(&v7);
    std::allocator<char>::allocator(&v12);
    std::string::end((std::string *)&v13);
    v14 = std::string::length(a3);
    v16 = std::string::find(a2, a3, 0);
    std::string::begin((std::string *)&v17);
    __gnu_cxx::__normal_iterator<char *,std::string>::operator+(&v15);
    __gnu_cxx::__normal_iterator<char *,std::string>::operator+(&v18);
    std::string::string<__gnu_cxx::__normal_iterator<char *,std::string>>(&v5, v18, v13, &v12);
    std::allocator<char>::~allocator(&v12);
    std::operator+<char,std::char_traits<char>,std::allocator<char>>((std::string *)&v20);
    std::operator+<char,std::char_traits<char>,std::allocator<char>>((std::string *)&v19);
    std::string::operator=(a2, &v19, &v5, v4);
    std::string::~string((std::string *)&v19);
    std::string::~string((std::string *)&v20);
    std::string::~string((std::string *)&v5);
    std::string::~string((std::string *)&v6);
  }
  std::string::string(a1, a2);
  return a1;
}

 

어...솔직히 모든 코드를 잘 보진 않았고, a2와 a3에 각각 input과 "I"문자열이 들어갔는데, 거기서 I를 찾아서 무언가 실행하는 것을 보고 직접 확인했습니다.

 

 

I가 you로 바뀌는걸로 바뀌는걸 확인했습니다.

따라서 offset을 이 부분을 고려해서 계산하면 될 것 같습니다.

 

 

쓸 수 있는 함수도 줘서 사용하도록 하겠습니다

 

 

 

ㅇㅈ!

'War Games > HackCTF' 카테고리의 다른 글

[HackCTF] :pwn: 1996  (0) 2021.03.19
[HackCTF] :pwn: poet  (0) 2021.03.18
[HackCTF] :pwn: RTL_World  (0) 2021.03.15
[HackCTF] :web: 보물  (0) 2021.03.14
[HackCTF] :web: /, Hidden, Button (All 50 pts)  (0) 2021.03.13